(python3)前日の株価チャートをLINE通知
掲載日:
こんにちは、ペタバイトです!2024年を迎えましたが、皆様の今年の目標は決まりましたでしょうか?私の目標は、「毎朝5時に起き、仕事までの時間を自己研鑽に充てる!」です。まだ2024年は1ヶ月ぐらいしか経過していませんが、継続できるよう頑張ります!
自己紹介したときに話ていた趣味の1つにプログラミングがありまして、最近python3で遊んでいます^^
まだまだ初心者レベルなので、とりあえず色んなライブラリを触ってみてますが、みなさんはどういった勉強してますかね?ぜひ教えてください!
それと、最近友達が株に興味があるようで、いつも株価のチャートを眺めているので株の情報を取り出せるソフトを作りたいなーと計画しています笑
なのでその手始めとして、「python3で前日の株価チャートを取得しLINEで通知する」
というのをやってみましたので、そのコードの紹介をしたいと思います!
概要
まず、どういった手順を踏んでいくかと言うと、
- 指定した株の情報を入手し、欲しい情報を抜き出す
- 抜き出した情報を描画し、画像として保存する
- 画像をサーバーにアップロードする
- LINEの公式アカウントをフォローしてる人全員に送る
の流れになります。
こんな感じの画像を作成して、公式LINEで送信できればクリアです。
今回使ったライブラリ
今回使ったライブラリを紹介します。
- yfinance
- matplotlib
- subprocess
- requests
を使いました。
使用する前に、これらのライブラリを事前にインストールしておく必要があります。サードパッケージライブラリはPyPIというサイトでインストール方法を確認できます。
pip3 install ライブラリ名
必要ならsudoを先頭に付けてください。
バージョン一覧
- python3 : 3.9.2
- yfinance : 0.2.35
- matplotlib : 3.8.2
- requests : 2.31.0
実行環境はdebian11です。
コードの解説
それでは、実際のコードを紹介します。
まずは、必要になるライブラリをimportします
import yfinance as yf
import matplotlib.pyplot as plt
import subprocess
import requests
import yfinance as yf の as から後ろ部分で別名を付けています。
<指定した株の情報を入手し、欲しい情報を抜き出す>
次に、知りたい株価チャートの銘柄コードを入力します。銘柄コードはYahooファイナンスで知りたい銘柄を検索すれば出てきます。今回は例としてマイクロソフトの株価チャートを取得します。
msft = yf.Ticker("MSFT") # 引数に銘柄コード
msft_history = msft.history(period="1d",interval="1m") # periodに期間、intervalにデータ取得間隔
この2行でマイクロソフトの前日の株価情報を1分単位で取得しています。
msft.history() の引数には、 period , interval を指定しています。
引数 period は "1d” , “5d” , “1mo” , “3mo” , “6mo” , “1y” , “2y” , “5y” , “10y” , “ytd” , “max”
interval は “1m” , “2m” , “5m” , “15m” , “30m” , “60m” , “90m” , “1h” , “1d” , “5d” , “1wk” , “1mo” , “3mo” といった設定が可能です。
それぞれの単位ですが、 d は日、 mo は月、 y は年、 m は分、 h は時間、 wk は週を表しています。 ytd は 1/1 から現在までの期間を指定します。
引数 interval を "1m" で設定するには、取得したい期間を7日以内にする必要があるようです。
こちらを参考にしました。それぞれの引数についても載っています。
yfinanceの参考リンク<抽出した情報を描画し、画像として保存する>
まず描画するために、横軸に設定する日付を str型に統一します。
indexs = [] # 入れ替え用のリスト
for i in range(len(msft_history.index)):
indexs.append(str(msft_history.index.time[i])) # i 番目の時刻を取得
yesterday = msft_history.index.date[0] # 株価情報の日付を取得
msft_history.reset_index(drop=True,inplace=True) # index を削除
msft_history['Datetime'] = indexs # 'Datetime' 列に indexs を追加
msft_history.set_index('Datetime',inplace=True) # 'Datetime' 列を index に指定
msft_history は pandas の DataFrame型で、 index が指定されています。元々の index を削除し、時刻を str型にしたリストを index として設定しています。
そして描画に必要な設定をしていきます
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.plot(msft_history.index,msft_history['Close'])
ax.set_title(f'{yesterday} MSFT stock chart')
xticks = [msft_history.index[i] for i in range(0,361,60)]
ax.set_xticks(xticks)
plt.xlabel('time')
plt.ylabel('value')
plt.show() # テスト用
これで横軸に時刻、縦軸に株価となるグラフが描画できました。
グラフの確認ができたらテスト用の
# plt.show()
はこのようにコメントアウトし、画像を保存する1行を追加しましょう。
plt.savefig(f'{yesterday}.png')
<画像をサーバーにアップロードする>
後に使うLINE Messaging APIでは画像の送信のためのパス指定を、httpsで指定する必要があるので自分が借りているサーバーに画像をアップロードしていきます。google drive などでもできるようです。
画像をサーバーにアップロードするためにsubprocess.call()を使っています。プログラムの実行環境がdebianですので、scpコマンドを使っています。それぞれの環境に合わせて変更する必要があります。
subprocess.call(f"scp ./{yesterday}.png [サーバーのパス]",shell=True)
<LINEの公式アカウントをフォローしてる人全員に送る>
最後にLINEの公式アカウントをフォローしてる人全員に送ります。そのためにLINEの公式アカウントを作成し、チャンネルアクセストークンを入手します。
まず、LINE developerの公式サイトからコンソールにログインします。
ログインできたら、プロバイダーの作成ボタンを押します。
プロバイダーの名前の入力、MessagingAPIの選択、必要な情報を入力して新規チャネルを作成します。
そしたら、チャネルのMessagingAPI設定からチャンネルアクセストークンを発行します。
このチャネルアクセストークンをコードに追加します。
CHANNEL_ACCESS_TOKEN = "チャネルアクセストークンをここに追加"
ここからは、LINE Messaging APIのドキュメントを参考に作成しました。今回作成した公式LINEアカウントからフォローしている人全員にメッセージを送信します。
BROADCAST_URL = 'https://api.line.me/v2/bot/message/broadcast'
ブロードキャストメッセージを送信するには、リクエストヘッダーに
Content-Type application/json
Authorization Bearer {channel access token}
リクエストボディに
messages(メッセージオブジェクトの配列)
が必須になります。それらの項目を埋めると以下のようになります。
適宜、サーバーのパスを修正する必要があります。
headers = {'Content-Type':'application/json','Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN}
text_message = {"type":"text","text":str(yesterday) + 'の株価チャートです'}
image_message = {"type":"image","originalContentUrl": "サーバーのパス"}
payload = {'messages': [text_message,image_message]}
最後にrequestsライブラリのPOSTでAPIを叩いてみましょう。
response = requests.post(BROADCAST_URL,json=payload,headers=headers)
すると無事、公式LINEからテキストと前日の株価チャートの画像が送られてきました。
まとめ
今回は、「python3で前日の株価チャートを取得しLINEで通知する」をやってみました!
使い方次第では、買った複数の銘柄のチャート一覧とかをまとめて送信できたり、
色々活用できそうです。
そのうち、株価のチャートの予測とかもやってみたいですね!
参考
yfinanceLINE Messaging API公式ドキュメント