ランダムウォーク戦略 (random walk strategy) は,ランダムナンバー生成に基づいた自動化取引戦略である.これは,線形コングルーエンシャルジェネータを使用して,セットシードに基づいてランダムに数字を生成する. 数が限界値を超えると,長行,少行すると短行,ランダムエントリーロング/ショートを実装する.
ランダム取引を実装する主な部分は以下のとおりです.
ランダム数生成のパラメータ a,c,モジュール m と初期シードを設定します
ランダム数生成関数 GetRandom を定義し,線形一致アルゴリズムを使用して 0-m の間のランダム数を生成する.
各キャンドルスタイクで,ポジションがない場合は,生成されたランダム数サイズを比較し,m/2より大きい場合はロング,そうでなければショートします.
ストップ・ロスを設定し 利益率をパーセントで表します
バックテスト期間を タイムフレームで設定します
上記のステップを通じて,この戦略は完全にランダムな長/短取引を実現する.ランダムな数が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()