全自動売買戦略: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では取れないようなので、以前作った、ソースを参考にしてみる。
 らじおやじのボードを作った時のものが流用できそう。 

らじおやじのダッシュボードをExcel VBA + RSSで作ってみた。

らじおやじとは  らじおやじとは、日々の株式投資情報を提供している、65歳のおじさんです。  私より一つ年上です。  ちょっとひねくれたところもある、  プログラ…

 と思ったら、日経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による取得は、何倍も簡単で早い。
 全体のコードが欲しい方はコメント欄またはメールにて連絡ください。

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です