Python×APIを活用して株価を取得してみた

目次

はじめに

今回は、PythonでAPIを使用して株価の取得をしてみました。簡単なグラフの生成までやってみましたので、一連の流れをまとめてみます。


ライブラリの準備を行う

はじめに、ライブラリの準備を行います。今回は、yahoo、fred からデータを取得するため、以下のようなライブラリのインストールのコードになります。
sample code
import pandas as pd     # データ処理用ライブラり
import os              # フォルダを作成したりするのに活用するライブラリ  
import yfinance as yf   # Yahoo Financeデータ取得用ライブラリ
from fredapi import Fred  # FRED API操作用ライブラリ
yahoo,fred専用のライブラリが存在するため、それらのライブラリを使用することが必要となります。

参照URL 


前提条件の整理

yfinance側 の前提条件の設定

sample code
# –yahooからデータ取得情報の設定——————————————
# 取得したい株価のティッカーと期間を指定(例: S&P 500指数(^GSPC))
ticker =‘^N225’
start_date =‘2000-01-01’
end_date =‘2025-04-30’
# ——————————————————————————
# Yahoo Financeから株価データを取得(デフォルトで日次データ)
df_stock = yf.download(ticker, start=start_date, end=end_date)
ティッカーコード(銘柄コード)、開始時期、終了時期について定義を行っています。
赤字のyf.downloadについては、ライブラリyfinanceによる関数です。
実行結果として、以下のようになり問題なく実行されていますね。

FRED の前提条件

sample code
# –FREDからデータ取得情報に設定——————————————-
# FRED APIキーを設定
fred_api_key = 個人のAPIキー‘ 👈重要!忘れると実行することができない。
fred = Fred(api_key=fred_api_key)
# 取得する経済指標シリーズIDをリストを定義する、リストの名称はseries_ids
series_ids = [‘CBBTCUSD’, ‘CPIAUCSL’, ‘FEDFUNDS’, ‘DGS10’, ‘DEXJPUS’]
# 取得したい期間を指定
start_date = ‘2020-01-01’
end_date = ‘2023-12-31’
# ——————————————————————————-
# ★★★取得結果を格納する箱の作成
fred_data = {}

# ★★重要ループ処理の実行—————————————————

for series in series_ids:
    data = fred.get_series(series, observation_start=start_date, observation_end=end_date)
    # PandasのDataFrameに変換し、列名をシリーズIDに設定
    df = data.to_frame().reset_index()
    df.columns = [‘Date’, series]
    # 辞書に保存
    fred_data[series] = df
実行結果は、以下の通りです。今回の処理では特にループ処理が肝となっています。ループ処理については丁寧に解説してきます。

 

肝となる for 構文

今回は、FREDから複数の経済指標データを取得するため、Python の for ループ構文を用いた処理を行います。get 関数では、ティッカーコード、取得開始日、取得終了日を指定してデータを取得する必要があります。

以下は、そのループ処理の概要です。

 

今回は、ティッカーコード(銘柄コード)を順番に処理するため、リスト型を使用しています。これにより、各ティッカーコードをループ処理で順に取り出して扱うことができます。

sample code(ループ処理の部分のみ抜粋)
# 取得する経済指標シリーズIDをリストで定義
series_ids = [‘CBBTCUSD’, ‘CPIAUCSL’, ‘FEDFUNDS’, ‘DGS10’, ‘DEXJPUS’]
for series in series_ids:
 print(series)
また、for文直下にget関数を使用することでfor文と組み合わせたget関数を使用することができます。

ちなみに、

以下記事にて様々なfor文の例も記載しています。

 

その他の処理

data.to_frame()というコードもfor文直下に存在するかと思います。こちらは、index型をDataFrame へ変換しているものになります。

複数の銘柄のデータを一括で取り扱うために行われる処理です。


CSVファイルへの保存

取得したデータをcsvデータとして保存します。そのためには、まずデータのカラムを整える作業が必要です。2STEPに分けて解説していきます。

データの前処理_yfinance

reset_index 関数

★:テーブル名.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill=”)
inplaceの上書きするか否かって、ところが頻出です。

Date indexを列へ変換することで、読み込みやすいデータとすることができます。

Date indexを列(Date)に戻す

df_stock.reset_index(inplace=True)

👇は、実行前と実行後の様子です。👈側は、実行前ですが、Dateがindexに含まれているため、列として表示したいです。そこで、reset_index関数を使用します。

reset_index関数を実行すると、indexはカラム(列)として変換されます。問題は、indexの定義ですよね。indexとは、行で行の横(つまり、カラム列データを持たないもののことです。)

rename 関数

★:テーブル名.rename(columns={‘元の列名’: ‘変更後の列名’}, inplace=True)

列名の空白を_に変換する

df_stock.rename(columns={Adj Close‘: ‘Adj_Close}, inplace=True)

このコードの意味としては、列名に空白が存在する場合、空白を_に置き換えるというものです。今回は、もともと列目に空白が存在しなかったので不要のコードとなっています。

Pandas × datetime

★:pd.to_datetime(’変換したい値の引数’, format=None, errors=’raise’, utc=False)
pd.to_datetime().変換希望の型 とすることで、指定の引数を希望の型へ変更できます。

データの型をdate型へ変更する

df_stock[‘Date’] = pd.to_datetime(df_stock[‘Date’]).dt.date

今回は、df_stock[‘Date’](df_stock という DataFrame の'Date' という 列(カラム)のことです。この通常、日付型はdatetime64[ns]で表記されるため、年月日までの表記となる.dt.dateへ変換します。なお、今回はコード実施前後において変化はないです。元データの日付データ(年月日)のためです。

 

データの前処理_FRED

.copy 関数

★:fred_data[シリーズID].関数()
⇒基本の型。fred_data(辞書の型)であり、シリーズ名の値を持つ。その中から、シリーズ名を選択し、関数を実行します。

指定のDateFrameのコピー

df_unrate = fred_data[‘CBBTCUSD’].copy()

ビットコインのデータフレームをコピーします。

 

その他にも例を挙げると

Pandas の.head 関数データの先頭から確認

fred_data[‘CPIAUCSL’].head(3)  # 先頭3行を表示

 

.describe 関数

fred_data[‘DEXJPUS’].describe()

数値列の要約統計量(平均・標準偏差・最小値・四分位数など)を出力します。

 

.tail 関数 データの末尾から確認

fred_data[‘DGS10’].tail()  # デフォルトは5行

 

Pandas × datetime

yfinaceでも行いましたが、FREDのデータ処理もこちらは行います。

指定の列を datetime.date型へ変形する

df_unrate[‘Date’]= pd.to_datetime(df_unrate[‘Date’]).dt.date

定義 = pd.to_datetime(対象の列).対象の型

yfinaceの時と同様に今回のデータ処理では、元データが日付の型(年月日)であるため、実行前後での変化はありません。

(Pandas × datetime)×for構文

上記の処理を複数の列に対して、実行したいです。その場合のコードについてです。

複数の Date列をdatetime.date型へ変換する

for series, df in fred_data.items():
df[‘Date’] = pd.to_datetime(df[‘Date’]).dt.date

 

今回fred_dataは辞書型であるため、fred_data.items()とすることでシリーズ名とDataFramemeを同時に扱うことができます。

正直イメージがつかない方が多いかもしれないですが、例で説明すると以下の通りです。

Step1:辞書型とは?

my_dict = {
‘A’: 1,
‘B’: 2
}

上記のように、A、Bのキーとその値を持つデータフレームとなっています。これらを辞書型といいます。

Step2:.itemsでキーと値を取得する

for key, value in my_dict.items():
print(f”key: {key}, value: {value}“)

上記のコードを実行すると、keyはA、B。valueは1、2であるため以下のような結果となる。

★出力結果

key: A, value: 1
key: B, value: 2

 

今回の場合で再度考えます。

データフレームをseriesへ代入する

for series, df in fred_data.items():
  df[‘Date’] = pd.to_datetime(df[‘Date’]).dt.date

fred_dataという辞書のキー(経済指標のシリーズID)をseriesに、値(=それぞれのDataFrame)をdfに代入する。ループ内では、各dfのDate列を日付型に変換して.dateオブジェクトにします。

CSVファイルで保存

保存先フォルダの決定と作成

保存先フォルダの決定、ないなら⇒自動作成

output_dir = ‘output_csv
os.makedirs(output_dir, exist_ok=True)

上記コードによって、自分でDLしたデータを格納するフォルダを生成する手間がなくなります。


output_csv
というDLしたデータの格納フォルダを生成します。
また、仮に
output_csv
というフォルダが存在しない場合、作成を行う必要があります。
その対応は、os.makedirs関数で行います。

os.makedirs(’変数名’, exist_ok=True)
変数名(フォルダ名)を作成します。また、, exist_ok=Trueを付加することですでにフォルダが存在してもエラーが発生しないようになります。

保存先フォルダへcsvファイルの保存

csvファイルとして保存

df_stock.to_csv(os.path.join(output_dir, ‘N225.csv’), index
=False, encoding=’utf-8-sig’)

df_stock は、Yahooファイナンスから取得した「日経平均株価のデータ」が入っている表(DataFrame)です。

.to_csv関数を使用することで、このデータをCSVファイルとして保存することができます。

csvとして保存するのは、いいですが保存先も指定できるとなおよいですよね。そこで使用するのが、os.path.join(...)関数です。この関数を使用することで、指定したデータを指定の保存先へ指定のファイル名で保存することができます。

データ(株価).to_csv(os.path.join(保存先, '保存するファイル名')

 

今回の場合は

df_stock.to_csv(os.path.join(output_dir, 'N225.csv')

df_stockデータをcsvデータとして、output_dir'N225.csv'のファイル名で保存をします。

また、

,index = False,encoding='utf-8-sig')

index = Falseとすることで、左端のインデックス番号はcsvとして吐き出さないようにします。

ループ処理で複数実行

経済指標データを1つずつCSVへ

for series, df in fred_data.items():
filename = f”{series}.csv”
filepath = os.path.join(output_dir, filename)
df.to_csv(filepath, index=False, encoding=‘utf-8-sig’)

上記の通り、fred_datekeyvalueに分けて、seriesへ代入します。

fred_dataという辞書に複数の経済指標データが存在しています。それらのデータのkey,値を抽出し、それぞれseriesdfへ代入し繰り返し処理を実行していきます。

 

また、最終的には以下のようにcsvファイルとして、指定のfilepathへ保存を行います。

df.to_csv(filepath, index=False, encoding='utf-8-sig')

おさらいで基本形は、以下の通りです。

データ(株価).to_csv(os.path.join(保存先, '保存するファイル名'),index = False,encoding='utf-8-sig')

今回の例では、(os.path.join(保存先, '保存するファイル名')の部分をfilepathと置き換えています。

そのため、事前に以下のようにfilepathを定義しています。

filepath = os.path.join(output_dir, filename)

そのため、filenameの定義も必要となりますよね。なので、filename はこのように定義するのです。

filename = f"{series}.csv"

ちなみに、上記のようにf”文字列 or {変数}”によって、文字列の中身や変数の式を埋め込めることができます。

まとめ

取得したデータで、添付のとおり出来高と価格推移のグラフを作成してみました。今回はPower BIを使用しています。Power BIの使い方やここからの分析については別記事で解説していきます。

今回は、FREDとyfinanceからデータを取得することをしました。基本構文を理解することが大事なので各パートの基本構文を理解するようにしてください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次