長期トレンドに従い短期足に逆らう by 8時間足

売買判断の概要

相場の格言で言われる「週足に従い,日足に逆らえ」…
これは,長期トレンドには従う形でポジションを取るが,注文を入れるときは短期の足に逆らい,高値掴みを避けよ,ということだ.
まずは,この格言に従う形の売買判断ロジックを,お気に入りの8時間足で作ってみることにした.

考え方とコード

まず,肝となる”長期トレンド”は,8時間足120本分で計算した「移動最小二乗二次式近似値線」を使う.これは,単純移動平均に比べ,トレンド把握の遅れが少ないのが最大のメリットなので,気がついたら「トレンド変換していた!」という事態をある程度避けられる…ことを期待する.
発注タイミングは,「8時間足の動き(前回と今回の終値の動き)が,長期トレンドと逆行していること」とする.
また,いわゆるナンピンの積み増しも,ある程度の回数は許容する.
…文字にすると,たったこれだけのロジックだ…これをコードにしてみた.
とりあえず関数名は,OrderSettle_OldFushionedLogicの略として,OS_OFにした.

# ブログメモ用
# 長期トレンドに従いつつ,8時間足には逆らうヤーツ.一応,USD,EUR,GBP,AUD,NZD,CADすべてで,2005~2020年トータルで黒字.
# 統一ラベル化
def OS_OF(InputData_DF, jNow,Posi_pre,Vp_pre, Amount): #jNowは,売買判断に使う最新足の位置を決定.何もなきゃ0.ひとつ前の足なら1
    Settle = 0
    Order = 0
    
    #終値データ.jNow=0なら,最新の足データを参照.以降,数が増えるごとに,その分だけ古い足データを参照
    Vc0 = InputData_DF.at[jNow+0, "Vc"]
    Vc1 = InputData_DF.at[jNow+1, "Vc"]
    
    # 長期トレンドデータ参照.この場合は,移動最小二乗二次式近似値線.これの差分(delta)と,値そのものを参照
    delta0_LS2_L = InputData_DF.at[jNow+0, "LS2_120"] - InputData_DF.at[jNow+1, "LS2_120"]
    delta1_LS2_L = InputData_DF.at[jNow+1, "LS2_120"] - InputData_DF.at[jNow+2, "LS2_120"]
    LS2_L = InputData_DF.at[jNow+0, "LS2_120"]
    
    #トレンド判断のためのスレッシュ
    Thre_LS2_L = 0.05
    
    # 発注可能回数
    MaxNamPin=5
    
    # 損キリ設定(円)
    Loss=0.8
    
    #トレンド判断
    Trend0_L = 0
    if delta0_LS2_L > Thre_LS2_L:
        Trend0_L = 1
    if delta0_LS2_L < -Thre_LS2_L:
        Trend0_L = -1

    MaxAmount = (MaxNamPin - 1) * Amount
    # 買い注文ロジック
    if Posi_pre <=0 :
        if Trend0_L==1 and Vc0-Vc1<0 and Vc0-LS2_L<0.5:
            Order = Amount
    elif Posi_pre <=MaxAmount:
        if  Vc0<Vp_pre-0.2:
            Order = Amount
    # 売り注文ロジック
    if Posi_pre >= 0:
        if Trend0_L==-1 and Vc0-Vc1>0 and Vc0-LS2_L>-0.5:
            Order = -Amount
    elif Posi_pre >= -MaxAmount:
        if Vc0 > Vp_pre+0.2:
            Order = -Amount

    # 買い玉を売り決済するロジック
    if Posi_pre > 0:
        if Trend0_L==-1:
            Settle=-1
        if Vc0-Vp_pre<-Loss:#損切り
            Settle=-1
    # 売り玉を買い決済するロジック
    if Posi_pre < 0:
        if Trend0_L==1:
            Settle = 1
        if Vc0-Vp_pre>Loss:#損切り
            Settle=1

    return (Settle, Order)  # 決済は±1か0で出力,新規注文は±通貨量かoで出力

バックテスト

2005~2020年のデータを使い,バックテストをしてみた.通貨ペアはUSD_JPY,初回口座残高は50,000円,取引通貨量は1,000,スプレッドは0.03円(3銭)としてみた.結果は…思ったほど悪くない.基本的に,たまーに大きく儲けて,あとはちょいちょい損失を重ねて…長期的には何とか黒字…みたいな感じか.

ちなみに,EUR_JPY,GBP_JPY,AUD_JPY,NZD_JPY,CAD_JPYいずれも利益を出すことを確認した.黒字は嬉しいけど,大事なのは「損しないロジックである」こと.
まずはこのロジックをベースとして,より良いロジックがないか,探索を続けたい.

コメント

タイトルとURLをコピーしました