パラメータ最適化に基づくトレンド追従型定量戦略


作成日: 2024-01-02 11:01:22 最終変更日: 2024-01-02 11:01:22
コピー: 0 クリック数: 682
1
フォロー
1621
フォロワー

パラメータ最適化に基づくトレンド追従型定量戦略

概要

この戦略の主なアイデアは, percentrank指標とパラメータの最適化と組み合わせて,価格動向の判断と追跡を実現することです. この戦略は,現在の価格と特定の歴史的周期内の価格の大きさのパーセントを比較することによって,取引信号を生成し,中間ミラー効果を捕捉し,トレンドを追跡し,その後,余分な利益を得ます.

戦略原則

この策略は, percentrank指標を使用して価格の傾向を判断する. percentrankは,現在の価格の参照周期内の相対的な強さを表している. 参数 lenは,参照の歴史周期の長さを表している.

percentrankの値域は0から100の間のものです. percentrankの値が0に近づくと,現在の価格がチェックサイクル内の最低価格に近づいていることを示す,価値の低評価領域に属します. 100に近づくと,現在の価格がチェックサイクル内の最高価格に近づいていることを示す,価値の高評価領域に属します.

この戦略はまた,偏移量としての scale パラメータを導入した. 0 から 100 の区間を scale から 100+ scale の区間へと移動させた. 同時に, level_1 と level_2 の2つの信号線を設定した. このうち level_1 は多レベルを表示し, level_2 は空レベルを表示する.

価格%rank指標が下から上へ level_1を横切るときに多見信号を生じ;上から下へ level_2を横切るときに空見信号を生じます.平仓条件は入場信号と逆である。

戦略的優位性

  1. %rankで価格トレンドの強さを判断し,行き詰まりや追及を避ける
  2. パラメタルの最適化方法,偏移スケールと信号線値の調整,異なる品種と周期に対して調節し,安定性を向上させる
  3. トレンド追跡と反転取引のアイデアを組み合わせて,シグナルラインの突破後にタイムリーにトレンドを追跡します.

リスク分析

  1. 傾向を誤って判断し,不必要な損失を招く
  2. 価格変動の傾向がはっきりしない場合,誤ったシグナルが生じやすい
  3. パラメータの設定が不適切である場合,取引の頻度や取引量が不足する可能性があります.

上記のリスクに対して,パラメータ len,scale,levelの設定を調整することで最適化することができる.同時に,誤った取引を避けるための確認として他の指標と組み合わせることができる.

最適化の方向

この戦略はさらに改善できる余地があります.

  1. ストップポイントを導入し,単一の損失を減らすことができます.
  2. 移動平均線などの指標を組み合わせて確認し,誤った信号をフィルターすることができます.
  3. 自動最適化パラメータは,機械学習の方法と組み合わせることができます.
  4. 複数のタイムサイクルで並行して実行できます.

要約する

この戦略は,全体的な考え方が明確で,パラメータ最適化による定量的な方法を使用して価格の傾向を判断し,追跡する.特定の実戦価値があるが,実戦リスクを低減し,安定した収益性を高めるためにさらなるテストと最適化が必要である.

ストラテジーソースコード
/*backtest
start: 2023-12-02 00:00:00
end: 2024-01-01 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Alex_Dyuk

//@version=4
strategy(title="percentrank", shorttitle="percentrank")
src = input(close, title="Source")
len = input(title="lookback - Период сравнения", type=input.integer, defval=10, minval=2)
scale = input(title="scale offset - смещение шкалы", type=input.integer, defval=50, minval=0, maxval=100)
level_1 = input(title="sygnal line 1", type=input.integer, defval=30)
level_2 = input(title="sygnal line 2", type=input.integer, defval=-30)

prank = percentrank(src,len)-scale
plot(prank, style = plot.style_columns)
plot(level_2, style = plot.style_line, color = color.red)
plot(level_1, style = plot.style_line, color = color.green)

longCondition = (crossunder(level_1, prank) == true)
if (longCondition)
    strategy.entry("Long", strategy.long)
longExitCondition = (crossover(level_2, prank) == true)
if (longExitCondition)
    strategy.close("Long")
    
shortCondition = (crossover(level_2, prank) == true)
if (shortCondition)
    strategy.entry("Short", strategy.short)
shortexitCondition = (crossunder(level_1, prank) == true)
if (shortexitCondition)
    strategy.close("Short")