見出し画像

yahoo financeで取得した株価推移をグラフにしてDiscordに投稿するBotを作った


Discord

上のような感じに複数の株価を取得して、Discordに毎日0時に投稿するBotを作りました。
そのためのpythonコードを下に貼っておきます。使用するには、あらかじめ、Discordに投稿するためのウェブフックurlを取得しておく必要があります。urlは、テキストチャンネル→チャンネルの編集→連携サービス→ウェブフック→新しいウェブフック から取得できます。

yahoo financeのapiを使ったことの無い方はyfinanceのインストールが必要です

pip install yfinance

ソースコードはこちら

# yahoo financeで取得した株価推移をグラフにしてDiscordに投稿するBot
import requests
import pandas as pd
import datetime
from time import sleep
import yfinance
import numpy as np
import warnings
import matplotlib.pyplot as plt


# 表示したい銘柄を追加 (yfinanceのティッカーシンボル, グラフに表示したい銘柄名)
tikkers= []
tikkers.append(("1306.T","TOPIX(1306)"))
tikkers.append(("^N225","日経225"))
tikkers.append(("1478.T","日本高配当インデックス(1478)"))
tikkers.append(("2516.T","東証グロース250(2516)"))
tikkers.append(("3778.T","さくらインターネット(3778)"))
tikkers.append(("4765.T","SBIグローバルアセットマネジメント(4765)"))
tikkers.append(("7203.T","トヨタ自動車(7203)"))
tikkers.append(("7974.T","任天堂(7974)"))
# ウェブフックurl Discordの、テキストチャンネル→チャンネルの編集→連携サービス→ウェブフック から取得
webhook_url = "your url"
# 保存ファイルの名前
filename = "kabu_jp"

# 画像をdiscordに投稿する
def post(file_path):
    with open(file_path, 'rb') as file:
        files = {'file': (file_path, file)}
        response = requests.post(webhook_url, files=files)
        if response.status_code == 200:
            print("ファイルが正常に送信されました。")

# 株価グラフを保存
def savefig():
    ts = []
    for t in tikkers:
        ts.append(t[0])
    #期間を指定
    end = datetime.date.today()
    start = end - datetime.timedelta(days=200)
    # ダウンロード
    data = yfinance.download(ts,start,end)['Adj Close']
    print(data.tail())
    # 表示する期間
    nday = 60
    m = len(tikkers)
    n = 1 + int((len(tikkers)-1)/4)
    # 株価を4銘柄毎に1つのファイルに出力
    for i in range(n):
        fig = plt.figure()
        ax1 = fig.add_subplot(2, 2, 1)
        ax2 = fig.add_subplot(2, 2, 2)
        ax3 = fig.add_subplot(2, 2, 3)
        ax4 = fig.add_subplot(2, 2, 4)
        axs = [ax1,ax2,ax3,ax4]
        for j in range(4):
            l = i*4+j
            if l<m:
                t = tikkers[l][0]
                name = tikkers[l][1]
                axs[j].plot(data[t].tail(nday),label=name,c="b")
                axs[j].plot(data[t].ewm(span=9).mean().tail(nday),c="r",alpha=0.4)
                axs[j].plot(data[t].ewm(span=26).mean().tail(nday),c="g",alpha=0.4)
                axs[j].legend(prop={"family":"MS Gothic"},fontsize="xx-small")
        fig.autofmt_xdate(rotation=45)
        plt.tight_layout()
        plt.savefig(filename+str(i)+'.png')
        plt.clf()
        plt.close()
if __name__ == "__main__":
    filenames = []
    n = 1 + int((len(tikkers)-1)/4)
    for i in range(n):
        filenames.append(filename+str(i)+'.png')
    day1 = 0
    while(True):
        sleep(5)
        dt_now = datetime.datetime.now()
        day2 = dt_now.day
        print("[",dt_now,"]")
        if np.abs(day2 - day1)>0:
            try:
                savefig()
                for fn in filenames:
                    post(fn)
                day1 = day2
            except Exception as e:
                print(f"エラーが発生しました: {str(e)}")
                continue


webhook_url = "your url"
の部分をご自身のウェブフックurlに編集してください。

tikkers= []
以下を編集して、自由に銘柄を追加できます。

実行すると、株価推移のグラフが4銘柄毎に1つのファイルに出力された後、作成したグラフたちをDiscordのチャンネルに投稿します。その後、日付が変わるごとに同じ動作を繰り返します。銘柄が多いと通知がうるさいことになります。適当に改造して使って下さい。




この記事が気に入ったらサポートをしてみませんか?