ランダムウォーク戦略


作成日: 2023-10-09 16:10:24 最終変更日: 2023-10-09 16:10:24
コピー: 0 クリック数: 475
1
フォロー
1226
フォロワー

概要

ランダム・ウォーキング・ストラテジー (random wandering strategy) は,ランダムな数値生成に基づく自動取引戦略である.この戦略は,線形同余生成器を使用して,設定に応じて,種子でランダムに数字を生成し,値下げ時に多めに,値下げ時に空白に小さく,ランダムに多めに空白するポジションに入ることを実現する.

戦略原則

この戦略は,主に以下の部分によってランダムな取引を実現します.

  1. ランダム数生成のパラメータa,c,モジュールm,および初期シードseed。を設定する.

  2. ランダム数生成関数GetRandomを定義し,線形同余アルゴリズムを使用して0-m間のランダム数を生成する.

  3. 各 K 線において,当時はポジションがない場合,比較して生成されるランダム数大小は,m/2 時より多くする,または空いている.

  4. ストップ・ストップ条件を設定し,ストップ・ストップ幅をパーセント形式で設定する.

  5. 時間帯によって反測周期を設定する.

上述のステップにより,この戦略は完全にランダムな多空操作を実現する. m/2以上のランダムな数で多空を開く,そうでなければ空を開く,それからストップ・ロスト・キャップをポジションから退出する設定する. 測定周期はカスタムで設定できる.

優位分析

  • 戦略の論理はシンプルで明快で,実行が分かりやすい.

  • ランダムな取引は,感情的な影響を避け,主観的な誤操作を減らすのに役立ちます.

  • ランダム度調整のためのカスタマイズ可能なランダム数生成アルゴリズムパラメータ.

  • 単一損失を制御するために,柔軟に停止停止条件を設定できます.

  • 回測パラメータの最適化をサポートし,さまざまなパラメータが全体的な収益に与える影響を簡単にテストします.

リスク分析

  • ランダムな取引は長期にわたって明確な動きがない可能性があり,収益は不確実である.

  • 市場状況に合わせてポジションを調整できず,トレンドのチャンスを逃す可能性があります.

  • 収益は限られ,取り戻しのリスクは大きい.

  • ストップ・ストップの割合を合理的に設定し,過度の損失を避ける必要があります.

  • ランダム性により,頻繁にポジションを空けて取引費用を増加させる可能性があります.

  • 検証パラメータの設定合理性を十分に反省する必要があります. 盲目に使用することはできません.

トレンド判断などの機能を追加し,ランダムなポジション開設回数を減らす,ストップ・ローズ・メカニズムを最適化し,単一損失を厳格に制御することでリスクを低減することができる.

最適化の方向

  • 逆のポジションを避けるために,トレンド判断を高めましょう.

  • ポジション管理に参加し,資金の変化に応じてポジションのサイズを調整する.

  • ランダムな数生成アルゴリズムを最適化し,ランダム性を向上させる.

  • ストップ・ローズを動的に調整する.

  • ポジション開設頻度制限を追加

  • 多パラメータ組合せ反省は,最適パラメータを探します.

要約する

ランダム・ウォーキング戦略は,ランダムな数値制御により多空をしたり,機械的な取引を実現する.この戦略はランダム性があり,個人の感情に影響を受けず,主観的な誤操作のリスクを回避する.しかし,ランダムにポジションを開けた場合も,トレンドの機会を逃す可能性があり,単一収益は限られており,リスク制御機構を最適化する必要がある.全体的に,この戦略は,取引理念を検証し,パラメータ設定が収益に与える影響を理解するために使用するのに適している.しかし,実際のアプリケーションは慎重に評価する必要がある.

ストラテジーソースコード
/*backtest
start: 2022-10-02 00:00:00
end: 2023-10-08 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
//@author=Tr0sT
strategy(title = "Random strategy", shorttitle = "Random", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100)

a = 16
c = 10
m = 1000
GetRandom(prev) =>
    GetRandom = (a * prev + c) % m

seed = input(200, minval = 2, maxval = m)
stopLoss = input(30, title = "Stop loss percentage(0.1%)")
takeProfit = input(30, title = "Take profit percentage(0.1%)")


curRandom = na
curRandom := nz(curRandom[1]) == 0 ? seed : GetRandom(curRandom[1])
if (strategy.position_size == 0)
    if (curRandom >= m / 2)
        strategy.entry("Enter", strategy.long)
    else
        strategy.entry("Enter", strategy.short)
        
    strategy.exit("Exit", "Enter", loss = close * stopLoss / 1000 / syminfo.mintick, profit = close * takeProfit / 1000 / syminfo.mintick)            

// === Backtesting Dates ===
testPeriodSwitch = input(false, "Custom Backtesting Dates")
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(3, "Backtest Start Month")
testStartDay = input(6, "Backtest Start Day")
testStartHour = input(08, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
testStopYear = input(2018, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(14, "Backtest Stop Day")
testStopHour = input(14, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
isPeriod = testPeriodSwitch == true ? testPeriod() : true
// === /END
if not isPeriod
    strategy.cancel_all()
    strategy.close_all()