KJCfactory

雑多な記録

日経平均株価チャートを投稿するDiscord botを作った

要約

すぐに使いたい方は,本文をすっ飛ばして使いたい人がいれば......を見てください.本文も読んでくれるととても喜びます.

きっかけ

最近株にハマっています.興味がある友達をDiscordに集めて情報共有や自慢や自虐をしているのですが,せっかくDiscordを利用しているので,何か株に関するアプリがないか探してみました.しかし,特によさげなものがなかったので,もう自分で作ってしまえって感じです.Discordアプリも,Pythonも,GitHubもほとんど触ったことがなかったので,若干苦労しました.実装方法や構成をまとめてみます.

実装方法

Discordアプリの作成

まずはDiscord Developer Portalでアプリを作成しなければ何も始まりません.Botを作るのは初めてだったので,こちらの記事を参考にさせていただきました.

日経平均株価の取得

様々な方法で株価を取得することができますが,今回はyfinanceを利用しました.

チャートの描画

mplfinanceを利用しました.この記事がとても参考になりました.

コードが複雑になるので,n225mpf.pyというファイルに分割をしました.ここで問題になるのが,n225mpf.py内でmplfinance.plot()を呼び出した際にオプションsavefigを使って画像ファイルにすると毎回画像が保存されてちょっと邪魔です.そこで,ioをインポートしてbuffer = io.BytesIO()と定義し,savefig=bufferとし,return bufferとしてあげることで,返り値として画像のデータを直接返す関数にすることができました.

デフォルトではmplfinanceは日本語に対応していないので,SILオープンフォントライセンスのNoto Sans JPを同梱して,matplotlibのfont_managerでタイトルとy軸ラベルを日本語対応させています.

Discordへ投稿

15:25(yfinanceで取得できるデータが20分くらいタイムラグがあるので)に投稿するために,discord.extのtaskモジュールを利用しました.60秒に1回時刻をチェックして,15:25であれば実行するといった感じです.次の記事を参考にしました.

また,株式市場の営業日でないと取得したデータが空になってしまうので,jpholiday.is_holiday()とdatetime.weekday()を利用して土日祝のみ実行されるような処理にしています.

パッケージ構造

以下のようになりました.これで合っているのかは正直わかりませんが,まあ,大目に見てください.

discordn225chart
|-- LICENSE
|-- MANIFEST.in
|-- README.md
|-- __init__.py
|-- __main__.py
|-- fonts_and_licenses
|   |-- NotoSansJP-VariableFont_wght.ttf
|   |-- OFL.txt
|   `-- __init__.py
|-- requirements.txt
|-- setup.cfg
|-- setup.py
`-- src
    |-- __init__.py
    |-- n225mpf.py
    `-- start_bot.py

使いたい人がいれば......

GitHubに上げておくので,MITライセンスの範囲で自由に使ってください.コメントしてくれると喜びます. 詳しくはREADMEを読んでほしいのですが,以下の手順で簡単にインストールができます.

$ git clone https://github.com/Factory-KJC/discordN225chart.git
$ pip install -e ./discordN225chart

環境変数トークンを設定するのを忘れないようにしてください!

今後の改善点

土日祝判定がjpholidayに依存しているので,2026年以降は虚無のチャートが表示されてしまいます(自動アップグレード機能を追加して修正しました).あと,年末年始の休業日を設定していないので,そこは多分年末までに直します.

おわりに

PythonGitHubと諸々を学び始めてから11日で突貫工事で作成したには割と満足したものが作れたと思います.まだいくつか改善点がありますが,とりあえずversion 1.0.1(2024/07/15時点)ということにします. (追記 2024/07/18)version 1.1.0がリリースされました.

最後までお読みいただきありがとうございました.