今回はPythonを使って日本株のデータを取得、グラフ表示をする簡単なプログラムを紹介します。
投資についてはずぶの素人で色々な本を読んでいると、「こういう形のチャートを探して…」という風な話が多いという印象を受けました。
とはいえ会社はたくさんあるので、一つ一つチャートを見ていくのは大変です。
ここら辺をPythonプログラムを使って効率化できたらいいのでは、と思い色々と調べているという感じです。
いくつか選択肢はあるみたいですが、investpy
ライブラリを使うのがよさそうです。
https://investpy.readthedocs.io/_info/introduction.html
冒頭分を引用します。
investpy is a Python package to retrieve data from Investing.com, which provides data retrieval from up to 39952 stocks, 82221 funds, 11403 ETFs, 2029 currency crosses, 7797 indices, 688 bonds, 66 commodities, 250 certificates, and 4697 cryptocurrencies.
investpy allows the user to download both recent and historical data from all the financial products indexed at Investing.com. It includes data from all over the world, from countries such as United States, France, India, Spain, Russia, or Germany, amongst many others.
investpy seeks to be one of the most complete Python packages when it comes to financial data extraction to stop relying on public/private APIs since investpy is FREE and has NO LIMITATIONS. These are some of the features that currently lead investpy to be one of the most consistent packages when it comes to financial data retrieval.
英語に関してもずぶの素人の私ですが、とりあえず無料で制限なしということは理解できました。
まだ試してないですが、探索系のプログラムを組む際に、約に立ちそうですね。
さっそくinvestpy
の使い方を見ていきましょう。
まずはpip installです。
pip install investpy
直近の株価を取得するには以下のようにします。
題材として任天堂(7974)を使います。
import investpy
import pandas as pd
# 直近のデータ
df = investpy.get_stock_recent_data(
stock='7974',
country='japan'
)
print(df)
>>>
Open High Low Close Volume Currency
Date
2021-09-21 51840.0 53020.0 51830.0 52660.0 652400 JPY
2021-09-22 53120.0 53770.0 53000.0 53240.0 825800 JPY
2021-09-24 54000.0 54500.0 53620.0 53800.0 800700 JPY
2021-09-27 54280.0 54820.0 54110.0 54180.0 727700 JPY
2021-09-28 53820.0 53870.0 52660.0 53430.0 893300 JPY
....
2021-10-15 51460.0 51690.0 50900.0 51530.0 742500 JPY
2021-10-18 51520.0 51890.0 51030.0 51260.0 575100 JPY
2021-10-19 51620.0 52590.0 51620.0 52350.0 627300 JPY
2021-10-20 51430.0 51600.0 49770.0 50300.0 1364100 JPY
2021-10-21 49690.0 50650.0 49370.0 50060.0 776100 JPY
一カ月分が表示されるみたいです
df = investpy.get_stock_historical_data(stock='7974',
country='japan',
from_date='01/01/2020',
to_date='01/01/2021')
print(df)
>>>
Open High Low Close Volume Currency
Date
2020-01-06 43010.0 43090.0 42510.0 42740.0 1154600 JPY
2020-01-07 43040.0 43500.0 42890.0 42940.0 1167600 JPY
2020-01-08 42500.0 42840.0 41610.0 42640.0 1484400 JPY
2020-01-09 43550.0 43600.0 43160.0 43380.0 1030800 JPY
2020-01-10 43220.0 43780.0 43140.0 43440.0 826300 JPY
... ... ... ... ... ... ...
2020-12-24 64870.0 64870.0 64010.0 64730.0 606100 JPY
2020-12-25 64750.0 65090.0 64330.0 64670.0 520000 JPY
2020-12-28 64920.0 66150.0 64670.0 65880.0 1189300 JPY
2020-12-29 66290.0 66630.0 65560.0 65860.0 898600 JPY
2020-12-30 65560.0 66580.0 65460.0 65830.0 784700 JPY
和名は対応していないみたいですが、会社名から検索したりもできます。
使いみちがあるかはよく分かりません。
search_result = investpy.search_quotes(text='nintendo', products=['stocks'],
countries=['japan'], n_results=1)
print(search_result)
>>>
{"id_": 946265, "name": "Nintendo Co Ltd", "symbol": "7974", "country": "japan",
"tag": "/equities/nintendo-ltd", "pair_type": "stocks", "exchange": "Tokyo"}
検索結果から、直近データや時系列データを取得することができます。
search_result = investpy.search_quotes(text='nintendo', products=['stocks'],
countries=['japan'], n_results=1)
recent_data = search_result.retrieve_recent_data()
historical_data = search_result.retrieve_historical_data(from_date='01/01/2019', to_date='01/01/2020')
その他詳細は公式ページにて
https://investpy.readthedocs.io/_info/usage.html
株価のデータが取得できたので次はグラフ化していきましょう。
今回はmatplotlibベースのmplfinaceを使っていきます。
pip install mplfinance
2021/4/1~2021/10/1を表示期間とします。
import mplfinance as mpf
import pandas as pd
import investpy
df = investpy.get_stock_historical_data(stock='7974',
country='japan',
from_date='01/04/2020',
to_date='01/10/2021')
mpf.plot(df)
ちょっと見た目がやぼったいですね、引数を指定していくと、グラフをカスタマイズできます。
次は出来高を表示して、スタイルを当てる例です。
mpf.plot(df, volume=True, style='charles')
移動平均線を追加するには以下のようにします。
# 5日、25日、75日移動平均線の表示
mpf.plot(df, volume=True, style='yahoo', mav=(5, 25, 75))
週足、月足で見るときは元データを変換してグラフにします。
このあたりは地道に計算すると大変ですが、pandasが得意としている分野ですね。
以下のようにresampleメソッドを使うと簡単です。
df = investpy.get_stock_historical_data(stock='7974',
country='japan',
from_date='01/01/2019',
to_date='01/01/2021')
d_ohlcv = {'Open': 'first',
'High': 'max',
'Low': 'min',
'Close': 'last',
'Volume': 'sum'}
# 週足
df_w = df.resample('W-MON', closed='left', label='left').agg(d_ohlcv)
mpf.plot(df_w, style='charles', volume=True, )
# 月足
df_m = df.resample('MS', closed='left', label='left').agg(d_ohlcv)
mpf.plot(df_m, style='charles', type='candle', volume=True, )
今回は2019年から2021年と少し期間を長くとってみました。
月足チャートはローソク足タイプに指定しています。
複数のグラフを見比べる機会もあると思うので、使い方を確認しておきます。
matplotlibの複数グラフの作り方とおおむね同じです。
以下のようにします。
def get_historical_data(stock_code):
return investpy.get_stock_historical_data(stock=stock_code,
country='japan',
from_date='01/04/2021',
to_date='01/10/2021')
fig = mpf.figure(style='yahoo', figsize=(12, 8))
ax1 = fig.add_subplot(2, 3, 1)
ax2 = fig.add_subplot(2, 3, 2)
ax3 = fig.add_subplot(2, 3, 3)
av1 = fig.add_subplot(3, 3, 7, sharex=ax1)
av2 = fig.add_subplot(3, 3, 8, sharex=ax1)
av3 = fig.add_subplot(3, 3, 9, sharex=ax3)
nintendo = get_historical_data('7974')
sony = get_historical_data('6758')
softbank = get_historical_data('9984')
mpf.plot(nintendo, type='candle', ax=ax1, volume=av1, mav=(5, 25, 75), axtitle='Nintendo')
mpf.plot(sony, type='candle', ax=ax2, volume=av2, mav=(10, 20), axtitle='Sony')
mpf.plot(softbank, type='candle', ax=ax3, volume=av3, mav=(10, 20), axtitle='Softbank')
mpf.show()
matplotlibベースのmplfinanceを紹介してきましたが、finplot
という良い感じのライブラリもあるみたいです。
pip install finplot
import finplot as fplt
import pandas as pd
import investpy
df = investpy.get_stock_historical_data(stock='7974',
country='japan',
from_date='01/01/2019',
to_date='01/01/2021')
fplt.candlestick_ochl(df[['Open', 'Close', 'High', 'Low']])
fplt.show()
カーソルを当てると詳細が確認できたりします。
githubページ
https://github.com/highfestiva/finplot
参考までに。