(python3)前日の株価チャートをLINE通知

掲載日:

こんにちは、ペタバイトです!2024年を迎えましたが、皆様の今年の目標は決まりましたでしょうか?私の目標は、「毎朝5時に起き、仕事までの時間を自己研鑽に充てる!」です。まだ2024年は1ヶ月ぐらいしか経過していませんが、継続できるよう頑張ります!

自己紹介したときに話ていた趣味の1つにプログラミングがありまして、最近python3で遊んでいます^^
まだまだ初心者レベルなので、とりあえず色んなライブラリを触ってみてますが、みなさんはどういった勉強してますかね?ぜひ教えてください!
それと、最近友達が株に興味があるようで、いつも株価のチャートを眺めているので株の情報を取り出せるソフトを作りたいなーと計画しています笑
なのでその手始めとして、「python3で前日の株価チャートを取得しLINEで通知する」
というのをやってみましたので、そのコードの紹介をしたいと思います!

概要

まず、どういった手順を踏んでいくかと言うと、

  1. 指定した株の情報を入手し、欲しい情報を抜き出す
  2. 抜き出した情報を描画し、画像として保存する
  3. 画像をサーバーにアップロードする
  4. LINEの公式アカウントをフォローしてる人全員に送る

の流れになります。

こんな感じの画像を作成して、公式LINEで送信できればクリアです。

株価チャートの画像 公式ラインのメッセージ

今回使ったライブラリ

今回使ったライブラリを紹介します。

  1. yfinance
  2. matplotlib
  3. subprocess
  4. requests

を使いました。

使用する前に、これらのライブラリを事前にインストールしておく必要があります。サードパッケージライブラリはPyPIというサイトでインストール方法を確認できます。

pip3 install ライブラリ名

必要ならsudoを先頭に付けてください。

バージョン一覧

実行環境は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の選択

そしたら、チャネルの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で通知する」をやってみました!
使い方次第では、買った複数の銘柄のチャート一覧とかをまとめて送信できたり、 色々活用できそうです。
そのうち、株価のチャートの予測とかもやってみたいですね!

参考

yfinance
LINE Messaging API公式ドキュメント