别再把 AI 炒股当量化了,这可能是很多新手最容易混淆的地方。量化交易的核心是一套基于数据和规则的自动化决策流程,而 AI 炒股听起来更像是一个黑箱魔法。对于普通人来说,想入门量化,最关键的并不是找到一个“万能AI”,而是搞清楚从数据到策略再到执行的完整链路。这篇文章就拆解一下,一个普通人想从零开始搭建一个可验证、可执行的量化流程,到底需要经历哪些步骤,以及每个环节最容易踩的坑在哪里。
很多人一上来就找“AI量化策略代码”,结果发现要么跑不通,要么回测结果好但实盘一塌糊涂。问题往往出在流程的断裂上:你可能只拿到了策略代码,但不知道数据怎么清洗、特征怎么构建、因子怎么分析、风险怎么控制。下面我就按实际落地的顺序,把这个流程拆开讲清楚。
1. 先理清思路:量化不是“AI预测”,而是“规则执行”
很多人被“AI量化”这个词带偏了,以为核心是训练一个能预测股价涨跌的模型。这个理解偏差会导致后续所有步骤都走歪。量化交易的本质,是将投资思想转化为可量化的规则,并用历史数据验证其有效性,最后通过程序自动执行。
AI(或者说机器学习模型)在这里只是一个工具,用于从海量数据中挖掘规律、构建特征或生成信号。它属于“因子分析”或“信号生成”环节的一部分,而不是全部。把量化等同于AI炒股,相当于把盖房子等同于买了一把电钻。
普通人做量化的完整流程,通常包含以下几个核心环节:
- 数据获取与处理:找到可靠、干净、格式统一的数据源。
- 特征工程与因子分析:从原始数据中提炼出有预测能力的指标(因子)。
- 策略设计与回测:基于因子制定买卖规则,并在历史数据上模拟交易,评估盈亏。
- 风险控制与资金管理:设定止损、仓位控制等规则,防止单次巨亏。
- 实盘对接与自动化执行:将策略代码连接到交易账户,实现自动下单。
这个流程里,AI可能用在第2步(构建复杂因子)或第3步(生成交易信号),但其他步骤同样重要,甚至更重要。一个因子再厉害,如果数据是脏的,回测是过拟合的,风控是缺失的,实盘接口是断的,那最终结果一定是亏损。
2. 数据准备:你的策略大厦建立在什么地基上?
所有量化的起点都是数据。这一步没做好,后面全是空中楼阁。新手常犯的错误是:随便从网上下载一个CSV文件就用,或者使用不同来源、不同频率、有缺失和异常值的数据混合回测。
2.1 数据源选择:免费、付费与API
你需要决定用什么数据。常见的有:
- 股票数据:A股、美股、港股等。
- 期货/加密货币数据:高频特性更明显。
- 指数、宏观经济数据:用于辅助判断。
数据获取途径对比:
| 途径 | 优点 | 缺点 | 适合人群 |
|---|---|---|---|
免费开源库 (如akshare,yfinance) | 免费,上手快,适合学习。 | 数据可能不全、不稳定、有延迟,不适合高频或严肃实盘。 | 初学者、验证想法、做课程作业。 |
| 券商/平台提供 (如 QMT, Ptrade, 通达信) | 数据相对准确、稳定,与实盘交易环境集成好。 | 通常需要开户、有资金门槛,数据导出可能有限制。 | 已在某券商开户,打算在该平台做实盘的投资者。 |
| 专业金融数据终端 (如 Wind, Choice) | 数据全面、准确、更新及时,包含深度财务、研报等。 | 费用昂贵,个人投资者成本高。 | 机构或资金量大的专业投资者。 |
| 爬虫自采 | 最灵活,可以获取独特数据。 | 法律风险、技术门槛高、维护成本大、稳定性差。 | 有较强技术能力,且目标数据无法通过其他渠道获取。 |
给新手的建议:初期直接用akshare或yfinance获取日线数据跑通整个流程。等策略逻辑验证得差不多了,再考虑为实盘切换更稳定的数据源。千万不要在策略雏形阶段就投入大量资金购买数据。
2.2 数据处理:清洗、对齐与复权
拿到原始数据不能直接用,必须经过处理。
- 清洗异常值:检查是否有价格、成交量为0或负数,是否有暴涨暴跌的“毛刺”数据。常用的方法是限幅滤波(比如当日涨跌幅超过20%的数据需要查验或剔除)。
- 处理缺失值:股票停牌、数据源断更都会产生缺失。常用方法是前向填充(用前一天的数据填充),但对于关键数据(如开盘价),有时直接剔除该交易日更安全。
- 数据对齐:如果你的策略需要多只股票的数据,必须确保它们的时间轴对齐。比如股票A在2015年上市,股票B在2020年上市,回测起始日期就要从2020年开始。
- 复权处理:这是重中之重。股票有分红、送股、配股,会导致股价出现“跳空”,如果不进行复权(前复权或后复权),回测计算的收益会严重失真。几乎所有数据源都提供复权因子或已复权价格,务必确认你使用的是复权后的数据。
# 示例:使用 akshare 获取A股日线数据并简单查看 import akshare as ak import pandas as pd # 获取贵州茅台日线数据 (前复权) stock_daily = ak.stock_zh_a_hist(symbol="600519", period="daily", start_date="20230101", end_date="20231231", adjust="qfq") print(stock_daily.head()) print(f"数据形状: {stock_daily.shape}") # 检查缺失值 print(f"缺失值数量:\n{stock_daily.isnull().sum()}")注意:数据处理阶段就要开始写日志。记录下数据起始日期、股票数量、清洗掉了多少异常数据。这些信息在后续回测结果分析时非常有用,能帮你判断结果是否可靠。
3. 特征与因子:从数据中提炼“信号”
这是量化中技术含量最高、也最容易产生“幻觉”的环节。因子就是用来预测未来价格走势的指标。你可以理解成医生的“检查项目”,因子就是血压、血糖、心电图这些指标。
3.1 因子类型:技术面、基本面、另类数据
- 技术面因子:最常用,源于价格和成交量。例如:
- 移动平均线(MA)、布林带(Bollinger Bands)、相对强弱指数(RSI)、MACD。
- 波动率、成交量比率、价格动量(过去N天的收益率)。
- 基本面因子:源于公司财务报表。例如:市盈率(PE)、市净率(PB)、净资产收益率(ROE)、营收增长率。这类数据频率低(季度或年度),需要对齐到日频时间轴上。
- 另类数据:新闻情绪、社交媒体热度、供应链数据、卫星图像等。处理难度大,但可能包含独特信息。
3.2 因子分析:有效性检验与过拟合陷阱
不是所有因子都有效。你需要检验因子的预测能力(IC值)和稳定性。
- 单因子检验:计算因子值与股票下一期收益率的相关系数(Rank IC)。一个有效的因子,其IC值应该显著不为零,且在不同时间段内保持稳定。
- 多重共线性:如果你用了10个移动平均线因子(MA5, MA10, MA20...),它们之间高度相关,实际上提供的是重复信息。需要用方差膨胀因子(VIF)或相关系数矩阵来检查并剔除高度相关的因子。
- 过拟合(Overfitting):这是新手最大的坑。你在历史数据上穷尽各种参数组合,找到一个表现完美的因子或策略。但这可能只是“巧合”,它只是完美地拟合了历史噪音,对未来毫无预测力。
如何避免过拟合?
- 样本外测试(Out-of-Sample Test):把数据分成两段。用前70%的数据(训练集)挖掘因子、优化参数;用后30%的数据(测试集)来验证策略效果。绝对不能用测试集参与任何参数优化!
- 交叉验证:在时间序列上更复杂,但思想类似,确保评估的是泛化能力。
- 保持逻辑简单:优先选择逻辑清晰、金融学意义明确的因子(如“低市盈率效应”)。一个由20个复杂非线性变换组成的“黑盒子”因子,过拟合风险极高。
# 示例:简单计算一个动量因子并检验其IC值 import numpy as np # 假设 price_df 是一个包含多只股票收盘价的DataFrame,索引为日期,列为股票代码 def calculate_momentum(price_df, lookback_period=20): """计算过去 lookback_period 日的收益率作为动量因子""" return price_df.pct_change(periods=lookback_period) def calculate_rank_ic(factor_values, forward_returns): """ 计算Rank IC(斯皮尔曼相关系数) factor_values: t 时刻的因子值(DataFrame) forward_returns: t+1 时刻的收益率(DataFrame) """ # 确保索引对齐 common_index = factor_values.index.intersection(forward_returns.index) factor_vals = factor_values.loc[common_index] fwd_rets = forward_returns.loc[common_index] ic_series = [] for date in factor_vals.index: # 获取当天所有股票的因子值排名和下一期收益率排名 factor_rank = factor_vals.loc[date].rank() return_rank = fwd_rets.loc[date].rank() # 计算斯皮尔曼相关系数 ic = factor_rank.corr(return_rank, method='spearman') ic_series.append(ic) return pd.Series(ic_series, index=common_index) # 使用示例 (需准备真实数据) # momentum_factor = calculate_momentum(close_price_df, 20) # forward_ret = close_price_df.pct_change(periods=1).shift(-1) # 计算下一期收益率 # ic_series = calculate_rank_ic(momentum_factor, forward_ret) # print(f"IC均值: {ic_series.mean():.4f}, IC标准差: {ic_series.std():.4f}")核心建议:在因子分析阶段,我建议新手先用3-5个经典、逻辑简单的因子(如动量、波动率、估值)跑通整个分析流程。不要一上来就试图融合几十个因子或训练复杂的AI模型。先理解每个因子的计算、检验和贡献,比堆砌因子数量重要得多。
4. 策略回测:从因子到买卖规则的“模拟考”
有了因子,你需要制定具体的交易规则。这就是策略。回测就是在历史数据上模拟执行这个策略,看看它到底赚不赚钱。
4.1 策略构成:信号、择时、选股、风控
一个完整的策略需要明确:
- 信号:基于因子,什么时候产生“买入”或“卖出”信号?是因子值突破某个阈值,还是多个因子综合打分?
- 择时:信号产生后,是立即交易,还是等到下一个开盘价?这涉及到是使用“收盘价信号”还是“开盘价交易”,后者更贴近实际,因为收盘时产生信号,你只能第二天开盘买。
- 选股:每次交易哪些股票?是买入因子排名前10的股票,还是全市场交易?
- 风控(初步):单只股票最大仓位多少?是否设置止损止盈?
4.2 回测框架的关键细节
自己从头写回测引擎非常复杂,容易出错。建议使用成熟的框架,如Backtrader,Zipline,或者券商提供的回测平台(QMT/Ptrade都内置)。即使用框架,也要理解以下关键细节,否则回测结果可能严重失真:
- 未来函数(Look-ahead Bias):绝对禁止!在t时刻做决策时,不能用t时刻之后的数据。例如,不能用t日的收盘价计算因子,然后在t日就以收盘价交易(因为你收盘时才知道收盘价)。通常做法是:用t-1日及之前的数据计算因子,在t日开盘时交易。
- 幸存者偏差(Survivorship Bias):如果你只用当前还存在的股票来回测,就会漏掉那些已经退市的股票,而退市股票通常表现极差,这会使回测结果过于乐观。解决方案是使用“全历史股票池”,包含所有曾上市和已退市的股票。
- 交易成本:必须考虑!包括佣金(比如万三)和印花税(卖出时收取)。高频策略对交易成本极其敏感。回测中不加成本,结果会虚高。
- 滑点(Slippage):大额订单可能无法以理想价格成交,尤其是流动性差的股票。回测中可以设置一个固定的滑点比例(如0.1%)来模拟。
- 初始资金与仓位管理:回测起始资金要合理。策略要能处理建仓、加仓、减仓、清仓的全周期。
# 一个极其简化的、用于理解概念的回测逻辑伪代码(非生产可用) initial_cash = 1000000 # 初始资金100万 cash = initial_cash position = {} # 持仓字典,{股票代码: 股数} portfolio_value = [] # 记录每日总资产 for date in trading_dates: # 1. 生成今日交易信号 (基于昨日及之前的数据) signals = generate_signals(date) # 返回 {股票代码: ‘buy‘/‘sell‘/‘hold‘} # 2. 执行卖出信号 for stock, action in signals.items(): if action == 'sell' and stock in position: price = get_price(stock, date, 'open') # 以开盘价卖出 cash += position[stock] * price * (1 - commission - tax) # 扣除佣金和税 del position[stock] # 3. 执行买入信号 (简化:等权重买入) buy_stocks = [s for s, a in signals.items() if a == 'buy'] if buy_stocks: # 计算每只股票可买金额 money_per_stock = cash / len(buy_stocks) for stock in buy_stocks: price = get_price(stock, date, 'open') # 计算可买股数(取整) shares = int(money_per_stock / (price * (1 + commission))) # 买入时加佣金 if shares > 0: position[stock] = position.get(stock, 0) + shares cash -= shares * price * (1 + commission) # 4. 计算当日总资产 total_value = cash for stock, shares in position.items(): price = get_price(stock, date, 'close') # 以收盘价估值 total_value += shares * price portfolio_value.append(total_value) # 5. 计算回测指标 final_value = portfolio_value[-1] total_return = (final_value - initial_cash) / initial_cash4.3 如何评估回测结果?
看收益率曲线是远远不够的。需要一套综合指标:
- 年化收益率 / 总收益率
- 最大回撤(Max Drawdown):非常重要!策略运行期间,资产从高点跌到最低点的最大幅度。它能直观反映策略的风险。一个年化收益50%但最大回撤80%的策略,绝大多数人扛不住。
- 夏普比率(Sharpe Ratio):衡量每承担一单位风险,能获得多少超额回报。通常大于1算不错,大于2很好。但要注意,它假设收益服从正态分布,对极端行情可能失效。
- 胜率:盈利交易次数占总交易次数的比例。
- 盈亏比:平均盈利金额 / 平均亏损金额。
- 交易次数:次数太少可能统计意义不足,次数太多则交易成本影响大。
避坑提醒:如果回测结果呈现出“一条直线向上”的完美净值曲线,几乎可以肯定是犯了未来函数或幸存者偏差的错误。真实的策略净值曲线总是有波动的。回测的目标不是找到“圣杯”,而是验证策略逻辑的统计显著性和风险可控性。
5. 从回测到实盘:跨越“最后一公里”
回测表现好,实盘就一定能赚钱吗?不一定。这中间有巨大的鸿沟,被称为“最后一公里”问题。
5.1 实盘前的关键检查
- 逻辑一致性:确保实盘代码和回测代码的核心逻辑完全一致。因子计算、信号生成、交易规则不能有丝毫差别。
- 数据一致性:实盘接收的数据(频率、复权方式、字段)必须和回测时使用的数据源一致。最好在实盘初期,将接收到的数据与回测数据源进行比对。
- 环境与性能:回测可能在你的个人电脑上跑,实盘可能需要7x24小时运行的服务器。考虑网络稳定性、程序崩溃重启、内存泄漏等问题。
- 交易接口与订单管理:
- 接口选择:券商通常提供API(如QMT、Ptrade的Python接口)或第三方框架(如
easytrader,vn.py)。务必先阅读官方文档,并在模拟环境中充分测试。 - 订单状态管理:实盘下单不是瞬间完成的。你的程序需要能查询订单状态(已报、部成、全成、已撤、废单),并处理部分成交、撤单失败等异常情况。
- 错误处理与日志:网络超时、接口报错、资金不足、涨跌停无法交易……必须有完善的异常捕获和日志记录机制。日志要详细到每一笔委托的发送、回报和成交。
- 接口选择:券商通常提供API(如QMT、Ptrade的Python接口)或第三方框架(如
5.2 实盘运行模式
- 全自动:程序负责信号生成、风险判断、下单执行全流程。对系统可靠性要求最高。
- 半自动:程序生成交易信号和清单,人工审核后一键下单或手动下单。这是更稳妥的起步方式。
- 模拟盘:先用券商的模拟交易功能(如QMT的模拟交易)跑一段时间,验证整个流程的稳定性和信号的一致性。强烈建议新手走这一步。
5.3 实盘风控:保护你的本金
回测中的风控是理论上的,实盘风控是生死攸关的。
- 账户级风控:设置每日最大亏损额度、总体最大回撤阈值。一旦触发,程序自动平仓并停止交易。
- 策略级风控:单个策略的最大仓位限制、单只股票的最大持仓比例。
- 系统级风控:程序心跳监测(防止程序僵死)、网络断开重连、行情断线处理。
- 人工监控:即使全自动,初期也必须有人工每日检查日志和账户状况。
6. 关于AI、EA策略与现有工具的看法
最后,回到标题和热词,谈谈AI和EA策略在普通人量化流程中的位置。
AI(机器学习/深度学习):它是一个强大的因子挖掘工具。当你把基础流程跑通后,可以用AI模型(如梯度提升树、神经网络)来融合数百个基础因子,寻找非线性关系,生成更复杂的信号。但它的输入(数据)、输出(信号)仍然要嵌入到上述的完整流程中。切忌本末倒置,在数据、回测、风控都没搞懂的情况下,盲目追求最前沿的AI模型。
EA策略(Expert Advisor):这原是外汇MT4/MT5平台上的自动化交易脚本概念。其核心思想是一样的:规则自动化。在A股语境下,你可以把它理解为部署在QMT、Ptrade、通达信等平台上的自动化交易程序。这些平台提供了从数据、回测到实盘执行的一体化环境,降低了技术门槛,但并没有改变量化流程的本质。你仍然需要自己完成策略逻辑的编写和验证。
Python量化软件如何安装:这通常指的是安装
backtrader,zipline,akshare,ta-lib等Python库。对于新手,我推荐使用Anaconda创建独立的Python环境,然后用pip安装。遇到安装错误,优先搜索库的官方GitHub页面上的Issue。不要在一台装满了各种杂乱包的全局Python环境里折腾。“.onnx量化int8”, “模型量化”:这里的“量化”是深度学习模型压缩中的术语(Quantization),指将模型参数从高精度(如FP32)转换为低精度(如INT8)以减少计算量和内存占用,与金融量化交易完全是两回事。不要混淆。
给普通人的最终建议:
- 目标放低:你的第一个目标不是赚钱,而是跑通一个从数据到回测的完整、可复现的流程。
- 策略从简:用一个简单的均线交叉策略开始,把数据、回测、评价指标都走一遍。理解每一个环节的输出。
- 重视风控:在纸上或模拟盘中,反复测试你的止损、仓位规则。思考“如果连续亏损10次,我的账户会怎样?”
- 实盘从小开始:用极小资金(比如1万元)或模拟盘,运行你的策略至少一个完整的市场周期(牛熊),观察其表现是否与回测一致。
- 持续学习:量化是一个交叉学科,需要金融知识、统计学、编程能力。不要指望找到一个“圣杯代码”就能一劳永逸。
量化交易是将投资系统化、纪律化的过程,它的价值在于消除情绪干扰,用概率和规则说话。AI可以是这个系统里一个聪明的“研究员”,但构建一个稳健的“交易系统”本身,才是更基础、更重要的功课。别被“AI炒股”的炫酷概念带偏了,老老实实从数据、因子、回测、风控这些基本功做起,路才能走得远。