第 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、朴素贝叶斯、随机森林)接到真实数据管线上:特征取自一只股票的近 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 只含关键片段):
get_all_trade_days()定位交易日;get_price(..., frequency='daily', fields=['close','high','low','volume'])取 35 日 OHLCV。- talib 算 SMA/WMA/MOM/STCK/STCD/MACD/RSI/WILLR/CCI/MFI/OBV/ROC/CMO。
- 逐特征与参考基准(如当日收盘)比较,离散成 ±1。
- 标签 = 次日收盘 > 当日收盘。
clf = svm.SVC(); clf.fit(x_train, y_train); prediction = clf.predict(x_test)。- 每个交易日把今天样本并入训练集、重训新模型。
- 关键聚宽 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 为准。
相关
- 把机器学习用到股票预测(落地流程与坑) — 把 ML 用到股票预测的共享概念页(本篇为核心)
- 朴素贝叶斯(贝叶斯定理 + 条件独立 + 后验最大化的分类器) — 三算法之一的原理(第 37 篇,postId=1727,本库已收录)
- kNN(k 最近邻分类) — 另一个分类器家族(38–41 篇),同为「分类器预测涨跌」的思路
- 聚宽行情与财务数据获取 API — get_price/get_all_trade_days 等聚宽数据 API 的地图
- 聚宽量化课堂(低频量化策略 43 篇) — 量化课堂 43 篇总览
更新 2026-09-06