全自動売買戦略:ATRトレール版をChatGPTくんと相談しながら、Excel VBA で処理作成


ATRトレールとは?
ATRトレール(Average True Range Trail)
損失を最小限にしつつ利益を最大化する仕組み。
ATR(平均的な価格変動幅) を基にトレール型のストップ(逆指値)を設定
株価が有利に動いたらストップも追従し、利を伸ばす
VBAでの実装
ExcelでATRを計算(一定期間の高値-安値、前日終値とのギャップ等)
株価がエントリ後、指定倍率のATR幅でトレールするよう逆指値を再計算
楽天RSSと注文APIを組み合わせ、逆指値を自動で再設定
今回は通知まで
ATRトレール戦略(逆指値更新型)
✅【3】ATRトレール戦略(逆指値更新型)
概要: エントリー後、ATR(価格の変動幅)に基づき、逆指値を追従させて更新。
Excel準備:
- 楽天RSSで株価データ取得
- ATR計算用に、過去14日分の「高値・安値・終値」データを記録
- 現在価格をA2に記録
楽天RSSで過去14日分の「高値・安値・終値」株価データ取得
どうも楽天RSSでは取れないようなので、以前作った、ソースを参考にしてみる。
らじおやじのボードを作った時のものが流用できそう。
と思ったら、日経225指数しかとれない。
ヤフーファイナンスの時系列データを取得
14日間のデータを取ればいいので、ヤフーファイナンスの時系列データ取得が、実績もあるし、VBAで取れるのでこちらを検討してみる。
これまた、楽をしてChatGPTに聞いてみた。
しかし、これも認証関連でNG。結局、pythonでの実装で取得はできた。
✅ VBAからPythonを呼び出してCSVを自動取得(引数対応版)
ファイル名:get_yahoo.py
import sys
import yfinance as yf
def fetch_yahoo(symbol):
print(f"Fetching data for {symbol}...")
df = yf.download(symbol, period="30d", interval="1d")
filename = f"{symbol.replace('.', '_')}_last30.csv"
df.to_csv(filename)
print(f"Saved to {filename}")
if __name__ == "__main__":
if len(sys.argv) < 2:
print("エラー: 銘柄コードを引数で指定してください(例: 7203.T)")
sys.exit(1)
symbol = sys.argv[1]
fetch_yahoo(symbol)
✅ VBAから銘柄コードを渡して呼び出す方法
Sub RunPythonWithTicker()
Dim symbol As String
symbol = "7203.T" ' 任意の銘柄コード(例:トヨタ)
Dim pyPath As String
pyPath = "C:\your\path\get_yahoo.py"
Dim cmd As String
cmd = "python """ & pyPath & """ " & symbol
Shell cmd, vbNormalFocus
' 少し待ってから読み込む(任意)
Application.Wait Now + TimeValue("00:00:05")
' CSV読み込み(ファイル名は銘柄コードベース)
Workbooks.Open Filename:="C:\your\path\" & Replace(symbol, ".", "_") & "_last30.csv"
End Sub
✅ ATR計算用に、過去14日分の「高値・安値・終値」データを記録
Sub ImportCSVToCurrentSheet()
Dim symbol As String
'symbol = "7203.T" ' 銘柄コード(例)
symbol = Range("B2").Value & ".T"
Dim thisWs As Worksheet
Dim ws14 As Worksheet
Set thisWs = ThisWorkbook.Sheets("信用売り値通知")
Set ws14 = ThisWorkbook.Sheets("14日間データ")
symbol = ws14.Range("B2").Value & ".T"
Dim pyPath As String, csvPath As String, cmd As String
pyPath = "C:\Dropbox\管理\a株\RSS_Tool\get_yahoo.py"
' Python実行
ChDir "C:\Dropbox\管理\a株\RSS_Tool"
cmd = "python """ & pyPath & """ " & symbol
Shell cmd, vbHide
' 少し待つ(PythonがCSV出力する時間)
Application.Wait Now + TimeValue("00:00:05")
' CSVファイルのパスを作成
csvPath = "C:\Dropbox\管理\a株\RSS_Tool\" & Replace(symbol, ".", "_") & "_last30.csv"
' CSVを開かずに現在のブックに読み込む
Dim fileNum As Integer, txtLine As String
Dim dataArr As Variant, i As Long, j As Long
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("14日間データ")
'10 行目以降を消去
ws.Range(ws.Range("A10"), ws.Range("A" & Cells.Rows.Count)).EntireRow.Clear
DoEvents
DoEvents
fileNum = FreeFile
Open csvPath For Input As #fileNum
i = 1
Do While Not EOF(fileNum)
Line Input #fileNum, txtLine
If Trim(txtLine) <> "" Then
dataArr = Split(txtLine, ",")
For j = 0 To UBound(dataArr)
ws.Cells(i + 10, j + 1).Value = dataArr(j)
Next j
i = i + 1
End If
Loop
Close #fileNum
' MsgBox "CSVデータを Sheet1 に取り込み完了!"
End Sub
✅ 取得したデータをもとに、ATRを計算
Sub ATR_Trailing_Stop()
Dim atr As Double
Dim trValues() As Double
Dim i As Integer
' True Range 計算(例:B=高値、C=安値、D=終値)
ReDim trValues(1 To 14)
For i = 2 To 15
Dim highVal As Double, lowVal As Double, prevClose As Double
highVal = Sheet1.Cells(i, 2).Value
lowVal = Sheet1.Cells(i, 3).Value
prevClose = Sheet1.Cells(i + 1, 4).Value
trValues(i - 1) = Application.WorksheetFunction.Max(highVal - lowVal, Abs(highVal - prevClose), Abs(lowVal - prevClose))
Next i
atr = Application.WorksheetFunction.Average(trValues)
' トレールストップ価格の算出(例:2倍のATRを逆指値)
Dim entryPrice As Double, trailStop As Double
entryPrice = Sheet1.Range("A2").Value
trailStop = entryPrice - (2 * atr)
' 逆指値更新
Dim stopCmd As String
stopCmd = "注文API.exe -update-stoploss -price " & trailStop
Shell stopCmd, vbNormalFocus
End Sub
ソースを読んでみると、ちょっと譜に落ちない部分が出てきた。
prevClose = Sheet1.Cells(i + 1, 4).Value
prevClose ? 前日の終値? なんで次の行を見ているのだろう?
ChatGPTに聞いてみる。
なるほど。間違いというか、このサンプルソースは、14日データを取得後、日にち逆順に並び変えてからの処理のようだ。
ソースに疑問点があったら、聞いた方がよい。
古い情報で作っていて、動かない場合とかも結構ある。
最後に
銘柄リストの順に、データを取得し、それぞれのATR値を計算し、最安値を更新するたびに、逆指値を通知するところまで作成した。
以前はスクレイピングで時系列データを取得していたが、今回のpythonによる取得は、何倍も簡単で早い。
全体のコードが欲しい方はコメント欄またはメールにて連絡ください。