株にもPythonにも無知な自分が株売買タイミングツールを作ってみる、暇だから。
1.前提条件(使用してるツール等)
- Visual Studio Code
- Python
2.基本のながれ
①銘柄の株価データを取得(yfinanceでOK)
②テクニカル指標を計算(移動平均線・RSI・MACDなど)
③売り/買いの条件を決める
④条件に合ったら通知(表示やLINEなど)
3.まずはコード作成
コード作成してから、それぞれの箇所を解説していく流れにしようと思います。
import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams["font.family"] = "Meiryo" #日本語フォント
# トヨタの過去3か月の株価データ取得
ticker = yf.Ticker("7203.T") #トヨタの銘柄コード
df = ticker.history(period="3mo")
# 移動平均を計算(短期5日・長期25日)
df["SMA_5"] = df["Close"].rolling(window=5).mean()
df["SMA_25"] = df["Close"].rolling(window=25).mean()
# 売買シグナルをチェック
#df["Signal"] = ""
#df["Signal"] = df.apply(lambda row: "BUY" if row["SMA_5"] > row["SMA_25"] else "", axis=1)
signal = []
for i in range(1, len(df)):
if df['SMA_5'][i] > df['SMA_25'][i] and df['SMA_5'][i-1] <= df['SMA_25'][i-1]:
signal.append("BUY") # ゴールデンクロス:買いシグナル
elif df['SMA_5'][i] < df['SMA_25'][i] and df['SMA_5'][i-1] >= df['SMA_25'][i-1]:
signal.append("SELL") # デッドクロス:売りシグナル
else:
signal.append("") # 特にシグナルなし
# シグナルをデータに追加
df['Signal'] = [""] + signal # 最初の値はNoneなので空欄を追加
# 結果表示
print(df[['Close', 'SMA_5', 'SMA_25', 'Signal']].tail(10))
df["Signal"] = [""] + signal # 最初の行は空欄
# 直近のシグナルを表示
latest = df.tail(1)
print("最新の終値:", latest["Close"].values[0])
print("短期SMA:", latest["SMA_5"].values[0])
print("長期SMA:", latest["SMA_25"].values[0])
print("シグナル:", latest["Signal"].values[0])
# チャート描画
plt.figure(figsize=(12, 6))
plt.plot(df["Close"], label="Close")
plt.plot(df["SMA_5"], label="SMA_5")
plt.plot(df["SMA_25"], label="SMA_25")
plt.legend()
plt.title("株価と移動平均線(トヨタ)")
plt.show()
上記コードの特徴は、「BUY」が表示されたら買いシグナル、「SELL」が表示されたら売りシグナルというのがわかるというものです。
4.銘柄の株価データを取得
上記コードのyfinanceというPythonライブラリを使用して、Yahoo Financeのデータを取得します。
Yahoo Financeは、株式、為替、商品、仮想通貨などの金融データを提供している無料のウェブサイトであり、yfinanceライブラリはそのYahoo Finance APIを利用して、Pythonから直接金融データを簡単に取得できるようにしています。
Yahoo Financeの主な機能
- 株価データ:株価の終値、始値、高値、安値、取引量などのデータを取得。
- ヒストリカルデータ:過去の株価データや分足データ(日足、週足、月足など)
- 企業情報:株式の企業情報(例:時価総額、PERなど)
- 配当情報:企業の配当履歴
yfinanceを使った株価データの取得
import yfinance as yf
# Appleのティッカーシンボル(AAPL)でデータを取得
ticker = yf.Ticker("AAPL")
# 過去1ヶ月の株価データを取得
data = ticker.history(period="1mo")
# 取得したデータを表示
print(data)
このコードでは、Appleの過去1ヶ月の株価データをYahoo Financeから取得して表示します。
5.移動平均を計算(短期5日・長期25日)ってなに
移動平均(Moving Average、略してMA)は、一定期間のデータの平均を計算する方法で、特に株価の分析においてよく使用されます。移動平均を使用することで、株価の「ノイズ」を取り除き、長期的なトレンドやパターンを把握するのに役立ちます。
移動平均の種類
①単純移動平均(SMA:Simple Moving Average)
- 一定期間(例えば5日、25日など)の終値を単純に平均します。
- 期間内のデータが全て同じ重みを持つため、シンプルで計算も容易です。
例えば、5日間の移動平均は次のように計算されます
SMA5 = (C1 + C2 + C3 + C4 + C5)/5
ここでのC1,C2...C5は過去5日間の株価
今回はこの単純移動平均を使用してコードを書いています。
②加重移動平均(WMA:Weighted Moving Average)
各データ点に異なる重みをつけて平均を取ります。最近のデータにより重みを置き、過去のデータの影響を小さくすることで、トレンドをより敏感に反映させることができます。
③指数移動平均(EMA:Exponential Moving Average)
より最近のデータに大きな重みを付けて計算する移動平均です。特に株価などの市場データではEMAがよく使われます。EMAは、直近の価格の変動をより重視するため、トレンドの変化を早く捉えやすいという特徴があります。
移動平均を使用する目的
移動平均は以下のような目的で使用されます
①トレンドの確認
- 移動平均線が上向きなら上昇トレンド、下向きなら下降トレンドの可能性が高いとされます。
②売買シグナル
- よく使われる売買シグナルの一つは、「短期移動平均線が長期移動平均線を上抜けると買いシグナル(ゴールデンクロス)」というものです。
- 反対に「短期移動平均線が長期移動平均線を下抜けると売りシグナル(デッドクロス)」になります。
具体例:移動平均線を使った戦略
例えば、短期(5日)と長期(25日)の移動平均線を見比べて、次のように判断できます
- ゴールデンクロス:短期移動平均線(5日)が長期移動平均線(25日)を上抜ける→買いシグナル
- デッドクロス:短期移動平均線(5日)が長期移動平均線(25日)を下抜ける→売りシグナル
これをプログラムに組み込むと、売買タイミングを自動で判断することができます。
6.ゴールデンクロスとデッドクロス
なぜゴールデンクロスが買いシグナルとされるのか?
- 短期的に株価が上昇している兆し:短期SMAが長期SMAを上抜けるということは、最近の株価が上昇傾向にあることを示します。この時点で市場の勢いが強く、さらに株価が上昇する可能性が高いと見なされます。
- 市場参加者の心理:ゴールデンクロスが発生すると、多くの投資家やトレーダーが買い注文を入れる可能性があります。これにより、株価がさらに上昇することが多いとされており、この点が「得」だと考えられます。
なぜデッドクロスが売りシグナルとされるのか?
- 短期の勢いが失速しているサイン:短期SMAが長期SMAを下回るというのは、直近の株価が平均より下がってきている=勢いが落ちていることを示します。
-
下降トレンドの始まりを示唆:短期線が長期線を下に抜けたということは、
今後も下落する可能性が高まってきたサイン。投資家はこのクロスを見て、「売り時が来た」と判断することが多い。 -
実際の投資家心理:投資家の多くがチャートを見て判断しているため、
「デッドクロス=売りサイン」という共通認識がある。結果として、多くの売り注文が入り、株価がさらに下がるという自己実現的な現象が起きやすい。
もちろん、移動平均線だけでは完全に売買タイミングを正確に予測することは難しいため、他のテクニカル指標(例:RSIやMACD)と組み合わせて使うことで、より精度の高いトレード判断ができるようになります。
7.コード強化
今回のコードでは、株価のデータを取得して、「BUY」が表示されたら買いシグナル、「SELL」が表示されたら売りシグナルというのがわかるというものを作成しました。
次回以降で、以下のような機能を追加していきたいと思います
- LINE通知でスマホに飛ばす
- RSIやMACDを追加して売り/買い判断を強化
- 複数銘柄を一括チェック
- 毎朝自動でチェック(スケジューラー化)
暇なときノロノロ作成していきたいと思います~~