Tbquant机器学习KNN预测器使用方法及示例

松鼠Quant
2025-11-26


图片
量化策略开发,高质量社群,交易思路分享等相关内容

工具推荐

👉· 参数筛选工具

👉 ·Ai帮你编写策略

👉· 订单流图表

👉· 加入2025俱乐部

👉· Ai投研助手课程


『正文』

ˇ

上周发布了专享策略28 | TBquant手搓KNN机器学习 + 布林带突破 + 动态止损》群友们对TBquant里使用机器学习算法非常感兴趣,今天我们把KNN算法封装成用户函数,方便用户复用构建自己的机器学习策略。

使用示例





























































































































































































//------------------------------------------------------------------------// 简称: Example_KNN_Usage// 名称: KNN预测器使用示例// 类别: 演示如何调用KNN用户函数// 类型: 用户应用// 输出: Void//------------------------------------------------------------------------// 来源:ai.kanpan789.com// 【示例说明】// 本策略演示如何调用KNN_Predictor用户函数,实现机器学习预测。// 可以将此模式应用到任何策略中,只需:// 1. 计算7个特征// 2. 调用KNN_Predictor函数// 3. 使用返回的MLSignal和MLConfidence进行交易决策//------------------------------------------------------------------------
Params    Numeric BollLength(20);    Numeric BollOffset(2.0);    Numeric ScoreThreshold(0.65);   // ML置信度阈值    Numeric Fund(100000);
Vars    // 基础指标    Series<Numeric> ATR;    Series<Numeric> BollMid;    Series<Numeric> BollUpper;    Series<Numeric> BollLower;    Series<Numeric> BollWidth;    Series<Numeric> BollPosition;
    // 7个特征(需要策略自己计算)    Series<Numeric> Feature1;   // 趋势强度    Series<Numeric> Feature2;   // 综合动量    Series<Numeric> Feature3;   // 波动率    Series<Numeric> Feature4;   // 成交量强度    Series<Numeric> Feature5;   // BOLL位置    Series<Numeric> Feature6;   // BOLL收缩度    Series<Numeric> Feature7;   // 反转信号
    // ML预测结果(从KNN_Predictor获取)    Series<Numeric> MLSignal;       // 预测信号    Numeric Confidence;   // 预测置信度    Series<Numeric> MLConfidence;   // 预测置信度
    // 辅助变量    Series<Numeric> MAFast;    Series<Numeric> MASlow;    Series<Numeric> ADXValue;    Series<Numeric> ROC;    Series<Numeric> RSIValue;    Series<Numeric> MACD;    Series<Numeric> VolumeRatio;    Series<Numeric> Lots;
Events
    onBar(ArrayRef<Integer> indexs)    {        // 计算手数        Lots = Max(1, Round(Fund / (O * ContractUnit * BigPointValue * MarginRatio / Rollover), 0));
        // ==================== 计算基础指标 ====================        ATR = AvgTrueRange(14);        BollMid = Average(Close, BollLength);        Numeric BollBand = StandardDev(Close, BollLength, 2);        BollUpper = BollMid + BollOffset * BollBand;        BollLower = BollMid - BollOffset * BollBand;        BollWidth = IIF(BollMid != 0, (BollUpper - BollLower) / BollMid, 0);        BollPosition = IIF((BollUpper - BollLower) != 0,                           (Close - BollLower) / (BollUpper - BollLower), 0.5);
        // ==================== 计算7个特征 ====================
        // Feature1: 趋势强度        MAFast = Average(Close, 10);        MASlow = Average(Close, 30);        Numeric TrendStrength = Abs(MAFast - MASlow) / Close;        Numeric PDI = Average(Max(High - High[1], 0), 14) / ATR * 100;        Numeric MDI = Average(Max(Low[1] - Low, 0), 14) / ATR * 100;        Numeric DX = IIF((PDI + MDI) != 0, Abs(PDI - MDI) / (PDI + MDI) * 100, 0);        ADXValue = Average(DX, 6);
        if (MAFast > MASlow) {            Feature1 = TrendStrength * (ADXValue / 100);        } else {            Feature1 = -TrendStrength * (ADXValue / 100);        }
        // Feature2: 综合动量        ROC = (Close - Close[5]) / Close[5] * 100;        Numeric Up = Max(Close - Close[1], 0);        Numeric Down = Max(Close[1] - Close, 0);        Numeric RSValue = IIF(Average(Down, 14) != 0, Average(Up, 14) / Average(Down, 14), 0);        RSIValue = IIF(RSValue != 0, 100 - (100 / (1 + RSValue)), 50);        MACD = Average(Close, 12) - Average(Close, 26);
        Feature2 = ROC * 0.5 + (RSIValue - 50) * 0.5 + (MACD / Close * 100) * 0.3;
        // Feature3: 波动率        Feature3 = (ATR / Close) * 100;
        // Feature4: 成交量强度        VolumeRatio = Vol / Average(Vol, 20);        Feature4 = VolumeRatio;   // 简化版,实际可加OBV
        // Feature5: BOLL位置        Feature5 = BollPosition;
        // Feature6: BOLL收缩度        Feature6 = IIF(BollWidth != 0, 1.0 / (BollWidth * 100), 10);
        // Feature7: 反转信号(简化版)        Numeric BollExtreme = 0;        if (BollPosition < 0.1 || BollPosition > 0.9) {            BollExtreme = 0.3;        }        Numeric RSIExtreme = 0;        if (RSIValue < 30 || RSIValue > 70) {            RSIExtreme = 0.3;        }        Feature7 = Min(BollExtreme + RSIExtreme, 1.0);
        // ==================== 调用KNN预测器 ====================        // 这是关键步骤!将7个特征传入,通过Return获得信号,通过NumericRef获得置信度
        MLSignal = KNN_Predictor(            Feature1, Feature2, Feature3, Feature4, Feature5, Feature6, Feature7,            500,            // TrainingBars: 训练样本数            5,              // K_Neighbors: K值            100,            // MinSamples: 最小样本要求            Confidence    // 通过NumericRef回传置信度        );        MLConfidence = Confidence;
        // ==================== 使用ML预测结果进行交易 ====================
        // 多头进场:BOLL突破 + ML看涨 + 高置信度        if (High >= BollUpper[1] &&             MarketPosition == 0 &&             MLSignal[1] > 0 &&             MLConfidence[1] >= ScoreThreshold)         {            Buy(Lots, Max(Open, BollUpper[1]));            Commentary("ML增强做多-置信度:" + Text(MLConfidence[1]));        }
        // 空头进场:BOLL突破 + ML看跌 + 高置信度        if (Low <= BollLower[1] &&             MarketPosition == 0 &&             MLSignal[1] < 0 &&             MLConfidence[1] >= ScoreThreshold)         {            SellShort(Lots, Min(Open, BollLower[1]));            Commentary("ML增强做空-置信度:" + Text(MLConfidence));        }
        // 简单止损(示例)        if (MarketPosition > 0 && Low <= BollMid[1]) {            Sell(0, Min(Open,BollMid[1]));            Commentary("多头止损");        }
        if (MarketPosition < 0 && High >= BollMid[1]) {            BuyToCover(0, Max(Open,BollMid[1]));            Commentary("空头止损");        }
        // 显示ML信号        PlotNumeric("MLSignal", MLSignal[1]);        PlotNumeric("MLConfidence", MLConfidence[1]);        PlotNumeric("ScoreThreshold", ScoreThreshold);    }
//------------------------------------------------------------------------// 编译版本: 2025/11/21// 版权所有: songshu// // 使用说明:// 1. 确保KNN_Predictor.txt用户函数已编译// 2. 本策略只需计算7个特征,其他交给KNN函数// 3. 可以将此模式复制到任何策略中使用//// 调用方式:// MLSignal = KNN_Predictor(Feature1-7, TrainBars, K, MinSamp, MLConfidence);//   Return返回值:信号 (1=看涨, -1=看跌, 0=中性)//   MLConfidence:通过NumericRef回传的置信度 [0,1]//------------------------------------------------------------------------
我们需要先把7个特征计算好,默认使用的是传统指标这里可以平替为自己的指标和算法:









































// ==================== 计算7个特征 ====================        // Feature1: 趋势强度        MAFast = Average(Close, 10);        MASlow = Average(Close, 30);        Numeric TrendStrength = Abs(MAFast - MASlow) / Close;        Numeric PDI = Average(Max(High - High[1], 0), 14) / ATR * 100;        Numeric MDI = Average(Max(Low[1] - Low, 0), 14) / ATR * 100;        Numeric DX = IIF((PDI + MDI) != 0, Abs(PDI - MDI) / (PDI + MDI) * 100, 0);        ADXValue = Average(DX, 6);        if (MAFast > MASlow) {            Feature1 = TrendStrength * (ADXValue / 100);        } else {            Feature1 = -TrendStrength * (ADXValue / 100);        }        // Feature2: 综合动量        ROC = (Close - Close[5]) / Close[5] * 100;        Numeric Up = Max(Close - Close[1], 0);        Numeric Down = Max(Close[1] - Close, 0);        Numeric RSValue = IIF(Average(Down, 14) != 0, Average(Up, 14) / Average(Down, 14), 0);        RSIValue = IIF(RSValue != 0, 100 - (100 / (1 + RSValue)), 50);        MACD = Average(Close, 12) - Average(Close, 26);        Feature2 = ROC * 0.5 + (RSIValue - 50) * 0.5 + (MACD / Close * 100) * 0.3;        // Feature3: 波动率        Feature3 = (ATR / Close) * 100;        // Feature4: 成交量强度        VolumeRatio = Vol / Average(Vol, 20);        Feature4 = VolumeRatio;   // 简化版,实际可加OBV        // Feature5: BOLL位置        Feature5 = BollPosition;        // Feature6: BOLL收缩度        Feature6 = IIF(BollWidth != 0, 1.0 / (BollWidth * 100), 10);        // Feature7: 反转信号(简化版)        Numeric BollExtreme = 0;        if (BollPosition < 0.1 || BollPosition > 0.9) {            BollExtreme = 0.3;        }        Numeric RSIExtreme = 0;        if (RSIValue < 30 || RSIValue > 70) {            RSIExtreme = 0.3;        }        Feature7 = Min(BollExtreme + RSIExtreme, 1.0);
OK,接下来我们只需要传入7个特征给KNN_Predictor函数即可,如下:
图片

用户函数会把指标归一化、每个BAR生成信号和置信度。需要注意的是返回的信号和置信度需要前推使用,如下

图片
图片
图片
策略已上传到网站俱乐部后台,KNN的用户函数可以按照示例策略进行复用修改。

防迷路


           图片

微   信|小松鼠-松鼠Quant

微信号|viquant01

25俱乐部源码VIP28》

加入2025量化俱乐部



分享