資源の読み込みに... 荷物...

KNN ベースの適応パラメトリック傾向 戦略をフォローする

作者: リン・ハーンチャオチャン,日付: 2024年11月29日 10:54:49
タグ:マルチKNNSMA

img

概要

この戦略は,K-Nearest Neighbors (KNN) 機械学習アルゴリズムに基づいた適応性パラメータトレンドフォローシステムである.この戦略は,KNN アルゴリズムを通じてトレンドフォローパラメータを動的に調整し,移動平均値と組み合わせて取引信号を生成する.このシステムは,市場の状況の変化に基づいて戦略パラメータを自動的に調整し,戦略の適応性と安定性を向上させることができる.この戦略は,伝統的なトレンドフォロー戦略を最適化するために機械学習方法を組み合わせ,定量投資における技術とイノベーションの融合を表す.

戦略原則

戦略の基本原則は,KNNアルゴリズムを使用して歴史的な価格データを分析し,現在の市場状況と歴史的なデータの類似性を計算することによって価格動向を予測することです.具体的実施ステップは:

  1. 観測窓のサイズとK値を設定し,特徴ベクトルを形成するために歴史的な価格データを収集する
  2. 現在の価格順序と歴史的なデータとの間のユークリッド距離を計算する
  3. 近隣サンプルとして最も類似した過去価格配列をKを選択します.
  4. これらのK近隣サンプルの後の価格動きを分析する
  5. 移動平均値と組み合わせた近隣サンプルの平均価格変化に基づいて取引信号を生成する K近隣サンプルの平均価格変化が正であり,現在の価格が移動平均値を超える場合,システムは長い信号を生成します.そうでなければ,短い信号を生成します.

戦略 の 利点

  1. 高い適応性:KNNアルゴリズムは市場環境の変化に基づいてパラメータを自動的に調整できます
  2. 多次元分析:機械学習アルゴリズムと技術指標を組み合わせ,より包括的な市場分析を行う
  3. 合理的なリスク管理: 誤った信号の影響を軽減するために,移動平均を補助的な確認として使用する.
  4. 明確な計算論理: 戦略実行プロセスは透明性があり,理解し最適化するのが簡単です
  5. 柔軟なパラメータ:K値と窓のサイズは,異なる市場環境に応じて調整できます.

戦略リスク

  1. 高計算複雑性:KNNアルゴリズムでは,大量の歴史的データを計算する必要があります.
  2. パラメータの感度:K値と窓の大きさの選択は戦略のパフォーマンスに大きく影響します
  3. 市場環境による依存: 波動的な市場では,過去の類似性の基準値は低下する可能性があります.
  4. 過剰な適応リスク: 過去データへの過剰な依存は,戦略の過剰な適応につながる可能性があります.
  5. 遅延リスク: 十分な過去のデータ収集が必要であるため,信号遅延が発生する可能性があります.

戦略の最適化方向

  1. 機能エンジニアリングの最適化
  • 機能としてより多くの技術指標を追加
  • 市場情勢指標を導入する
  • 機能標準化方法を最適化する
  1. アルゴリズム効率の向上
  • KD-tree を使って近隣の検索を最適化
  • パラレルコンピューティングを実装する
  • データ保存とアクセス方法を最適化
  1. リスク管理の強化
  • ストップ・ロスト・メカニズムと 利益の引き上げメカニズムを追加する
  • 変動性フィルタを導入する
  • ダイナミック位置管理システムの設計
  1. パラメータ最適化ソリューション:
  • アダプティブK値選択を実装する
  • 観察ウィンドウのサイズを動的に調整する
  • 移動平均期間の最適化
  1. シグナル生成メカニズムの改善:
  • シグナル強度スコアリングシステムを導入
  • 設計信号確認メカニズム
  • 入口と出口のタイミングを最適化

概要

この戦略は,機械学習方法によって伝統的な技術分析戦略を最適化し,トレンドフォロー取引にKNNアルゴリズムを革新的に適用する.この戦略は,市場の状況に基づいてパラメータを動的に調整できる強力な適応性と柔軟性を有している.高い計算複雑性やパラメータ感度などのリスクが存在しているにもかかわらず,戦略は合理的な最適化およびリスク管理措置を通じて依然として良い応用価値を持っています.投資家は市場の特徴に応じてパラメータを調整し,実践的なアプリケーションで取引決定のための他の分析方法を組み合わせることをお勧めします.


/*backtest
start: 2024-10-01 00:00:00
end: 2024-10-31 23:59:59
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy("Trend Following Strategy with KNN", overlay=true,commission_value=0.03,currency='USD', commission_type=strategy.commission.percent,default_qty_type=strategy.cash)


// Input parameters
k = input.int(5, title="K (Number of Neighbors)", minval=1)  // Number of neighbors for KNN algorithm
window_size = input.int(20, title="Window Size", minval=1)  // Window size for feature vector calculation
ma_length = input.int(50, title="MA Length", minval=1)  // Length of the moving average

// Calculate moving average
ma = ta.sma(close, ma_length)

// Initialize variables
var float[] features = na
var float[] distances = na
var int[] nearest_neighbors = na

if bar_index >= window_size - 1  // Ensure there is enough historical data
    features := array.new_float(0)  // Keep only the current window data
    for i = 0 to window_size - 1
        array.push(features, close[i])

    // Calculate distances
    distances := array.new_float(0)  // Clear the array for each calculation
    for i = 0 to window_size - 1  // Calculate the distance between the current price and all prices in the window
        var float distance = 0.0
        for j = 0 to window_size - 1
            distance += math.pow(close[j] - array.get(features, j), 2)
        distance := math.sqrt(distance)
        array.push(distances, distance)

    // Find the nearest neighbors
    if array.size(distances) > 0 and array.size(distances) >= k
        nearest_neighbors := array.new_int(0)
        for i = 0 to k - 1
            var int min_index = -1
            var float min_distance = na
            for j = 0 to array.size(distances) - 1
                if na(min_distance) or array.get(distances, j) < min_distance
                    min_index := j
                    min_distance := array.get(distances, j)
            if min_index != -1
                array.push(nearest_neighbors, min_index)
                array.remove(distances, min_index)  // Remove the processed neighbor

    // Calculate the average price change of the neighbors
    var float average_change = 0.0
    if array.size(nearest_neighbors) > 0
        for i = 0 to array.size(nearest_neighbors) - 1
            var int index = array.get(nearest_neighbors, i)
            // Ensure index + 1 is within range
            if index + 1 < bar_index
                average_change += (close[index] - close[index + 1])
        average_change := average_change / array.size(nearest_neighbors)

    // Generate trading signals
    if average_change > 0 and close > ma
        strategy.entry("Long", strategy.long)
    else if average_change < 0 and close < ma
        strategy.entry("Short", strategy.short)



関連性

もっと