简介:一份面向量化交易入门者的Python机器学习与量化交易学习笔记,聚焦多因子选股与数据预处理核心环节。内容覆盖p16~p20五个章节,包括市值因子选股策略的案例介绍与代码演示、多因子策略整体流程、因子数据组成与面板数据概念,并重点讲解中位数去极值、三倍中位数去极值和三倍标准差法去极值的具体实现,以及如何利用RiceQuant平台获取财务数据、筛选股票池、调整持仓。笔记为单文件PDF,共一个文件,压缩包大小五百六十二KB,适合直接阅读和随时回看。已有一千三百余人学习,被不少量化入门者作为参考。通过阅读这份笔记,读者可快速掌握市值因子选股的完整步骤,理解因子异常值对模型稳定性的影响,学会使用去极值技术减小极端数据干扰,为后续构建更复杂的多因子策略打下扎实基础。
1. 这一part到底讲了啥:从“跑通代码”到“看懂流程”
先说个实话,量化交易这块,大多数人一开始都是被“自动赚钱”四个字吸引进来的,结果一上手就懵了——pandas都没装明白,机器学习四个字更是听着像天书。我当初也是这样,所以这份笔记我特意按p16到p20的顺序重新整理了一遍,核心就一件事:把机器学习在量化里的角色讲清楚,然后让你亲手跑通一个最简单的流程。
这4节课的内容定位很明确,不是教你写多复杂的策略,而是帮你把“数据 → 特征 → 模型 → 信号 → 回测”这条链路打通。p16到p20刚好覆盖了环境搭建收尾、机器学习基础概念、以及第一个简单的量化策略demo。如果你正卡在“代码能跑但不知道在干嘛”的阶段,这几节课就是给你补上那个“干嘛”的。
适合谁来参考?两类人。一是刚学完python基础、想往量化方向走但不知道从哪下手的;二是已经装了一堆库、但始终没搞明白机器学习在交易里到底怎么用的人。如果你是冲着“一周暴富”来的,那可以直接关掉,这里只有枯燥的数据和代码。
2. 环境搭建收尾:别在第一步就劝退自己
2.1 python装哪个版本、用不用anaconda
p16花了些时间讲环境,很多人觉得啰嗦,但以我带过几十个新人的经验讲,环境问题能卡住一半以上的人。python版本这块,无脑选3.8到3.10之间的就行,别追最新版。原因很实际:量化生态里大量库的预编译包更新速度跟不上python新版本发布速度,你装个3.12,很可能遇到numba、ta-lib这种库直接没有对应wheel包,只能源码编译,然后报一堆错。
至于anaconda,我的建议是:如果你只是学机器学习,那直接装miniconda就行,体积小,够用。如果你连python都没装过,那anaconda一步到位更省心,自带conda环境管理,python版本随便切换,不污染系统环境。我当年就是嫌anaconda太大,死活不用,结果装个库把系统python搞崩了一次,后来老实了。
提示:环境管理是量化开发的刚需,千万别图省事,把所有库都往系统python里装。一个项目一个虚拟环境,出事直接删掉重建,五分钟恢复。
2.2 vscode还是jupyter
这两节课明显是用jupyter notebook演示的,我建议你也用。机器学习的探索阶段,特征怎么选、参数怎么调,本身就是不断试错的过程,jupyter的单元格执行模式天然适合这种工作流。数据长什么样、中间结果对不对,你一眼就能看到。
vscode当然也有jupyter插件,但我个人体验是:插件版偶尔会有内核连不上的问题,尤其是conda环境切换之后。所以你要是纯学习,直接装个anaconda,打开jupyter就能用,界面丑点没关系,能干活就行。等后面写正式策略了,再换vscode写.py文件也不迟。
3. 机器学习核心概念:用“预测房价”理解一切
3.1 特征、标签、训练集、测试集
p17到p18开始讲机器学习基础,这部分如果你之前看过相关视频会觉得重复,但它的意义在于把概念和量化场景绑在一起讲——这是很多纯机器学习课程做不到的。
拿预测房价来打比方:你要预测一套房子能卖多少钱(这是标签,也就是y),你手里有面积、地段、房龄、朝向这些信息(这是特征,也就是X)。机器学习做的就是找到一套规则,能从这些特征算出房价。规则怎么找?给它看大量“特征+真实房价”的样本,这叫训练集;看完之后拿它没见过的数据考它,这叫测试集。
放到量化里,特征就是各种技术指标、量价数据、甚至舆情信息,标签就是你未来N天是涨还是跌(或者涨跌幅)。模型的任务变成:根据这些特征,算出未来上涨的概率或者预测的涨跌幅。本质和预测房价没区别,只是数据源和业务背景不同。
3.2 过拟合:你以为学会了,其实只是背题了
p19重点讲了过拟合,我建议你把这个概念刻在脑子里,因为它是量化策略回测最经典的坑。过拟合说白了就是:模型在训练集上表现极好,因为把它“背”下来了,但一到没见过的数据上就原形毕露。
我见过太多新手,策略在回测里收益曲线完美得像画出来的一样,一上实盘就亏成狗,九成都是过拟合。怎么判断?最简单的办法是看训练集和测试集的差距:训练集准确率95%,测试集只有60%,那基本就是过拟合了。后面做特征工程和参数优化时,这个问题会反复遇到,现在先有这个概念,后面少交学费。
4. 你的第一个“量化策略”demo:从数据到信号
4.1 数据从哪里来
p20开始动手写第一个简单的策略demo,用到的数据是tushare或者其他免费数据源。这里有个大坑,我先提醒一下:现在很多数据源的接口改了规则,老视频里的代码直接跑会报错,别慌,这是正常现象。我写这篇笔记的时候,tushare pro需要积分才能获取完整日线数据,但基础的每日行情数据用免费额度基本够用。
如果你不想注册、不想搞token,也可以直接用yfinance拉美股数据,接口稳定、不用注册。或者用akshare,覆盖国内数据,免费且接口比较干净。选数据源的原则就一条:先跑通流程,别在数据下载上耗太久。
import pandas as pd import numpy as np from sklearn.linear_model import LinearRegression # 模拟数据:过去20天的收盘价 np.random.seed(42) price = pd.Series(np.cumsum(np.random.randn(100) * 2 + 50)) # 构造特征:过去N天的收益率 df = pd.DataFrame({'price': price}) df['ret_1'] = df['price'].pct_change() df['ret_2'] = df['price'].pct_change(2) df['ret_3'] = df['price'].pct_change(3) df['ret_5'] = df['price'].pct_change(5) # 标签:未来1天的收益率 df['target'] = df['price'].shift(-1) / df['price'] - 1 df = df.dropna() # 特征和标签划分 X = df[['ret_1', 'ret_2', 'ret_3', 'ret_5']].values y = df['target'].values # 划分训练集和测试集 split = int(len(X) * 0.8) X_train, X_test = X[:split], X[split:] y_train, y_test = y[:split], y[split:] # 训练线性回归模型 model = LinearRegression() model.fit(X_train, y_train) # 预测测试集 y_pred = model.predict(X_test) # 简单判断方向:预测涨就买,预测跌就卖 signal = np.where(y_pred > 0, 1, -1)这段代码看着简单,但包含了完整流程:造数据、做特征、设标签、分训练集测试集、训练模型、生成交易信号。我建议你一定要亲手敲一遍,而不是复制粘贴。敲的过程中你会注意到很多细节,比如pct_change会产生NaN需要dropna,比如shift(-1)才是“未来一天”,方向搞反了整个模型就废了。
4.2 这个demo的局限:它离“策略”还差得远
p20这个demo说白了是个教学演示,不是能实盘的东西。它没有算交易成本,没有考虑资金管理,也没有做任何回测验证。线性回归预测涨跌幅,本身就是一个极弱的模型,更别说只用过去几天收益率当特征,这本质上就是在预测一个随机游走序列——理论上就赚不到钱。
但它的意义在于:把一个抽象的“量化机器学习流程”变成了具体可运行的代码。你可以改特征、换模型、调参数,然后在同样的数据上看效果变化,这是理解整个系统的最高效路径。我自己当年就是把每个小demo都改一遍、折腾一遍,才真正把流程刻进脑子里的。
4.3 特征工程初体验:不是特征越多越好
p16到p20虽然没有展开讲特征工程,但demo里其实隐含了这个问题。上面代码里我用了ret_1、ret_2、ret_3、ret_5四个特征,它们之间高度相关——都基于同一个价格序列算出来的。特征之间的相关性高,会对某些模型(比如线性回归的系数解释)造成干扰,但这不代表模型完全不能用。
新手做特征工程最大的误区是堆特征,觉得特征越多信息越多,模型越准。实际往往是反的:冗余特征带来噪声,增加过拟合风险,拉慢训练速度。我的习惯是,先用手里的数据做几个有业务逻辑的特征,跑一版看效果,再逐步加特征,对比验证每个特征是否真的在“增量”。这个方法论比特征本身重要得多。
5. 常见问题与排查技巧实录
5.1 pandas的pct_change和shift方向搞混
这是我自己第一批踩的坑,也是我带新手时见的最多的错误。pct_change是算当前值相对前一个值的变化率,方向是“过去 → 当前”;而shift(-1)是把整个序列往前移动一格,相当于把未来的值放到现在的位置。做标签时要用shift(-1)把未来收益挪到当前行,做特征时用pct_change是取值过去的变化。
我见过有人把标签方向弄反了,模型训练出来预测结果和实际走势恰好相反——预测涨的它跌、预测跌的它涨。但神奇的是,如果忽略正负号只看绝对值,模型“准确率”还挺高。这种错误最迷惑人,因为你会觉得自己已经做出来了,只是效果不够好,于是开始调参、换特征,折腾半天才发现方向反了。
注意:写完特征和标签后,先打印出最后几行看一遍,确认“当前行的特征是已知的,标签是未来发生的”,这是最便宜的验证方式。
5.2 sklearn版本更新导致的代码不兼容
老视频里的很多代码在最新版sklearn下会报Warning甚至Error,最典型的就是一些旧API被移除了。比如老代码里可能有from sklearn.cross_validation import train_test_split,这个模块早就被移到sklearn.model_selection底下了。解决方法很简单:报错了就搜一下新API是什么,别死磕旧代码。
顺便说一句,国内访问部分pip镜像源不稳定,建议把源切到清华或者阿里云:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scikit-learn pandas numpy或者一次性配置好:
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple5.3 jupyter kernel连接不上
这个问题在新手期太常见了。明明conda环境里装了库,jupyter里import却报错,或者kernel直接死掉。原因通常是:jupyter不是在当前环境里启动的。解决办法:
conda activate your_env conda install ipykernel python -m ipykernel install --user --name your_env --display-name "your_env"然后在jupyter界面里切换kernel到你刚注册的环境。这个操作本质上就是在告诉jupyter:“每个kernel对应哪个python环境,别搞混了”。
5.4 回测结果好得离谱,先别高兴
看p20的demo,如果你把策略的收益率曲线打印出来,可能会发现“哇这策略太强了”。停一下,先冷静。这个demo没有任何交易成本、没有任何滑点假设,它的“收益”是模型在测试集上预测方向和实际走势一致的累计结果,本质上是在验证模型有没有学到东西,不是在证明这个策略能赚钱。
真实的回测至少要包含:手续费和滑点、涨跌停无法成交的情况、停牌股的处理、信号产生到实际成交的时间差。这些p16到p20都没涉及,后面才会讲到。所以你现在看任何回测曲线,都默认打上“理想化”三个字,别上头。
6. 这4节课学完,你该有什么状态
按我的理解,p16到p20学完之后,你不需要背下来任何算法原理,也不需要记住所有函数参数。你只需要确认自己能做到三件事:
第一,能独立搭建起jupyter环境,知道在哪个环境里安装了哪些库。第二,能看懂一行简单的机器学习代码在做什么——特征、标签、训练、预测,这四个环节分别对应哪段代码。第三,能跑通上面那个demo,并且能动手改一个特征或多个参数,观察结果怎么变。
做到这三点,这4节课就算真正吸收了。如果还要再进一步,我建议你试着用真实股票数据替换掉demo里的模拟数据,把代码里sklearn的LinearRegression换成其他模型(比如随机森林RandomForest或者逻辑回归LogisticRegression),你会发现同一个流程换个模型只需要改一两行代码,但对整体流程的理解会深很多。
最后再分享一个小经验:学量化机器学习,最怕的不是数学差、代码弱,而是“看懂了但不动手”。视频里代码一跑,结果一出来,你觉得“我懂了”,关闭视频,三天后让你自己写,大脑一片空白。所以我的习惯是每看完一小节,先关掉视频,凭记忆手写一遍代码,写不出来的地方先空着,最后再对照视频补。这样折腾几轮,代码就是你自己的了。p21开始估计就要进入真实的特征工程和策略优化了,这部分底子打好了,后面会轻松很多。
本文还有配套的精品资源,点击获取