KNNマルチインジケーターインテリジェントフュージョン取引戦略


作成日: 2025-09-03 17:08:20 最終変更日: 2025-09-04 13:33:59
コピー: 0 クリック数: 161
2
フォロー
319
フォロワー

KNNマルチインジケーターインテリジェントフュージョン取引戦略

機械学習の必要性について

数量取引の分野で何年もの間,私は面白い現象を発見しました. ほとんどのトレーダーは,数十年前の技術指標を使用し,瞬時に変化する市場から過剰な利益を得ることを期待しています. それは,微積分問題を解くために計算機を使うのと同じです. 道具自体は問題ありませんが,効率と精度は時代遅れです.

今日分析するこの高度なKNN (K-近隣) 取引戦略は,まさに,量化取引の重要な方向性を表しています.機械学習アルゴリズムと伝統的な技術分析を組み合わせ,よりスマートな取引意思決定システムを構築する

KNNアルゴリズムとは何か? なぜKNNアルゴリズムは金融予測に適しているのでしょうか?

KNNのアルゴリズムの核心思想はシンプルで深いものです.似たような市場環境は 似たような価格動向を生み出しますこの仮説は,金融市場において,市場参加者の行動パターンが,ある程度の重複性および予測性を持っているという理論的な根拠があるという仮説である.

この戦略の特徴は,7次元特性の空間を構成することです.

  • 価格の動力価格の変化の速度と方向を測る
  • RSI指数について過剰買いと過剰販売を反映している.
  • 成績比率資金の流れが変わっていることを明らかにする.
  • 変動率市場情勢の変動を量化する
  • トレンドの強さツイン・均線システムでトレンドを特定する
  • MACDの特徴信号をキャプチャする
  • ブリン帯位置価格の相対的な位置を判断する

デザインの標準化にはどうすればいいのでしょうか?

この記事では,この技術について詳しく説明します.特徴の標準化Z-score 標準化方法を使用して,すべての特性を同じ数値範囲に変換する. このステップは,以下のように重要なものです.

  1. 量枠効果の除去価格,取引量,RSIなどの指標の値の幅は大きく異なっています.
  2. アルゴリズムの効率化標準化されたユーキリッドの距離計算はより正確です.
  3. モデル安定性を強化する: 予測の過程全体に,ある特徴が過大で支配されるのを避ける
normalize(src, length) =>
    mean_val = ta.sma(src, length)
    std_val = ta.stdev(src, length)
    std_val == 0 ? 0.0 : (src - mean_val) / std_val

距離加重予測:近隣はなぜ重要なのか?

伝統的なKNNアルゴリズムは通常,単純な投票メカニズムを使用していますが,この戦略はより洗練された投票メカニズムを使用しています.距離加重法からこのデザインは,金融市場の重要な特徴を反映しています.市場状態の類似性は連続的であり,分離的ではありません

体重計算の公式はweight = 1.0 / (distance + 0.001)

この重み付けの仕組みは,

  • 歴史的な類似性をより正確に反映する
  • データの干渉を減らす
  • 予測結果の信頼性を高める

この戦略はどんな状況で最適なのか?

機械学習の取引戦略に関する私の研究の経験に基づいて,KNN戦略は以下の市場環境で通常よりよく機能します.

  1. トレンド市場市場が明らかにトレンドしているときに,歴史的に似たパターンが再現されやすい.
  2. 中間波動率環境特徴の安定性には,波動率が高くても低くても影響する.
  3. 流動性のある品種取引の有効性や順調な実行を保証する.

注目すべきは,この戦略は,より保守的なリスク管理パラメータを設定していることです:2%の止損,4%の止まり,この1:2のリスク収益比は,戦略設計者がリスク管理に重点を置いていることを反映しています.

戦略の革新と改善の可能性

この戦略のいくつかの革新は称賛に値する:

  1. 多次元特性の融合単一の指標ではなく,総合的な特徴体系を構築する
  2. 動的な歴史ウィンドウ: スライドウィンドウのメカニズムでデータをタイムリーに保存する
  3. 確率的な出力市場を売り込むという 単純な信号ではなく 確率を予測する信号を提供する

しかし同時に,改善の余地もありました.

  • 特徴選択最適化特徴の重要性の評価を導入し,特徴の重さを動的に調整できます.
  • パラメータの自在化:K値と値は市場の動向に応じて調整できます
  • 多時間枠融合: 異なる周期を組み合わせたシグナルにより予測の精度が向上する

実用化における注意事項

リアルタイムのアプリケーションでは,以下のポイントに特に注意を払う必要があります.

  1. 計算の複雑さKNNアルゴリズムの計算量は,歴史データの増加に伴い増加し,精度と効率のバランスをとる必要があります.
  2. オーバーフィットするリスクK値が小さすぎると過適合,大きすぎると不適合になる.
  3. データの質: 異常データポイントは,距離計算に大きく影響し,データ浄化機構の構築が必要

機械学習の未来は 取引の量化

このKNNの戦略は,量化取引の重要な方向性を示しています.シンプルなルール駆動から 賢明なデータ駆動へ機械学習は万能ではありませんが,市場行動を理解し予測するより科学的で,より体系的な方法を提供します.

私の考えでは,将来の量的な取引は,従来の金融理論と,現代の統計学と,機械学習技術の深い融合である.このKNN戦略は,ほんの始まりに過ぎず,さらに多くの革新と飛躍が待っています.

ストラテジーソースコード
/*backtest
start: 2025-01-01 00:00:00
end: 2025-09-03 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT","balance":500000}]
args: [["v_input_int_1",5],["v_input_int_2",40],["v_input_int_3",5],["v_input_int_4",5],["v_input_float_1",0.8]]
*/

//@version=6
strategy("Advanced KNN Trading Strategy", overlay=true, max_bars_back=500)

//输入参数配置:设置KNN算法和交易策略的各项参数
k = input.int(5, "KNN邻居数量", minval=3, maxval=50);//K最近邻算法中K值
lookback = input.int(40, "历史数据回望期", minval=50, maxval=500);//历史数据窗口大小
feature_length = input.int(5, "特征计算周期", minval=5, maxval=20);//技术指标计算周期
norm_length = input.int(5, "标准化计算周期", minval=20, maxval=100);//特征标准化周期
prediction_threshold = input.float(0.8, "预测阈值", minval=0.5, maxval=0.9, step=0.1);//交易信号阈值
stop_loss_pct = input.float(2.0, "止损百分比", minval=0.5, maxval=5.0, step=0.1);//止损比例
take_profit_pct = input.float(4.0, "止盈百分比", minval=1.0, maxval=10.0, step=0.1);//止盈比例

//特征工程函数:数据预处理和特征提取
//标准化函数:将原始数据转换为标准正态分布
normalize(src, length) =>
    mean_val = ta.sma(src, length);//计算均值
    std_val = ta.stdev(src, length);//计算标准差
    std_val == 0 ? 0.0 : (src - mean_val) / std_val;//Z-score标准化

//原始技术特征计算:提取价格、成交量、波动率等基础特征
raw_price_momentum = (close - close[feature_length]) / close[feature_length] * 100;//价格动量
raw_rsi = ta.rsi(close, feature_length);//相对强弱指数
raw_volume_ratio = volume / ta.sma(volume, feature_length);//成交量比率
raw_volatility = ta.stdev(ta.change(close), feature_length) / close * 100;//价格波动率

//趋势特征计算:识别价格趋势强度
sma_short = ta.sma(close, 5);//短期均线
sma_long = ta.sma(close, 20);//长期均线
raw_trend_strength = (sma_short - sma_long) / sma_long * 100;//趋势强度

//MACD特征计算:动量指标
[macd_line, signal_line, histogram] = ta.macd(close, 12, 26, 9);//MACD指标
raw_macd_feature = macd_line - signal_line;//MACD差值

//布林带特征计算:价格相对位置
[bb_middle, bb_upper, bb_lower] = ta.bb(close, 20, 2);//布林带
raw_bb_position = (close - bb_lower) / (bb_upper - bb_lower);//价格在布林带中的位置

//特征标准化:将所有特征转换为相同量级
price_momentum = normalize(raw_price_momentum, norm_length);//标准化价格动量
rsi_feature = normalize(raw_rsi, norm_length);//标准化RSI
volume_ratio = normalize(raw_volume_ratio, norm_length);//标准化成交量比率
volatility = normalize(raw_volatility, norm_length);//标准化波动率
trend_strength = normalize(raw_trend_strength, norm_length);//标准化趋势强度
macd_feature = normalize(raw_macd_feature, norm_length);//标准化MACD
bb_position = normalize(raw_bb_position, norm_length);//标准化布林带位置

//目标变量定义:预测标签生成
future_return = (close - close[1]) / close[1] * 100;//未来收益率
target_label = future_return > 0 ? 1.0 : 0.0;//二分类标签:1为上涨,0为下跌

//KNN核心算法:K最近邻预测函数
knn_predict() =>
    var historical_features = array.new<array<float>>();//历史特征向量存储
    var historical_labels = array.new<float>();//历史标签存储
    
    //当前样本特征向量:使用已知的历史数据避免未来函数
    current_features = array.from<float>(
         price_momentum[1], rsi_feature[1], volume_ratio[1], volatility[1], 
         trend_strength[1], macd_feature[1], bb_position[1]
     )
    
    //历史数据收集:维护固定大小的历史样本窗口
    if bar_index >= lookback
        //滑动窗口:移除最旧数据
        if array.size(historical_features) >= lookback
            array.shift(historical_features)
            array.shift(historical_labels)
        
        //添加新的历史样本:使用[2]期特征预测[1]期走势
        hist_features = array.from<float>(
             price_momentum[2], rsi_feature[2], volume_ratio[2], volatility[2],
             trend_strength[2], macd_feature[2], bb_position[2]
         )
        
        array.push(historical_features, hist_features)
        array.push(historical_labels, target_label[1])
    
    //KNN预测计算:基于历史相似样本进行预测
    prediction = 0.0
    if array.size(historical_features) >= k
        distances = array.new<float>();//距离存储数组
        labels = array.new<float>();//对应标签存储数组
        
        //距离计算:计算当前样本与所有历史样本的欧几里得距离
        for i = 0 to array.size(historical_features) - 1
            hist_point = array.get(historical_features, i)
            distance = 0.0
            
            //欧几里得距离计算:各维度差值平方和的平方根
            for j = 0 to array.size(current_features) - 1
                curr_val = array.get(current_features, j)
                hist_val = array.get(hist_point, j)
                distance += math.pow(curr_val - hist_val, 2)
            
            distance := math.sqrt(distance)
            array.push(distances, distance)
            array.push(labels, array.get(historical_labels, i))
        
        //K个最近邻选择:找出距离最小的K个样本
        knn_predictions = array.new<float>();//K个最近邻的标签
        knn_distances = array.new<float>();//K个最近邻的距离
        
        for n = 0 to k - 1
            min_dist = 999999.0
            min_index = 0
            
            //寻找最小距离的样本索引
            for i = 0 to array.size(distances) - 1
                if array.get(distances, i) < min_dist
                    min_dist := array.get(distances, i)
                    min_index := i
            
            //保存K最近邻结果
            array.push(knn_predictions, array.get(labels, min_index))
            array.push(knn_distances, min_dist)
            
            //标记已使用的样本,避免重复选择
            array.set(distances, min_index, 999999.0)
        
        //加权预测:距离越近的样本权重越大
        weighted_sum = 0.0
        weight_total = 0.0
        
        for i = 0 to array.size(knn_predictions) - 1
            distance = array.get(knn_distances, i)
            weight = distance > 0 ? 1.0 / (distance + 0.001) : 1000.0;//反距离权重
            weighted_sum += array.get(knn_predictions, i) * weight
            weight_total += weight
        
        prediction := weight_total > 0 ? weighted_sum / weight_total : 0.5
    
    prediction

//获取KNN预测结果:执行预测算法
knn_prediction = knn_predict()

//交易信号生成:基于预测结果生成买卖信号
long_threshold = prediction_threshold;//多头信号阈值
short_threshold = 1 - prediction_threshold;//空头信号阈值

//交易信号判断:预测概率超过阈值时产生信号
long_signal = knn_prediction > long_threshold;//多头信号:预测上涨概率高
short_signal = knn_prediction < short_threshold;//空头信号:预测下跌概率高

//风险管理:计算止损止盈价格
long_stop_loss = strategy.position_avg_price * (1 - stop_loss_pct / 100);//多头止损价
long_take_profit = strategy.position_avg_price * (1 + take_profit_pct / 100);//多头止盈价
short_stop_loss = strategy.position_avg_price * (1 + stop_loss_pct / 100);//空头止损价
short_take_profit = strategy.position_avg_price * (1 - take_profit_pct / 100);//空头止盈价

//策略执行:开仓和平仓逻辑
//开仓条件:无持仓时根据信号开仓
if long_signal and strategy.position_size == 0
    strategy.entry("Long", strategy.long, comment="KNN多头: " + str.tostring(knn_prediction, "#.##"))

if short_signal and strategy.position_size == 0
    strategy.entry("Short", strategy.short, comment="KNN空头: " + str.tostring(knn_prediction, "#.##"))

//平仓条件:持仓时设置止损止盈
if strategy.position_size > 0
    strategy.exit("Long Exit", "Long", stop=long_stop_loss, limit=long_take_profit)

if strategy.position_size < 0
    strategy.exit("Short Exit", "Short", stop=short_stop_loss, limit=short_take_profit)

//图表可视化:在图表上显示预测结果和信号
plot(knn_prediction, "KNN预测", color=color.blue, linewidth=2);//预测值曲线
hline(prediction_threshold, "多头阈值", color=color.green, linestyle=hline.style_dashed);//多头阈值线
hline(1 - prediction_threshold, "空头阈值", color=color.red, linestyle=hline.style_dashed);//空头阈值线
hline(0.5, "中性线", color=color.gray, linestyle=hline.style_dotted);//中性参考线

//交易信号标记:在图表上标注买卖点
plotshape(long_signal, "多头信号", shape.triangleup, location.belowbar, 
          color=color.green, size=size.small);//多头信号标记
plotshape(short_signal, "空头信号", shape.triangledown, location.abovebar, 
          color=color.red, size=size.small);//空头信号标记

//交易提醒设置:配置交易信号的自动提醒
alertcondition(long_signal, title="KNN多头信号", 
               message="KNN预测多头信号,预测值: {{plot(\"KNN预测\")}}");//多头信号提醒
alertcondition(short_signal, title="KNN空头信号", 
               message="KNN预测空头信号,预测值: {{plot(\"KNN预测\")}}");//空头信号提醒