量化投资基础:金融市场基本概念、股票市场结构、交易机制、数据源与数据类型
量化选股策略的构建,本质上是对市场数据的系统性加工与规律挖掘。在进入策略编写与回测之前,必须建立对金融市场底层运行逻辑的清晰认知。本章将围绕四个核心维度展开:金融市场的基本概念与参与主体、股票市场的层级结构与交易机制、量化研究所依赖的数据源与数据类型,以及这些要素如何共同影响策略的设计边界。理解这些基础,是避免“策略在回测中完美、在实盘中失效”这一常见悲剧的第一道防线。
2.1 金融市场核心概念与参与主体
核心原理:金融市场是资金融通与风险定价的场所,其核心功能在于将资金从盈余方引导至短缺方,并通过价格发现机制为资产定价。对于量化选股而言,最需要关注的是市场的三个基本属性:流动性(资产以合理价格快速成交的能力)、波动性(价格变动的剧烈程度)与市场深度(大额订单对价格的影响程度)。这三个属性直接决定了策略的容量上限与交易成本。
市场有效性假说(EMH)是量化投资的理论基石之一。弱式有效市场下,技术分析无效;半强式有效市场下,基本面分析无效;强式有效市场下,内幕信息也无超额收益。实际A股市场处于弱式到半强式之间,这意味着基于历史价格和公开财务数据的量化策略仍有生存空间,但超额收益会随着市场成熟而衰减。
2.2 股票市场结构与交易机制
市场层级:A股市场呈现“交易所+场外”的双层结构。沪深交易所为主板、科创板、创业板提供集中竞价交易;北交所服务创新型中小企业;场外市场包括新三板和区域性股权市场。不同板块在上市门槛、投资者适当性、涨跌幅限制上存在显著差异,这直接影响量化策略的选股池构建。
交易机制要点:
- 交易时间:连续竞价时段为9:30-11:30、13:00-15:00,集合竞价时段为9:15-9:25(开盘)和14:57-15:00(收盘)。量化策略需考虑集合竞价期间的流动性稀缺问题。
- T+1制度:当日买入股票次日方可卖出,这限制了日内高频策略的实施,但为隔夜持仓策略提供了制度基础。
- 涨跌停限制:主板±10%,科创板/创业板±20%,ST股±5%。涨跌停会导致价格发现中断,策略需处理“一字板无法买入”或“跌停无法卖出”的极端场景。
- 订单类型:限价单、市价单(最优五档即时成交剩余撤销等)、FOK(全部成交或立即撤销)、FAK(立即成交剩余撤销)。量化交易系统通常使用限价单控制滑点。
| 交易要素 | 主板 | 科创板/创业板 | 对量化策略的影响 |
|---|---|---|---|
| 涨跌幅限制 | ±10% | ±20% | 高波动板块需调整止损阈值 |
| 最小交易单位 | 100股(1手) | 200股起,超过200股可1股递增 | 影响资金分配精度 |
| 交易费用 | 佣金+印花税(卖出0.05%) | 同左 | 高频策略需精确建模成本 |
| 做市商机制 | 无(竞价交易) | 科创板引入做市商 | 做市商提供流动性,影响盘口形态 |
2.3 数据源与数据类型
数据分类体系:量化选股所需数据可分为四大类:行情数据(量价信息)、基本面数据(财务报表、估值指标)、预期数据(分析师一致预期)、另类数据(舆情、资金流、供应链关系等)。数据质量与覆盖度直接决定策略的可靠性。
行情数据层级:
- L1数据(Level-1):包含最新价、成交量、成交额、买卖五档。适用于日频或低频策略。
- L2数据(Level-2):包含逐笔成交、十档行情、委托队列。适用于高频策略和冲击成本建模。
- 分钟线/日线:由逐笔数据聚合而成,需注意复权处理(前复权/后复权)对收益率计算的影响。
财务数据要点:财务报表存在发布滞后性(年报最迟4月30日),策略需使用“实际可获取”的数据,避免前视偏差。例如,若策略在3月使用年报数据,但年报尚未发布,则属于数据泄漏。
2.4 数据清洗与预处理流程
操作流程:原始数据必须经过清洗才能用于因子计算。标准流程包括:
- 去重与对齐:处理停牌、退市、新股上市等特殊状态,统一股票代码与时间戳格式。
- 异常值处理:剔除价格小于0、成交量异常跳变(如除权除息未复权)等错误数据。
- 缺失值填充:财务数据缺失时,可采用前向填充(使用最近一期已披露数据)或行业均值填充。
- 复权处理:计算收益率必须使用后复权价格,避免除权导致的虚假价格跳变。
- 幸存者偏差控制:数据池必须包含已退市股票,否则回测结果会高估策略收益。
# 数据清洗示例(Python伪代码)
import pandas as pd
# 假设df为原始行情数据,包含股票代码、日期、收盘价
df['close_adj'] = df.groupby('code')['close'].apply(adjust_for_split) # 复权处理
df = df[df['volume'] > 0] # 剔除停牌日
df = df[~df['code'].isin(st_list)] # 剔除ST股
df = df.sort_values(['code', 'date']).reset_index(drop=True)
df['return'] = df.groupby('code')['close_adj'].pct_change() # 计算收益率
2.5 案例拆解:数据问题导致策略失效的复盘
背景与约束:某量化团队开发了一个基于“净利润同比增长率”的选股策略,回测年化收益达25%。但在实盘运行3个月后,策略表现显著低于回测,年化收益仅8%。团队开始排查原因。
初始现象与关键数据:回测期间(2018-2022)策略月度胜率约65%,实盘期间(2023年1-3月)胜率降至45%。对比回测与实盘的持仓股票,发现实盘持仓中出现了多只“业绩暴雷”股票——这些股票在财报发布后股价大幅下跌。
分析判断过程:团队检查数据流水线后发现两个问题:
- 前视偏差:回测中使用了“报告期”净利润数据,而非“公告日期”数据。例如,2022年一季报实际公告日为4月20日,但回测在4月1日就使用了该数据。
- 幸存者偏差:回测数据池剔除了2022年后退市的股票,而这些退市股中多数业绩较差,恰好是策略会选中的标的。
实际操作步骤:团队修正了数据对齐逻辑,将财务数据按公告日期映射到交易日;重新从交易所获取包含退市股的完整股票列表;在回测中增加“财报发布后首个交易日才能使用新数据”的约束条件。
结果对比:修正后回测年化收益从25%降至14%,但实盘与回测的收益差距缩小至2个百分点以内。策略的月度胜率在实盘中恢复至58%。
风险与代价:数据修正过程耗时2周,期间策略暂停交易。但避免了继续使用错误信号导致的更大亏损。
复盘经验:数据质量是量化策略的生命线。团队建立了数据质量监控看板,每日检查数据更新延迟、异常值比例、复权因子变动等指标。任何数据源变更必须经过回测验证后才能上线。
2.6 常见误区与总结复盘
| 误区类型 | 具体表现 | 后果 | 正确做法 |
|---|---|---|---|
| 数据前视 | 使用未来数据(如未公告的财报) | 回测虚高,实盘失效 | 严格按公告日期对齐数据 |
| 幸存者偏差 | 数据池仅包含现存股票 | 高估策略收益与夏普比率 | 纳入已退市股票 |
| 忽略交易成本 | 回测未计入佣金、印花税、滑点 | 高频策略实盘亏损 | 按策略频率建模成本 |
| 涨跌停处理不当 | 未过滤无法成交的涨跌停日 | 信号无法执行 | 回测中标记不可交易状态 |
| 数据频率不匹配 | 日频策略使用分钟线数据 | 过度拟合噪声 | 策略频率与数据频率一致 |