【tradingview】pineスクリプトとストラテジーの最適化手法

tradingview pine scriptについて初心者エンジニアに向けて、パラメータ最適化手法を解説します。

こんにちは。今回はtradingview pine scriptについて初心者エンジニアに向けて、パラメータ最適化手法について解説します。tradingviewは、パワフルで使いやすいテクニカル分析ツールであり、pineスクリプトを使用して独自のカスタムインジケーターやストラテジーを作成することができます。しかし、作成したスクリプトやストラテジーのパラメータは、最適な値を見つける必要があります。

パラメータ最適化は、トレーディングアルゴリズムのパフォーマンスを向上させるために重要な要素です。適切なパラメータを設定することで、利益を最大化し、リスクを最小限に抑えることができます。本記事では、パラメータ最適化の基本手法から進化的アルゴリズムを用いた最適化手法まで、いくつかの手法を紹介します。

パラメータ最適化の基本手法

パラメータ最適化の基本的な手法は、バックテストを通じて異なるパラメータセットを評価し、最も良い結果を示すパラメータを選択する方法です。以下は、pineスクリプトでこの手法を実装する例です。

//@version=4
strategy("basic parameter optimization", overlay = true)

// パラメータの設定
fast_length = input(title="fast ma length", type=input.integer, defval=10)
slow_length = input(title="slow ma length", type=input.integer, defval=20)

// 移動平均線の計算
fast_ma = sma(close, fast_length)
slow_ma = sma(close, slow_length)

// ゴールデンクロス・デッドクロスの条件
enter_long = crossover(fast_ma, slow_ma)
exit_long = crossunder(fast_ma, slow_ma)

// ゴールデンクロス時に買いポジションを取得
strategy.entry("long", strategy.long, when = enter_long)

// デッドクロス時に売りポジションを取得
strategy.close("long", when = exit_long)

このコードは、移動平均線の金クロス・デッドクロスをシグナルとするシンプルなトレンドフォロー戦略です。fast_lengthslow_lengthがパラメータであり、これらの値を変更することで戦略のパフォーマンスが変化します。

バックテストを実行し、さまざまなパラメータセットでのパフォーマンスを比較することで、最適なパラメータを見つけることができます。

パラメータスキャンおよびグリッドサーチの活用

パラメータスキャンは、事前に定義したパラメータの範囲内で値を変化させながらバックテストを実行し、最適なパラメータセットを見つける手法です。グリッドサーチは、事前に指定した間隔でパラメータの値を変更しながらテストを実行する方法です。以下は、パラメータスキャンとグリッドサーチを組み合わせた最適化手法の例です。

//@version=4
strategy("parameter scan and grid search optimization", overlay = true)

// パラメータの設定
fast_length = input(title="fast ma length", type=input.integer, defval=10, minval=5, maxval=20, step=1)
slow_length = input(title="slow ma length", type=input.integer, defval=20, minval=10, maxval=30, step=1)

// 移動平均線の計算
fast_ma = sma(close, fast_length)
slow_ma = sma(close, slow_length)

// ゴールデンクロス・デッドクロスの条件
enter_long = crossover(fast_ma, slow_ma)
exit_long = crossunder(fast_ma, slow_ma)

// ゴールデンクロス時に買いポジションを取得
strategy.entry("long", strategy.long, when = enter_long)

// デッドクロス時に売りポジションを取得
strategy.close("long", when = exit_long)

この例では、fast_lengthを5から20まで1刻みで、slow_lengthを10から30まで1刻みでバックテストを実行します。ここで、テスト結果のパフォーマンスを評価し、最適なパラメータセットを選択することができます。

進化的アルゴリズムを用いた最適化手法

進化的アルゴリズムは、自然界の進化を模倣した最適化手法であり、パラメータ最適化にも活用されます。進化的アルゴリズムは、複数の個体を生成し、適応度に基づいて個体を選択し、交叉や突然変異を行うことで新たな個体を生成します。以下は、pineスクリプトで進化的アルゴリズムを実装した例です。

//@version=4
strategy("evolutionary algorithm optimization", overlay = true)

// パラメータの設定
fast_length = optimize(5, 20, "fast ma length")
slow_length = optimize(10, 30, "slow ma length")

// 移動平均線の計算
fast_ma = sma(close, fast_length)
slow_ma = sma(close, slow_length)

// ゴールデンクロス・デッドクロスの条件
enter_long = crossover(fast_ma, slow_ma)
exit_long = crossunder(fast_ma, slow_ma)

// ゴールデンクロス時に買いポジションを取得
strategy.entry("long", strategy.long, when = enter_long)

// デッドクロス時に売りポジションを取得
strategy.close("long", when = exit_long)

この例では、optimize()関数を使用して、fast_lengthを5から20の範囲で、slow_lengthを10から30の範囲で最適化します。最適化結果は、バックテストのパフォーマンスに基づいて自動的に選択されます。

ウォークフォワード最適化の実施方法

ウォークフォワード最適化は、将来のデータを考慮してパラメータを最適化する手法です。ウォークフォワード最適化では、バックテスト期間を分けて、最初の期間でパラメータを最適化し、その後の期間でバックテストを実行することで、将来のパフォーマンスをシミュレートします。以下は、ウォークフォワード最適化の実施方法の例です。

//@version=4
strategy("walk forward optimization", overlay = true)

// パラメータの設定(最適化対象)
fast_length = optimize(5, 20, "fast ma length")
slow_length = optimize(10, 30, "slow ma length")

// 移動平均線の計算
fast_ma = sma(close, fast_length)
slow_ma = sma(close, slow_length)

// ゴールデンクロス・デッドクロスの条件
enter_long = crossover(fast_ma, slow_ma)
exit_long = crossunder(fast_ma, slow_ma)

// ゴールデンクロス時に買いポジションを取得
strategy.entry("long", strategy.long, when = enter_long)

// デッドクロス時に売りポジションを取得
strategy.close("long", when = exit_long)

// バックテスト期間の設定
start_period = timestamp(2020, 1, 1, 0, 0)
end_period = timestamp(2022, 1, 1, 0, 0)

// ウォークフォワード最適化の実行
walk_forward_info = strategy.optimize(
    "walk forward",
    "fast_length",
    "slow_length",
    start_period,
    end_period,
    "1y",
    net_profit
)

この例では、optimize()関数を使用して、fast_lengthslow_lengthを最適化します。さらに、strategy.optimize()関数を使用して、バックテスト期間(2020年1月1日から2022年1月1日)、ウォークフォワード期間(1年)、最適化対象のパラメータ(fast_lengthslow_length)、最適化目標(net_profit)を設定します。ウォークフォワード最適化の結果は、walk_forward_infoオブジェクトに格納され、パフォーマンスやパラメータの変化を確認することができます。

マルチタイムフレーム最適化の効果的な手法

マルチタイムフレーム最適化は、複数の時間枠でパラメータを最適化する手法です。トレード戦略のパフォーマンスは、異なる時間枠や市場状況で変動するため、単一の時間枠のパラメータで最適化を行った場合には、期待する結果を得ることができません。マルチタイムフレーム最適化では、複数の時間枠でバックテストを実行し、パラメータの最適な組み合わせを見つけます。以下は、マルチタイムフレーム最適化の手法を実装した例です。

//@version=4
strategy("multi-time frame optimization", overlay = true)

// パラメータの設定
slow_length = input(14, title="slow ma length")

// 短期と長期の移動平均線の計算
slow_ma = ema(close, slow_length)

// ゴールデンクロス・デッドクロスの条件
enter_long = crossover(close, slow_ma)
exit_long = crossunder(close, slow_ma)

// ゴールデンクロス時に買いポジションを取得
strategy.entry("long", strategy.long, when = enter_long)

// デッドクロス時に売りポジションを取得
strategy.close("long", when = exit_long)

// バックテスト用の長期の設定
fast_lengths = [5, 10, 20, 30] // 短期の設定
optimize_length = 30 // 最長期間の結果を基準に最適化

var float best_performance = 0.0
var float best_fast_length = 0.0

for i = 0 to array.size(fast_lengths)-1
    fast_length = fast_lengths[i]
    performance = strategy.netprofit / strategy.equity
    if performance > best_performance
        best_performance := performance
        best_fast_length := fast_length

fast_length = int(best_fast_length)

// バックテスト結果の出力
plot(strategy.netprofit, color=color.blue, title="net profit")

この例では、slow_lengthを固定した上で、複数のfast_length(短期の設定)に対してマルチタイムフレーム最適化を行っています。最もパフォーマンスの良い組み合わせを選択するため、バックテストの結果を比較しています。

以上が、tradingview pine scriptのパラメータ最適化手法の解説でした。tradingview pine scriptを使ったトレーディングアルゴリズムの開発では、パラメータ最適化が重要な要素となります。以上の手法を活用して、最適なパラメータを見つけることをおすすめします。

参考ブログ記事:

 

【TradingView】Pine Script関連のまとめ

【TradingView】Pine Script関連のまとめ
【tradingview】pineスクリプトでの自動売買手法   【tradingview】pineスクリプトの基礎知識と使い方解説   【tradingview】pineスクリプトのカスタムインジケーター作成入門   【tradingvi...

 

オンラインスクールを講師として活用する!

【完全無料】使えるプログラミングスクール体験セミナー
【完全無料】使えるプログラミングスクール体験セミナー WEB制作の無料教材がここにきてどんどん増えてきてるので、使えるものをまとめようと思います。 TecAcademy(テックアカデミー) TechAcademyの無料体験 Samurai ...

 

0円でプログラミングを学ぶという選択

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