見出し画像

【コード配布】Pythonで指定した米国株の株価データを取得する方法

この投稿では、 ティッカーシンボルを指定した米国株(個別)や株価指数、ETF などの株価データを取得する Python コードを公開しておきます。
また、対象の銘柄がどういう株価推移をしているかをチャートにして表示する機能もつけておきました。


コードを実行したときの生成物の例をスクショして貼り付けておきます。
この例では、2019年12月から2021年1月下旬の

・Apple (個別株)
・Amazon (個別株)
・Facebook (個別株)
・VOO (ETF)
・SPYD (ETF)
・S&P500(^GSPC,株価指数)


のデータを取得してチャートにまとめました。

上は株価データのcsvファイル、下は株価チャートの画像ファイルです。

画像1

画像2

こんな感じで米国株の株価推移の比較を行いたいときに便利です。

株価データ取得はスクレイピングよりAPI利用がおすすめ

今回のコードでは、YahooファイナンスのAPIを利用して株価データを取得しています。
この方法には、 Yahoo ファイナンスの仕様が変わってしまうとコードが正常に動作しなくなるという欠点があります。
(これはどこの API を使用しても同じです)

他の方法としては、APIを介さずにどこかしらの株価データを持っているサーバーにリクエストを送ってhtmlタグからデータをスクレイピングする方法も考えられます。
しかしこちらはこちらで対象サービスの利用規約に抵触する恐れがある他、コードを書くのも大変ですし、どちらにせよそのサイトの仕様が変わってしまえばコードは正常に動かなくなります。

以上の理由により今回はPythonのpandas-datareaderを使用して Yahoo ファイナンスからデータを取得することにしました。

株価を取得できる対象

今回のPythonコードでは以下の株価データを取得可能です。

・個別の米国株
・ETF
・株価指数

コードの初めの方で欲しい銘柄のティッカーと株価推移を見たい期間を指定すればOKです。

なお、株価指数だけでなく米国の金利の推移データなども取得できるようです。

詳細については本家のヤフーファイナンスなどを参考にしていただければと思います。

プログラム実行までの準備

また今回のコードでは必要なモジュール等も最小限に抑えてあるので、Python初心者でも簡単に実行することができます。

手順は以下の通りです。

・Python のインストール
・必要ライブラリのインストール
・コードの中で欲しい銘柄のティッカーと時間を指定
・実行

以上です。

ちなみに必要なPythonライブラリは以下の3種類だけです。
どれもpipでインストールできるので簡単ですね。

・pandas
・matplotlib
・pandas-datareader

Pythonコード本体

さて肝心の Python コードです。

import pandas_datareader.data as web
import datetime as datetime
import matplotlib.pyplot as plt
import pandas as pd

#取得期間を指定
start=datetime.datetime(2019,12,1)
end =datetime.datetime(2021,1,28)

#欲しい銘柄のティッカーを指定
stockList=["AAPL","VOO","AMZN","FB","SPYD","^GSPC"]


#####data取得########

print("株価データをyahooファイナンスからダウンロードします。")
print("期間は "+str(start)+" 〜 "+str(end)+" です。")

df = web.DataReader(stockList,
                   'yahoo',
                   start=start,
                   end=end)

df.to_csv("raw-data.csv")
print("株価データ取得が完了しました。取得したデータは raw-data.csv に書き込んであります。")

######整形してプロット#####

print("株価推移をチャートにまとめます。")

#調整済み終値のみを残す
df = df.loc[:,["Adj Close"]]

pd.set_option("display.max_rows",None)

#リターンを計算
df=df/df.iloc[0]

#return の大きい順に並び替え
df=df.sort_values(df.index[-1],axis=1,ascending=False)

df.to_csv("ratio.csv")

fig, ax = plt.subplots(figsize=(7.8, 7.6))

#プロット
for i in df["Adj Close"].columns:
   ax.plot(df.index, df["Adj Close"][i], label=i)

ax.legend()

s = "@kimukouM,https://in-base.com"

ax_pos = ax.get_position()
fig.text(ax_pos.x1 - 0.3, ax_pos.y1 + 0.015, s)

plt.xticks(rotation=45)

plt.savefig("result.png")

print("完了しました。")

大体以下のようなことをやっています。

・指定された株価データを取得する
・とりあえず取得したものをそのまま CSV ファイルで保存する
・取得したデータの欲しい部分だけを綺麗に残す
・データをチャートにプロットして画像を保存する

※最終的に吐き出される株価チャートは、スタート地点の株価を1として相対化したものです。


ちなみにこのコードを改造して使いたい方に付言しておくとYahoo ファイナンスからデータを取得すると、データフレームのインデックスがマルチインデックスになっており多少戸惑うかもしれません(と言うか僕は戸惑いました)。

プログラムの利用に関する注意

最後にプログラムの利用に関する注意です。
このプログラムは商用・個人利用を問わず自由に使用していただいて構いません。
僕のブログ(https://in-base.com)へのリンクを貼って頂ければ、生成されたチャート画像などを自由にご自身のブログ等で公開していただいても問題ありません。

ただし、動作保証等はありません。
またこのプログラムで何か損害が生じたとしても特に責任を取ることはできませんのであしからず。

こちらもオススメ

【初心者向け】チャネル・ブレイクアウト戦略で仮想通貨を取引するPythonコード
Bybitでbitcoinの空売りスキャルピングbotを動かすPythonコード
将来性が期待されるIOSTのチャートとテクニカル指標をざっと眺めてみる


ご覧いただきありがとうございます! 少しでもサポートいただければモチベーションになります!