Jikipedia
第 43 篇

手把手教你如何应用机器学习

量化课堂第 43 篇(postId=1900,作者 yongpeng.r,编辑宏观经济算命师,难度进阶上、理解深度 level-0,版本 V1.0)。机器学习八篇(36–43)的收官应用篇:把「每个算法配一个 toy 例子」升级成贴近实际的完整流程——13 个 talib 技术指标当特征、连续特征离散化成 ±1、SVM/朴素贝叶斯/随机森林预测次日涨跌、每个交易日把今天数据并入训练集重训新模型。全文最强调两件事:股市噪声大,特征必须离散化防过拟合;本流程只展示「怎么用」,不对预测准确性做担保。素材见 raw/collections/jq-quant-classroom/43-43-手把手教你如何应用机器学习md.md。

量化机器学习特征离散化过拟合SVM滚动重训

这是什么

一篇流程示范文,正文给出关键代码片段(特征计算、标签、离散化、SVM 应用四段)。它把之前数学课堂讲过的分类算法(SVM、朴素贝叶斯、随机森林)接到真实数据管线上:特征取自一只股票的近 35 个交易日、经 talib 计算并离散化,标签是次日涨跌方向,算法预测并每天滚动重训。没有回测收益数字——它的价值在「一套能跑的用法」,不在「赚不赚钱」。

核心要点

特征计算(talib,13 个指标)

  • 取前 35 个交易日的开高低收与成交量:get_all_trade_days() 定位交易日,get_price(test_stock, start_date=start_day, end_date=end_day, frequency='daily', fields=['close','high','low','volume'])
  • talib 特征:SMA、WMA、MOM、STCK、STCD、MACD、RSI、WILLR、CCI、MFI、OBV、ROC、CMO。
  • 取最新值的写法:talib.SMA(close_prices)[-1]

分类标签

  • 下一个交易日收盘价 > 当前交易日收盘价 → label=True;否则 False。

特征离散化(防过拟合的核心)

  • talib 算出的是连续值;股市噪声非常多,直接把连续值特征喂给机器学习算法,很可能过拟合(回测结果好、实盘结果差)。
  • 解法:结合各指标含义,把连续值离散成二值 ±1。例如 SMA:SMA < 当日收盘价 → 特征值 1;SMA ≥ 收盘价 → −1(x_all 的第 1 列是 SMA)。
  • 即:把连续指标的「大小幅度」砍成「相对价格的高低方向」,留下更稳的定性信息。

应用机器学习算法

  • svm.SVC()clf.fit(x_train, y_train)clf.predict(x_test) 预测次日涨跌。朴素贝叶斯、随机森林同套路。
  • 为贴近实际:每天把当天数据加进训练集,因为训练集变了,每天都训练一个新模型(滚动重训)。

机制 / 论证

  • 为什么离散化能防过拟合:涨跌预测的特征信噪比极低,连续数值里大量是噪声幅度;模型若去拟合这些幅度就会「记训练集、败实盘」。把特征压成「相对高低」的定性方向后,模型学到的是更稳的关系。
  • 为什么每天重训:市场分布非平稳,昨天的模型对今天可能已过时;把最新一天加进去让模型跟上新分布。代价是每天都要训练一遍。
  • 为什么作者不给收益结论:原文明说这些文章是「帮助大家使用算法」,末段提醒读者参照原理篇;本库的解读是——它演示到「预测对错」为止,到「能赚钱」还差仓位、调仓、成本等一整套策略零件(见 聚宽量化课堂(低频量化策略 43 篇) 的主线)。

可操作

  • 完整 pipeline(代码在文末研究模块 notebook,notebookCloneCount=1196;raw 只含关键片段):
    1. get_all_trade_days() 定位交易日;get_price(..., frequency='daily', fields=['close','high','low','volume']) 取 35 日 OHLCV。
    2. talib 算 SMA/WMA/MOM/STCK/STCD/MACD/RSI/WILLR/CCI/MFI/OBV/ROC/CMO。
    3. 逐特征与参考基准(如当日收盘)比较,离散成 ±1。
    4. 标签 = 次日收盘 > 当日收盘。
    5. clf = svm.SVC(); clf.fit(x_train, y_train); prediction = clf.predict(x_test)
    6. 每个交易日把今天样本并入训练集、重训新模型。
  • 关键聚宽 API(已保留):get_price(start_date/end_date/frequency/fields)、get_all_trade_days;talib 特征库。
  • 预测对错 ≠ 能赚钱:要变成策略还得补股票池、仓位、调仓、成本与验证(本库回测方法论见 W9 的 QuantStart 批次,未在本文)。

术语

  • 特征离散化:把连续值特征转成二值(±1)等离散值。
  • 过拟合:模型在训练集上表现好、在实盘/新数据上差(回测好实盘差)。
  • 滚动重训:每来一天新数据就重训一次模型。
  • SVM / 随机森林 / 朴素贝叶斯:本文使用的三个分类算法(SVM、随机森林原理篇未收录本库)。
  • talib:技术指标计算库。

不确定 / 待验证

  • SVM(postId 1510)与随机森林(postId 1571)的原理篇不在本库,两者概念只以名字出现 [需要验证]。
  • 完整代码(数据拼装、训练/测试切分、三算法的完整写法)在研究模块 notebook,raw 只有四段关键代码。
  • 「每日重训」没有任何回测/胜率/收益数字;预测对错到「能赚钱」之间差一整个策略。
  • 逐指标离散化的比较基准只示范了 SMA(与当日收盘比),其余 12 个指标的基准未逐个展开 [需要验证]。
  • 13 个特征同源于技术指标,互相高度相关;没有去冗余处理(36 篇的信息增益也没给多特征联合框架)。
  • x_all[index][-1] 这种末位取值、python2 习惯等是 2016 语境代码,落地以现行 API 为准。

相关

更新 2026-09-06

检索知识库

按标题、类型或正文检索