以前の記事で、yfinanceを使って株価データを取得して、matplotlibを使ってグラフを作成するコードを作成しました
今回は株価データをもとに移動平均線を作成してグラフにプロットしていきます
さらに、グラフを保存してgmailで自分に送信して定期実行していきたいと思います
前回の記事は以下のリンクから参考にしてください
gmailで自動送信するコードの詳細はこちらの記事を参考にしてください
・環境
windows 11
yfinance 0.2.51
matplotlib 3.10.0
・コード
株価データを取得、移動平均線を作成、グラフにプロット、gmail送信までのコードです
import yfinance as yf
import matplotlib.pyplot as plt
from matplotlib import rcParams
from datetime import datetime, timedelta
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
# 銘柄コードを指定(レーザーテック)
ticker = "6920.T"
# 今日の日付と3年前の日付を取得
today = datetime.now()
start_date = today - timedelta(days=3*365) # 平年換算で計算
# 日付を%Y-%m-%dに変換
start_date = start_date.strftime('%Y-%m-%d')
# 3年前からの株価データを取得
data = yf.download(ticker, start=start_date)
# 25日、75日移動平均線を計算
data['MA25'] = data['Close'].rolling(window=25).mean()
data['MA75'] = data['Close'].rolling(window=75).mean()
# 日本語フォントを指定
rcParams['font.family'] = 'Meiryo'
# グラフをプロット
plt.figure(figsize=(12, 6))
plt.plot(data.index, data['Close'], label="株価", color="blue")
plt.plot(data.index, data['MA25'], label="25日移動平均線", color="red")
plt.plot(data.index, data['MA75'], label="75日移動平均線", color="green")
# グラフの詳細設定
plt.title("レーザーテックの3年間の株価と移動平均線")
plt.xlabel("日付")
plt.ylabel("株価(円)")
plt.legend()
plt.grid()
plt.tight_layout()
# 画像として保存
plt.savefig('Lasertec.png', dpi=100, bbox_inches='tight', facecolor='w')
# メール作成
msg = MIMEMultipart('alternative')
# HTML本文作成
html = f"""
<!doctype html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>レーザーテック株価</title>
</head>
<body>
<h1>レーザーテック株価</h1>
<h2>{start_date}から{today}</h2>
</body>
</html>
"""
part_html = MIMEText(html, 'html')
# 本文を添付
msg.attach(part_html)
# 添付ファイルの設定
image_path = "Lasertec.png" # グラフ画像のパス
with open(image_path, "rb") as attachment:
part_file = MIMEBase("application", "octet-stream")
part_file.set_payload(attachment.read())
encoders.encode_base64(part_file)
part_file.add_header(
"Content-Disposition",
f"attachment; filename={image_path}",
)
# 画像を添付
msg.attach(part_file)
# メールの件名
msg["Subject"] = "レーザーテック移動平均線"
# 送信者と受信者
msg["From"] = "XXX@gmail.com" # 送信元のメールアドレス
msg["To"] = "XXX@gmail.com" # 送信先のメールアドレス
# Gmailサーバーへの接続
smtp = smtplib.SMTP("smtp.gmail.com", 587)
smtp.ehlo()
smtp.starttls()
smtp.ehlo()
# Gmailアドレスとアプリパスワードでログイン
smtp.login("XXX@gmail.com", "XXXX XXXX XXXX XXXX") # アプリパスワードを入力
# メール送信
smtp.send_message(msg)
smtp.close()
・解説
グラフの作成
以下のコードで、移動平均線のデータとなる新しいデータフレームを作成しています
data['MA25'] = data['Close'].rolling(window=25).mean()
data['MA75'] = data['Close'].rolling(window=75).mean()
data[‘Close’]
ここでのdataはyfinanceから取得した株価データのデータフレームで、data[‘Close’]は株価データの中の「終値(Close)」の列を指しています
.rolling(window=25)
ローリングウィンドウ(移動窓)を作成するメソッドで、ウィンドウのサイズを25日に設定しています
.mean()
ローリングウィンドウ内のデータの平均を計算します
ローリングウィンドウを使って計算される移動平均値は、指定した期間内のデータポイントの平均値を示し、その日を含めた過去25日間の平均値となります
例えば、指定した日付が2024-01-01なら、2024-01-01以前の25日間の平均値となります
25日前のデータがない場合は、Nanとなります
これで新しく移動平均線のデータフレームが作成できます
以下のコードでグラフをプロットします
株価のdata[‘Close’]の他に、移動平均線のdata[‘MA25’]とdata[‘MA75’]を、色を変えてプロットします
# グラフをプロット
plt.figure(figsize=(12, 6))
plt.plot(data.index, data['Close'], label="株価", color="blue")
plt.plot(data.index, data['MA25'], label="25日移動平均線", color="red")
plt.plot(data.index, data['MA75'], label="75日移動平均線", color="green")
gmail送信
自分あてにgmailで送信するコードを解説します
文章の部分は以前の記事で紹介しているので以下の記事を参考にしてください
画像をメールに添付するコードを解説します
# 添付ファイルの設定
image_path = "Lasertec.png" # グラフ画像のパス
with open(image_path, "rb") as attachment:
part_file = MIMEBase("application", "octet-stream")
part_file.set_payload(attachment.read())
encoders.encode_base64(part_file)
part_file.add_header(
"Content-Disposition",
f"attachment; filename={image_path}",
)
# 画像を添付
msg.attach(part_file)
with open(image_path, “rb”) as attachment:
open関数でファイルを読み込みます
“rb”モードは「バイナリ読み取り専用」を意味します
添付する画像やPDFなどのバイナリファイルはこのモードで読み込む必要があります
今後はこの読み込んだファイルをattachmentとして扱います
part_file = MIMEBase(“application”, “octet-stream”)
MIMEBaseを使って、添付ファイルのMIMEタイプを指定します
“octet-stream”: バイナリデータを表します(どの形式か分からない汎用的な場合に使用)
“application”: ファイル全般を指すMIMEタイプ
part_file.set_payload(attachment.read())
ファイルの内容をattachment.read()で読み取り、そのデータをpart_fileにセットします
encoders.encode_base64(part_file)
読み取ったバイナリデータをBase64形式に変換します
Base64エンコードは、バイナリデータをテキスト形式に変換することで、電子メールのプロトコル(SMTP)で安全に送信できるようにします
part_file.add_header(
“Content-Disposition”,
f”attachment; filename={image_path}”,
)
添付ファイルに関するメタデータを設定します
“Content-Disposition”:ヘッダー
“attachment”: ファイルが添付ファイルであることを示します
filename={image_path}: 添付ファイルの名前をf文字列で指定します
これがメールでダウンロードされる際の名前の名前となります
msg.attach(part_file)
作成したpart_file(添付ファイル)をメールオブジェクトmsgに追加します
以上のコードで画像を添付してメールで送信することができます
コメント