数据准备与清洗
构建量化选股模型的第一步是获取高质量数据。A股市场数据源包括行情数据、财务数据、公告事件以及另类数据。行情数据涵盖日线、分钟线、tick级成交与委托队列。财务数据来自定期报告与业绩快报。公告事件包含分红、增发、重组等。另类数据有舆情、产业链、卫星图像等。
数据清洗重点处理停牌、涨跌停、缺失值与异常值。停牌股票需从当日候选池剔除。涨跌停股票在信号生成日若无法成交,则标记为不可交易。缺失值采用前向填充或行业均值替代。异常值通过3σ法则或中位数绝对偏差修正。

数据存储使用列式数据库如Parquet或HDF5,配合Dask或Polars加速计算。时间序列对齐采用前复权价格,避免除权除息造成的伪信号。
因子计算与有效性检验
因子是量化模型的核心输入。常见因子分为价值、成长、质量、动量、波动率、流动性六大类。价值因子包括市净率、市盈率、市销率。成长因子有营收增速、净利润增速。质量因子含ROE、毛利率、资产负债率。动量因子涵盖过去20日、60日收益率。波动率因子有已实现波动率、Beta。流动性因子包括换手率、Amihud非流动性指标。
每个因子需进行IC测试与分层回测。IC值衡量因子与未来收益的秩相关。IC均值大于0.03且ICIR大于0.3视为有效。分层回测将股票按因子值分为5组,检验单调性。多空组合年化收益超过15%且最大回撤低于20%的因子进入候选池。
因子间相关性需控制在0.7以下,避免多重共线性。使用主成分分析或聚类方法降维,保留解释力最强的正交因子。
风险过滤与可交易性约束
筛选出的股票需经过风险过滤。财务风险:剔除ST、*ST、退市整理期股票。审计意见非标、净资产为负、连续亏损的股票排除。流动性风险:日均成交额低于5000万元、换手率低于0.5%的股票剔除。波动风险:20日波动率高于80%分位数的股票限制权重。
可交易性约束包括:
上市时间超过60个交易日,避免次新股异常波动。
当日未停牌且非一字涨跌停。
融券标的需考虑券源可得性,期货对冲则关注基差与保证金。
对于期货交易者,A股可交易股票还需与股指期货、商品期货形成对冲组合。股票多头暴露与IF、IC、IM空头对冲,降低系统性风险。商品期货如螺纹钢、铜与相关股票形成产业链对冲。
多因子打分与组合优化
将有效因子标准化后加权合成综合得分。权重通过等权、IC加权或机器学习方法确定。等权简单稳健,IC加权动态适应市场。机器学习使用随机森林、XGBoost或LightGBM,以因子值为特征,未来收益为标签,训练预测模型。
组合优化在得分排序基础上加入约束。目标函数为最大化预期收益减风险惩罚。约束条件包括:单票权重不超过5%,行业暴露偏离基准不超过3%,跟踪误差低于8%。使用均值-方差优化或风险平价模型。
动态调整频率为周度或月度。调仓时考虑交易成本,单边换手率控制在30%以内。设置止损规则:个股回撤超过15%清仓,组合回撤超过10%减半仓位。
回测与实盘验证
回测使用滚动窗口,训练集3年,验证集1年,测试集1年。避免未来函数,信号生成使用T日收盘数据,T+1日开盘成交。考虑冲击成本与滑点,按成交额0.1%估算。
评价指标包括年化收益、夏普比率、最大回撤、胜率、盈亏比。优秀模型年化收益20%以上,夏普大于1.5,最大回撤低于25%。实盘验证使用模拟盘运行3个月,再投入小资金实盘。监控因子拥挤度与风格漂移,及时调整权重。
期货交易者可将股票组合与股指期货、国债期货联合回测。股票多头与期货空头形成市场中性策略,收益来源为选股Alpha。商品期货与周期股联动,通过库存、基差数据增强信号。
代码演示 因子计算与筛选
以下Python代码展示动量因子计算与可交易股票筛选。
import pandas as pd
import numpy as np
# 假设df包含股票代码、日期、收盘价、成交额、是否停牌
# 计算20日动量
pivot = df.pivot(index='date', columns='code', values='close')
momentum_20 = pivot.pct_change(20)
# 计算20日平均成交额
amount_pivot = df.pivot(index='date', columns='code', values='amount')
avg_amount_20 = amount_pivot.rolling(20).mean()
# 筛选条件
tradeable = pd.DataFrame(index=pivot.index, columns=pivot.columns, data=True)
tradeable &= ~df.pivot(index='date', columns='code', values='is_suspended').fillna(False)
tradeable &= avg_amount_20 > 5e7 # 5000万
# 合成信号
signal = momentum_20.where(tradeable).dropna(how='all')
top_stocks = signal.iloc[-1].nlargest(50).index.tolist()
print(top_stocks)
动态监控与迭代
模型上线后需持续监控因子表现与交易执行。每日计算因子IC,若连续20日IC为负则暂停该因子。每周检查组合行业暴露与风格暴露。每月重新训练机器学习模型,更新因子权重。每季度评估策略容量,避免规模过大导致冲击成本上升。
期货端监控基差、展期成本与保证金比例。股指期货深度贴水时降低对冲比例。商品期货关注库存周期与期限结构,调整相关股票暴露。
通过以上流程,量化模型能够从全市场A股中筛选出可交易、风险可控、收益稳健的股票组合。结合期货工具,进一步实现绝对收益与风险分散。