From d4bf60767e602cd205c91c530bceea8278a2b105 Mon Sep 17 00:00:00 2001 From: tigerenwork Date: Sun, 31 May 2026 17:03:27 +0800 Subject: [PATCH] =?UTF-8?q?Add=20comprehensive=20A=E8=82=A1=E9=87=8F?= =?UTF-8?q?=E5=8C=96=E4=BA=A4=E6=98=93=E5=AE=9E=E8=B7=B5=E6=8C=87=E5=8D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Introduced a detailed guide for beginners transitioning from demo to real trading in the A股 market. - Included sections on unique A股 trading rules, backtesting pitfalls, risk management, real data integration, fundamental factors, execution strategies, recommended tools, and a complete learning path. - Highlighted critical areas for new traders to focus on, including T+1 settlement, trading costs, and the importance of risk management. - Provided practical examples and code snippets for data access and processing using popular libraries. --- doc_06_astock_practice_guide.md | 850 ++++++++++++++++++++++++++++++++ 1 file changed, 850 insertions(+) create mode 100644 doc_06_astock_practice_guide.md diff --git a/doc_06_astock_practice_guide.md b/doc_06_astock_practice_guide.md new file mode 100644 index 0000000..73bdc6a --- /dev/null +++ b/doc_06_astock_practice_guide.md @@ -0,0 +1,850 @@ +# A 股量化交易:从学习到实盘的完整路径 +## 学习路径规划与注意事项指南 + +> **定位**:本文档是整个演示系列的"导航图",帮助已完成五篇 Demo 学习的入门者,规划从学习到 A 股实盘的完整路径,并系统指出当前 Demo 的局限性与实盘中必须注意的陷阱。 +> **目标读者**:量化入门者,主要关注中国 A 股市场 +> **关键提示**:本文中所有带 ⚠️ 标记的内容,是初学者最容易踩坑的地方 + +--- + +## 目录 + +1. [当前五篇 Demo 的知识地图](#1-当前五篇-demo-的知识地图) +2. [A 股特有规则:Demo 与现实的差距](#2-a-股特有规则demo-与现实的差距) +3. [回测七大陷阱](#3-回测七大陷阱) +4. [风险管理:能否活到盈利那天](#4-风险管理) +5. [真实数据接入](#5-真实数据接入) +6. [基本面因子:价格因子的补充](#6-基本面因子) +7. [执行层:从信号到成交](#7-执行层从信号到成交) +8. [推荐工具与平台](#8-推荐工具与平台) +9. [完整学习与实践路径](#9-完整学习与实践路径) +10. [心理与纪律:最后也是最重要的](#10-心理与纪律) + +--- + +## 1. 当前五篇 Demo 的知识地图 + +### 1.1 已完成的内容 + +``` +┌─────────────────────────────────────────────────────────────┐ +│ 量化交易知识体系 │ +│ │ +│ ✅ 第1篇 数据管道 ← 原始数据清洗、复权、收益率计算 │ +│ ✅ 第2篇 策略与向量化回测 ← 技术指标、策略逻辑、绩效评估 │ +│ ✅ 第3篇 事件驱动回测 ← 模拟真实撮合、成本模型 │ +│ ✅ 第4篇 Alpha 因子研究 ← IC/ICIR、分层回测、因子合成 │ +│ ✅ 第5篇 组合优化 ← MVO、风险平价、Black-Litterman │ +└─────────────────────────────────────────────────────────────┘ +``` + +### 1.2 五篇 Demo 解决了什么问题? + +| Demo | 解决的核心问题 | +|------|---------------| +| 数据管道 | 如何把原始价格数据处理成可用的研究数据 | +| 策略回测 | 如何验证一个交易规则在历史上是否有效 | +| 事件驱动回测 | 如何更真实地模拟实际交易过程 | +| Alpha 因子 | 如何发现能预测未来收益的"信号" | +| 组合优化 | 如何科学地分配多只股票的权重 | + +### 1.3 五篇 Demo 没有解决的问题 + +``` +❌ A 股特有的交易规则(T+1、涨跌停、印花税) +❌ 回测结果是否可信(幸存者偏差、过拟合等) +❌ 如果亏损了怎么控制损失(风险管理) +❌ 如何接入真实市场数据 +❌ 实际下单时价格和预期不一样怎么办(执行摩擦) +❌ 用财报数据选股(基本面因子) +``` + +**这些缺失的内容,恰恰是从"Demo 世界"走向"真实 A 股"最关键的桥梁。** + +--- + +## 2. A 股特有规则:Demo 与现实的差距 + +> ⚠️ **这是全文最重要的章节**。 +> 当前五篇 Demo 均使用合成数据,在"理想世界"中运行,与 A 股真实交易规则存在根本性差异。 + +### 2.1 T+1 交割制度 + +**规则**:今天(T 日)买入的股票,**最早在 T+1 日才能卖出**。 + +``` +对比: + 美股 / 港股: T+0(当天买当天可以卖) + 中国 A 股: T+1(今天买,明天才能卖) + + 例外:科创板、创业板可以融券做空(但普通投资者很难操作) + 例外:ETF(交易型基金)支持 T+0 操作 +``` + +**对量化策略的影响**: + +| 策略类型 | 影响 | +|---------|------| +| 日内交易(Day Trading)| **完全不可行** — 日内无法平仓 | +| 日频换仓策略 | 需重新考虑成本,换仓频率受限 | +| 反转策略 | 信号当天无法止损,下跌风险暴露更大 | +| 动量策略 | 相对友好,持有周期通常 > 1 天 | + +> 💡 **建议**:初学者应聚焦在**持仓周期 ≥ 5 天**的策略,让 T+1 的影响尽量小。 + +### 2.2 涨跌停板制度 + +**规则**:A 股每日价格变动有上限: +- 主板(沪深主板):上下 **±10%** +- 科创板(STAR Market)/ 创业板(ChiNext):上下 **±20%** +- ST 股(特别处理股票):上下 **±5%** + +**对回测的严重影响**: + +``` +场景1: 你的策略在 T 日发出"卖出"信号 + 但 T+1 日开盘直接跌停(-10%) + 跌停板无买家,当天根本无法成交! + → 回测用收盘价计算"已成交"是完全错误的 + +场景2: 你买入一只股票,连续多个涨停板 + 每天想追买却买不到 + → 回测"买入成功"但现实中不可能成功 +``` + +**解决方案**:在回测中增加"涨跌停过滤"逻辑: + +```python +# 示例:过滤掉当天涨停的股票(无法以涨停价买入) +def is_limit_up(price_today, price_yesterday, limit=0.10): + return price_today >= price_yesterday * (1 + limit - 0.001) + +def is_limit_down(price_today, price_yesterday, limit=0.10): + return price_today <= price_yesterday * (1 - limit + 0.001) + +# 如果要买入但已涨停 → 放弃或等待次日 +# 如果要卖出但已跌停 → 无法成交,记录为"滞留持仓" +``` + +### 2.3 交易成本:远比想象的高 + +A 股的完整交易成本结构: + +| 成本类型 | 费率 | 收取方 | 说明 | +|---------|------|--------|------| +| **印花税**(Stamp Duty)| **0.1%**(单边) | 国家 | **仅卖出时收取**,买入不收 | +| 证券交易佣金(Commission)| 0.02%~0.03% | 券商 | 买卖都收,部分券商有最低佣金(5 元/笔)| +| 过户费(Transfer Fee)| 0.002%(沪市)| 交易所 | 仅上海证券交易所收取 | +| 融资利率(Margin Interest)| 5%~8%(年化)| 券商 | 使用融资买入时额外收取 | + +**单次完整交易的总成本(买入+卖出)**: + +``` +总成本 ≈ 0.1%(印花税卖) + 0.03%×2(佣金买卖) + 0.002%(过户费沪市) + ≈ 0.164%(单次来回) + +如果月换手1次(年化12次): + 年化交易成本 ≈ 0.164% × 12 ≈ 2.0% + +如果月换手4次(每周换仓): + 年化交易成本 ≈ 0.164% × 48 ≈ 7.9% ← 严重侵蚀收益! +``` + +> ⚠️ **关键认知**:一个"回测年化收益 15%"的策略,如果实际年化换手率为 600%(每月换仓100%),交易成本就接近 10%,实盘收益只剩约 5%。 + +### 2.4 A 股没有做空机制(对普通投资者) + +| 市场 | 做空机制 | +|------|---------| +| 美股 | 融券做空广泛可行,成本低 | +| 港股 | 大部分股票可以融券做空 | +| A 股主板 | **普通投资者基本无法做空个股** | +| A 股(股指期货)| 可以通过沪深300、中证500期货做空指数 | + +**对 Demo 的直接影响**:第4篇(Alpha 因子)§9 展示的"多空组合年化 33%"在 A 股完全无法直接复制。 + +**A 股量化投资者的变通方案**: +1. **多头因子策略**:只做多高分股票,不做空低分股票(损失多空价差) +2. **股指期货对冲**:买入个股组合 + 做空沪深300期货(对冲系统性风险) +3. **中性化**:权重设计时尽量减少市场 Beta 暴露 + +### 2.5 其他 A 股特有规则 + +| 规则 | 内容 | 量化影响 | +|------|------|---------| +| **停牌制度**(Suspension)| 重大事件期间股票可长期停牌(数天至数月)| 持仓被锁,无法止损 | +| **退市制度**(Delisting)| 连续亏损等情形会退市 | 回测数据需包含已退市股票 | +| **集合竞价**(Call Auction)| 09:25前委托,09:30后才成交 | 开盘价 ≠ 信号时点价格 | +| **大宗交易**(Block Trade)| 大额交易需走特殊通道 | 大资金策略容量受限 | +| **北向资金**(Northbound)| 陆股通资金流向影响 A 股短期走势 | 可作为情绪指标 | + +--- + +## 3. 回测七大陷阱 + +> ⚠️ 一个漂亮的回测曲线,可能只是一个"谎言"。在信任任何回测结果之前,必须对以下七个陷阱逐一排查。 + +### 陷阱1:幸存者偏差(Survivorship Bias) + +**问题**:如果你的股票池只包含"今天仍在交易的股票",就自动排除了所有在回测期间**退市、被 ST、长期停牌**的股票——而这些正是最差的股票。 + +``` +错误做法(Demo 中的做法): + 2025年选取50只股票池 → 回测2020-2025年 + 这50只股票全部存活到2025年,已经是幸存者! + 那些2022年退市的烂股,从股票池中消失了 + +正确做法: + 回测2020年时,股票池应该是"2020年可投资的全部股票" + 包括后来退市的股票 +``` + +**A 股幸存者偏差的严重程度**:每年有数十只股票退市或被 ST,每年也有数百只新股上市(IPO)。忽略退市/ST 股票,策略的真实表现会被高估约 **1-3%/年**。 + +### 陷阱2:前视偏差(Look-Ahead Bias) + +**问题**:在回测中使用了"当时还不可能知道"的数据。 + +``` +常见案例: + ① 财报前视偏差: 用"第三季度财报数据"买入, + 但第三季度财报通常10月底才发布 + → 9月份就用了10月才有的数据 ✗ + + ② 复权前视偏差: 用"前复权"价格回测时, + 历史价格会因未来的分红而被修改 + → 用了未来分红信息 ✗(需用后复权或不复权) + + ③ 指数成分前视偏差: 用"当前沪深300成分股"回测历史, + 但该成分股是现在才进入的 + → 历史上你不可能知道它会进入 ✗ +``` + +**A 股财报披露时间表**(设计因子时必须遵守): + +| 财报类型 | 披露截止日 | +|---------|-----------| +| 年报(Annual Report)| 次年 **4月30日** 前 | +| 一季报(Q1)| **4月30日** 前 | +| 半年报(Interim)| **8月31日** 前 | +| 三季报(Q3)| **10月31日** 前 | + +> 💡 **规则**:使用财报数据时,必须在**披露截止日 + 1 天**之后才能"知道"该数据。 + +### 陷阱3:过度拟合(Overfitting) + +**问题**:在历史数据上反复调整参数,找到"完美契合历史"的组合,但这个组合实质上只是在记忆历史噪音,而非真正发现了规律。 + +``` +典型案例: + 参数空间: MA 短窗口 5~30,长窗口 20~120 + 遍历 26×101 = 2626 个参数组合 + 每次都在同一段历史数据上计算夏普比率 + 最终选出夏普最高的那对参数 + + → 这对参数只是恰好适合这段历史,样本外可能是最差的 +``` + +**检验方法**: + +``` +正确的参数验证流程: + │─────── 训练集 70% ─────────│── 验证集 15% ──│── 测试集 15% ──│ + ↑ ↑ ↑ + 调参优化 选择最终参数 只用一次! + (评估真实表现) + +测试集只能使用一次:使用后就"消耗"了,不能再用它来调参 +``` + +### 陷阱4:数据窥探偏差(Data Snooping Bias) + +**问题**:学术界或行业内已发表了数百种"有效"因子,但这些因子大多是在相同的历史数据上发现并验证的。这种"挖矿"行为本身就引入了偏差——即使随机策略,也总能找到少数"偶然有效"的参数。 + +**量化估算**:如果测试 100 个随机策略,在 5% 显著性水平下,期望有 5 个"偶然"通过检验。 + +**防范建议**: +- 策略应有明确的经济学逻辑,而不仅是统计拟合 +- 在不同市场/时间段进行样本外验证 +- 使用更严格的统计显著性阈值(如 1%) +- 报告所有尝试过的策略,而非只报告成功的 + +### 陷阱5:市场冲击忽略(Ignoring Market Impact) + +**问题**:回测假设可以在任何时间以收盘价无限量成交,但现实中大额买卖会推动价格。 + +``` +例子: + 某策略买入信号出现在收盘后 + 次日买入该股票 10,000 股(市值 50 万元) + 该股票日均成交额 200 万元 + → 你的买单占了日成交量的 25%! + → 你的买入行为会把价格推高 1-3%(市场冲击成本) +``` + +**A 股容量限制**: +- 小盘股(日均成交额 500 万以下):策略容量 < 50 万 +- 中盘股(日均成交额 5000 万):策略容量 < 500 万 +- 大盘股(日均成交额 1 亿+):策略容量 > 1000 万 + +### 陷阱6:未来函数(Future Function) + +**问题**:代码层面的 Bug,使得某个时刻用到了它"不应该知道"的数据。 + +```python +# 错误示例(常见 Bug): +signal = df['close'].rolling(20).mean() # 计算20日均线 +# 问题: pandas 默认使用当日收盘价在内的20天! +# 如果在开盘时交易,当日收盘价还不知道 + +# 正确写法: 信号基于前一日的完整数据 +signal = df['close'].shift(1).rolling(20).mean() # shift(1) 使用昨日收盘 +``` + +### 陷阱7:交易成本低估(Underestimating Costs) + +如上文 §2.3 所述。很多初学者的回测根本不扣除成本,或只扣佣金而忽略印花税。 + +**建议的保守成本设定**(适用于 A 股散户量化): + +| 换仓频率 | 建议预留成本 | 对应净年化阈值 | +|---------|------------|--------------| +| 月频(每月一次)| 0.3%/次 | 策略年化 > 4% 才有意义 | +| 周频(每周一次)| 0.3%/次 | 策略年化 > 16% 才有意义 | +| 日频(每天换仓)| 0.3%/次 | 策略年化 > 78% 才有意义(基本无法盈利)| + +--- + +## 4. 风险管理 + +> ⚠️ **风险管理是量化投资中最被低估、最重要的内容。** +> 一个 "普通好" 的策略 + 优秀的风险管理 > 一个 "非常好" 的策略 + 没有风险管理。 + +### 4.1 为什么风险管理是第一位的? + +``` +数学现实: + 亏损 50% → 需要盈利 100% 才能回本 + 亏损 30% → 需要盈利 43% 才能回本 + 亏损 20% → 需要盈利 25% 才能回本 + +结论: 不亏钱比赚钱更重要。大亏损后的"恢复期"可能长达数年。 +``` + +### 4.2 仓位管理(Position Sizing) + +**固定比例法(Fixed Fractional)**:每笔交易不超过总资产的固定比例。 + +```python +# 每笔交易最多动用总资产的 N% +MAX_POSITION_PCT = 0.05 # 每只股票最多 5% +MAX_PORTFOLIO_PCT = 0.80 # 总仓位最高 80%(留 20% 现金) + +shares_to_buy = int(capital * MAX_POSITION_PCT / price) +``` + +**Kelly 公式**(理论最优仓位): + +$$f^* = \frac{p \cdot b - q}{b}$$ + +其中 $p$ = 胜率,$q = 1-p$ = 败率,$b$ = 盈亏比(平均盈利/平均亏损)。 + +> 💡 **实践建议**:Kelly 仓位往往偏激进,实际使用"半 Kelly"($0.5 \times f^*$)更稳健。 + +### 4.3 止损机制(Stop-Loss) + +| 止损类型 | 触发条件 | 适用场景 | +|---------|---------|---------| +| 硬止损(Hard Stop)| 亏损超过固定百分比(如 -8%)立即止损 | 所有策略都应有 | +| 追踪止损(Trailing Stop)| 从最高点回落超过固定幅度(如 -15%)| 趋势策略 | +| 时间止损(Time Stop)| 持仓超过预期天数但未达到目标,离场 | 短期策略 | +| 组合止损(Portfolio Stop)| 整体组合单日/单月亏损超阈值,全部减仓 | 所有策略 | + +**A 股止损的特殊考量**: +- 涨跌停板可能导致**止损单无法成交**(挂单但无法匹配) +- 解决方案:止损条件触发后,设置"次日开盘卖出"而非"即刻市价单" + +### 4.4 最大回撤控制(Max Drawdown Control) + +```python +# 监控组合回撤,超过阈值自动降仓 +def compute_drawdown(nav_series): + rolling_max = nav_series.cummax() + drawdown = nav_series / rolling_max - 1.0 + return drawdown + +MAX_DD_THRESHOLD = -0.15 # 回撤超过 15% → 降至半仓 +STOP_DD_THRESHOLD = -0.25 # 回撤超过 25% → 清仓,停止交易 + +current_dd = compute_drawdown(portfolio_nav) +if current_dd < STOP_DD_THRESHOLD: + # 发出清仓信号,停止策略运行 + pass +elif current_dd < MAX_DD_THRESHOLD: + # 将所有仓位减半 + pass +``` + +### 4.5 VaR 与 CVaR(风险度量) + +**在险价值 VaR (Value at Risk)**:在给定置信水平下,**未来某段时间内可能损失的最大金额**。 + +$$\text{VaR}_{95\%,1D} = -\text{Percentile}_{5\%}(r_{daily}) \times \text{Portfolio Value}$$ + +含义:有 95% 的把握,明天的损失不超过这个金额。 + +**条件在险价值 CVaR / ES (Conditional VaR / Expected Shortfall)**: + +$$\text{CVaR}_{95\%} = -E[r \mid r < \text{VaR}_{5\%}]$$ + +含义:当损失超过 VaR 时,**平均损失有多大**。CVaR 比 VaR 更保守,更适合度量尾部风险。 + +```python +import numpy as np + +def compute_var_cvar(daily_returns, confidence=0.95): + var = -np.percentile(daily_returns, (1 - confidence) * 100) + cvar = -daily_returns[daily_returns < -var].mean() + return var, cvar + +var_95, cvar_95 = compute_var_cvar(portfolio_returns) +print(f"日 VaR(95%): 损失超过 {var_95:.2%} 的概率 < 5%") +print(f"日 CVaR(95%): 当超过 VaR 时,平均损失 {cvar_95:.2%}") +``` + +--- + +## 5. 真实数据接入 + +### 5.1 主要数据源对比 + +| 数据源 | 费用 | 数据质量 | A 股覆盖 | 适合用途 | +|--------|------|---------|---------|---------| +| **AKShare** | 免费 | 中等 | 全覆盖 | 学习、价格/财务数据 | +| **Tushare Pro** | 免费(积分制) | 较高 | 全覆盖 | 学习到轻量实战 | +| **聚宽 JoinQuant** | 免费额度 | 高 | 全覆盖 | 回测研究 | +| **掘金量化** | 付费/免费模拟 | 高 | 全覆盖 | 模拟盘到实盘 | +| **Wind** | 付费(贵)| 最高 | 最全 | 专业机构 | +| **同花顺 iFinD** | 付费 | 高 | 全覆盖 | 专业机构 | + +**入门推荐路线**: + +``` +第一阶段(纯学习): AKShare(完全免费) + ↓ +第二阶段(研究): Tushare Pro(免费注册,积分获取数据) + ↓ +第三阶段(模拟盘): 聚宽 / 掘金量化(含模拟交易环境) + ↓ +第四阶段(实盘): 券商 API(XTP / CTP)或 vnpy 框架 +``` + +### 5.2 AKShare 快速上手示例 + +```python +import akshare as ak + +# 获取 A 股日线行情(前复权) +df = ak.stock_zh_a_hist( + symbol="000001", # 平安银行 + period="daily", + start_date="20230101", + end_date="20231231", + adjust="qfq" # qfq = 前复权 / hfq = 后复权 +) + +# 获取沪深300成分股列表 +hs300 = ak.index_stock_cons(symbol="000300") + +# 获取 A 股财务数据(资产负债表) +balance_sheet = ak.stock_financial_abstract_ths(symbol="000001", indicator="资产负债表") +``` + +### 5.3 Tushare Pro 快速上手示例 + +```python +import tushare as ts + +# 初始化(需要注册获取 token) +pro = ts.pro_api('your_token_here') + +# 获取日线行情 +df = pro.daily( + ts_code='000001.SZ', # 深圳股票加 .SZ,上海加 .SH + start_date='20230101', + end_date='20231231' +) + +# 获取所有 A 股列表(含已退市,解决幸存者偏差) +stocks = pro.stock_basic( + exchange='', # 不指定则获取全部 + list_status='L', # L=上市中 D=退市 P=暂停 + fields='ts_code,symbol,name,area,industry,list_date,delist_date' +) + +# 获取财务数据(解决前视偏差,有 ann_date 披露日字段) +income = pro.income( + ts_code='000001.SZ', + fields='ts_code,ann_date,end_date,total_revenue,net_income' +) +# ann_date: 实际公告日期(用这个!) +# end_date: 报告期截止日(用于标识是哪个季度) +``` + +### 5.4 数据处理中必须处理的 A 股特有问题 + +**问题1:退市股票的幸存者偏差** +```python +# 获取所有股票(包括退市的),按照每个历史时点重建股票池 +all_stocks = pro.stock_basic(list_status='L') # 上市中 +delisted = pro.stock_basic(list_status='D') # 已退市 +# 合并后,在回测中对每个历史日期,只使用"当时已上市未退市"的股票 +``` + +**问题2:财报披露延迟** +```python +# 使用 ann_date(公告日)而非 end_date(报告期末) +# 这确保你只在数据公开披露后才能"看到"它 +df = df.sort_values('ann_date') +# 在回测中,只使用 ann_date <= 当前回测日期 的财报数据 +``` + +**问题3:ST 股过滤** +```python +# ST、*ST 股票风险极高,通常需要过滤掉 +is_st = df['name'].str.contains('ST') +df_clean = df[~is_st] +``` + +--- + +## 6. 基本面因子 + +### 6.1 为什么需要基本面因子? + +当前 Demo 中的五个因子(MOM、REV、LVOL、BAB、ILLIQ)全部基于**价格和成交量**,称为"技术因子"或"量价因子"。 + +基本面因子(Fundamental Factors)基于公司财务数据,反映公司的内在价值: + +| 因子类型 | 数据来源 | 信号持续性 | 换仓频率 | +|---------|---------|----------|---------| +| 量价因子(技术因子)| 日线行情 | 1天~3个月 | 日频~月频 | +| 基本面因子 | 财务报表 | 3个月~数年 | 季频~年频 | + +### 6.2 主要基本面因子一览 + +**价值类因子(Value Factors)**: + +| 因子 | 公式 | 含义 | +|------|------|------| +| B/P(账净比)| 净资产 / 市值 | 越高越"便宜"(价值股)| +| E/P(盈市比)| 净利润 / 市值 | 越高越低估 | +| S/P(营收市值比)| 营业收入 / 市值 | 避免亏损股影响 | +| EBITDA/EV | EBITDA / 企业价值 | 更完整的估值指标 | + +**质量类因子(Quality Factors)**: + +| 因子 | 公式 | 含义 | +|------|------|------| +| ROE | 净利润 / 净资产 | 股东权益回报率 | +| ROA | 净利润 / 总资产 | 资产回报率 | +| 毛利率 | 毛利润 / 营业收入 | 定价能力 | +| 应计比率(Accrual)| (净利润 - 经营现金流) / 总资产 | 低值 = 利润质量高 | + +**成长类因子(Growth Factors)**: + +| 因子 | 含义 | +|------|------| +| 营收同比增速 | 当季营收 vs 去年同季 | +| 净利润 YoY | 净利润年同比增速 | +| 超预期盈利(SUE)| (实际盈利 - 预期盈利) / 波动率 | + +### 6.3 A 股基本面因子的特殊性 + +1. **季节性强**:A 股年报集中在 3-4 月披露,导致每年 4 月底有明显的"财报效应" +2. **财务造假风险**:A 股部分公司财报质量较差,需要交叉验证(对比现金流) +3. **ROE 的 DuPont 分解**更有用:`ROE = 净利率 × 资产周转率 × 杠杆比率` + +--- + +## 7. 执行层:从信号到成交 + +### 7.1 信号 → 成交的完整链路 + +``` + 信号生成 订单生成 执行 成交 +策略逻辑 → "买入 S01" → 下市价单 → 发送到交易所 → 实际成交 + ↓ + 时间延迟 / 滑点 / 市场冲击 +``` + +### 7.2 滑点(Slippage) + +**定义**:实际成交价格与信号触发时预期价格之间的差异。 + +**主要来源**: +- 时间延迟:从信号生成到订单到达交易所需要时间 +- 买卖价差(Bid-Ask Spread):买价总高于卖价 +- 订单流向:你的订单与其他订单竞争,推动价格 + +**A 股典型滑点估算**(中小盘股):0.1%~0.3% 单边 + +**在回测中模拟滑点**: + +```python +SLIPPAGE_RATE = 0.002 # 0.2% 单边滑点 + +# 买入时支付更高价格 +actual_buy_price = signal_price * (1 + SLIPPAGE_RATE) + +# 卖出时收到更低价格 +actual_sell_price = signal_price * (1 - SLIPPAGE_RATE) +``` + +### 7.3 A 股的订单类型 + +| 订单类型 | 说明 | 优点 | 缺点 | +|---------|------|------|------| +| 限价单(Limit Order)| 指定价格,不成交则等待 | 价格确定 | 可能无法成交 | +| 市价单(Market Order)| 以当前最优价立即成交 | 必定成交 | 价格不确定,滑点大 | +| 最优五档即时成交 | A 股特有,匹配5档后剩余撤销 | 平衡 | 大单可能只成交部分 | + +**量化策略推荐**:使用**限价单**(设置在当前卖一价或稍微高一点),避免市价单的大滑点。 + +### 7.4 算法交易(Algorithmic Execution) + +对于资金量较大的策略,需要将大单拆分执行,避免冲击市场: + +| 算法 | 全称 | 适用场景 | +|------|------|---------| +| VWAP | Volume-Weighted Average Price(成交量加权均价)| 跟踪市场均价,减少冲击 | +| TWAP | Time-Weighted Average Price(时间加权均价)| 均匀分散,简单易实现 | +| POV | Percentage of Volume(跟量执行)| 按市场成交量的固定比例跟随 | + +--- + +## 8. 推荐工具与平台 + +### 8.1 编程框架 + +| 框架 | 语言 | 特点 | 适用阶段 | +|------|------|------|---------| +| **vnpy** | Python | 国内最流行的量化框架,支持多个券商 API | 进阶→实盘 | +| **backtrader** | Python | 成熟的回测框架,社区活跃 | 学习→回测 | +| **zipline** | Python | Quantopian 开源,学术界常用 | 学习→回测 | +| **qlib** | Python | 微软开源,机器学习量化框架 | 进阶研究 | + +### 8.2 研究与回测平台(含数据) + +| 平台 | 费用 | 特点 | 推荐程度 | +|------|------|------|---------| +| **聚宽 JoinQuant** | 免费额度 | 数据+回测一体,适合 A 股 | ⭐⭐⭐⭐⭐(首推)| +| **掘金量化** | 免费+付费 | 支持模拟盘/实盘,数据全 | ⭐⭐⭐⭐⭐(首推)| +| **优矿 UqerIO** | 部分免费 | 与万得数据合作,数据质量高 | ⭐⭐⭐⭐ | +| **米筐 RiceQuant** | 部分免费 | Ricequant 系,稳定 | ⭐⭐⭐ | + +### 8.3 实盘接入(进阶) + +| 接口 | 说明 | +|------|------| +| **XTP(极速交易平台)**| 中泰证券开放的高性能交易接口,vnpy 支持 | +| **CTP(综合交易平台)**| 主要用于期货/期权,上期所/中金所标准接口 | +| **QMT(量化迷你终端)**| 部分券商提供,适合散户量化(如华泰、国金)| +| **miniQMT** | QMT 的轻量版,支持 Python 调用,适合个人 | + +### 8.4 必读书单 + +| 书名 | 作者 | 重点内容 | 适合阶段 | +|------|------|---------|---------| +| 《量化投资:以 Python 为工具》| 蔡立耑 | 入门,代码实践 | 入门 | +| 《主动投资组合管理》| Grinold & Kahn | 因子模型、信息比率 | 进阶 | +| 《Advances in Financial Machine Learning》| Marcos López | 机器学习 + 量化陷阱 | 进阶 | +| 《打败市场的小书》| Joel Greenblatt | 基本面量化思维 | 入门 | +| 《风险、不确定性与利润》| Frank Knight | 理解真正的风险 | 思想基础 | + +--- + +## 9. 完整学习与实践路径 + +### 9.1 路径总览图 + +``` +阶段0: 理论基础(已完成 ✅) +├── 数据管道 +├── 策略与回测 +├── 事件驱动回测 +├── Alpha 因子研究 +└── 组合优化 + + ↓ 当前位置 + +阶段1: 补充关键知识(建议 1-2 个月) +├── 学习 A 股规则(本文档) +├── 回测陷阱专项学习 +└── 风险管理基础 + + ↓ + +阶段2: 真实数据研究(建议 2-3 个月) +├── 接入 Tushare/AKShare +├── 用真实 A 股数据复现 Demo +├── 验证因子在真实数据上的有效性 +└── 发现并修正前视偏差/幸存者偏差 + + ↓ + +阶段3: 模拟盘验证(建议 3-6 个月) +├── 在聚宽/掘金搭建完整策略 +├── 上线模拟盘(实时信号,不用真钱) +├── 记录实际信号 vs 回测信号的差异 +└── 评估交易成本的真实影响 + + ↓ + +阶段4: 小资金实盘(建议先用 1-5 万元) +├── 目的:学习,不是赚钱 +├── 体验 T+1、涨跌停的实际影响 +├── 建立完整的交易记录与复盘习惯 +└── 以月为单位评估策略,不要日内焦虑 + + ↓ + +阶段5: 策略完善与扩大 +├── 根据实盘经验修正回测假设 +├── 逐步增加资金(只用"闲钱") +└── 持续研究新因子,维持策略有效性 +``` + +### 9.2 阶段1:补充关键知识(推荐 Demo 顺序) + +| 优先级 | 建议主题 | 核心内容 | +|--------|---------|---------| +| 🔴 必做 | **A 股回测陷阱与真实成本** | T+1 模拟、涨跌停过滤、完整成本扣除 | +| 🔴 必做 | **风险管理专题** | 仓位管理、止损、VaR/CVaR、回撤控制 | +| 🟡 重要 | **基本面因子研究** | PE/PB/ROE 因子,财报时间处理 | +| 🟡 重要 | **真实数据管道** | Tushare/AKShare 接入,解决幸存者偏差 | +| 🟢 选做 | **机器学习选股** | 随机森林、GBDT 预测收益 | +| 🟢 选做 | **市场情绪与另类数据** | 新闻情感分析、北向资金、融资融券 | + +### 9.3 阶段2:用真实数据验证 + +**验证流程**: + +``` +① 选择标准化 A 股股票池: + • 沪深300成分股(流动性好,容易成交) + • 中证500成分股(中盘,Alpha 机会更多) + • 全 A 股(完整,但需处理幸存者偏差) + +② 数据准备 Checklist: + □ 使用后复权价格(避免复权带来的前视偏差) + □ 包含已退市股票(解决幸存者偏差) + □ 财报数据使用 ann_date(解决财报前视偏差) + □ 过滤 ST、停牌股票 + +③ 因子验证: + □ 计算 IC / ICIR(目标:|IC均值| > 0.03) + □ 分层回测(检验单调性) + □ 扣除完整交易成本后,多空收益是否为正 + +④ 如果 IC 接近 0 或收益为负: + → 该因子在真实 A 股中无效,需要换因子或调整 + → 不要试图调参"拟合"出好看的结果(过拟合陷阱!) +``` + +### 9.4 阶段3:模拟盘的正确姿势 + +``` +❌ 错误做法: + 开模拟盘 → 发现和回测差距很大 → 调整回测参数 → 重新上线 + (这是在用模拟盘的结果"优化"回测,过拟合链条更长了) + +✅ 正确做法: + 每天记录: 策略信号 + 实际执行价格 + 回测预期价格 + 每月复盘: 实盘 vs 回测的差距在哪里?是成本?还是执行? + 不要修改策略参数(除非发现明确的 Bug) + 坚持至少 3 个月,收集足够的统计样本 +``` + +--- + +## 10. 心理与纪律 + +> 这是整个学习路径中唯一不涉及编程的部分,但却是**决定最终成败**的关键。 + +### 10.1 量化交易的心理误区 + +| 误区 | 真实情况 | +|------|---------| +| "回测好 = 实盘好" | 回测是过去,实盘是未来;市场会变化,策略会失效 | +| "亏损了是模型有问题" | 短期亏损可能只是正常的随机波动,不要频繁换策略 | +| "我找到了一个完美策略" | 不存在永远有效的策略,所有策略都会有失效期 | +| "只要技术够好就能赚钱" | 纪律执行、风险控制、情绪管理同样关键 | + +### 10.2 量化投资者的核心纪律 + +``` +① 严格执行信号,不用直觉覆盖(除非明确发现 Bug) + "我觉得今天大盘要跌,不买了" → 这是在破坏策略的统计基础 + +② 以月或季度为周期评估策略,不以日为单位焦虑 + 连续亏 3 天不代表策略失效;连续亏 3 个月可能需要检查 + +③ 只用"闲钱"做量化 + 用生活必需金做量化 → 心理压力导致执行变形 → 放大亏损 + +④ 先求"不亏大钱",再求"稳定盈利" + 设定严格的止损和最大回撤限制,在学习期保住本金 + +⑤ 保持持续学习,不断迭代 + A 股市场在变化,因子会失效,策略需要更新 + 量化不是"一劳永逸",而是持续的研究工作 +``` + +### 10.3 资金管理的"三个账户"思维 + +``` +生活资金(绝对不能动) + ↓ +投资储蓄(传统股票/基金,长期持有) + ↓ +量化研究资金(可以全部亏损的部分) + → 初期建议:不超过总可投资资产的 20% + → 入门期建议:1-5 万元 +``` + +### 10.4 成功的量化投资者的特征 + +- **工程师思维**:系统化、规则化,不依赖感觉 +- **科学家心态**:愿意承认假设错误,不断迭代 +- **风险第一意识**:先问"最坏情况是什么",再问"最好情况是什么" +- **长期主义**:量化策略的优势在于长期统计,不要被短期噪音干扰 +- **持续复盘**:每笔交易、每月业绩都有完整记录 + +--- + +## 总结:最重要的 10 点 + +1. ⚠️ **T+1 + 涨跌停 + 印花税** — 这三个 A 股规则让所有 Demo 结果都需要打折扣 +2. ⚠️ **幸存者偏差** — 必须使用包含已退市股票的完整股票池 +3. ⚠️ **财报前视偏差** — 使用财报数据时必须遵守 ann_date +4. ⚠️ **交易成本** — 月频换仓约消耗年化 3-4%,日频策略几乎不可能盈利 +5. ⚠️ **A 股无法做空** — 多空策略需要用股指期货替代,且有门槛 +6. 🔑 **风险管理第一** — 止损、仓位控制、回撤限制,保住本金才有未来 +7. 🔑 **模拟盘 3 个月以上** — 收集足够数据再判断策略是否有效 +8. 🔑 **小资金验证** — 实盘最初只用 1-5 万,目标是学习而非赚钱 +9. 🔑 **严格执行信号** — 不要用直觉覆盖量化信号 +10. 🔑 **持续迭代** — 量化不是一劳永逸,市场会变化,策略需要更新 + +--- + +## 附录:本系列文档导航 + +| 篇 | 文件 | 文档 | 核心内容 | +|----|------|------|----------| +| 第 1 篇 | `quant_data_pipeline_demo.py` | `doc_01_data_pipeline.md` | 复权、收益率、缺失值、异常值 | +| 第 2 篇 | `quant_strategy_backtest_demo.py` | `doc_02_strategy_backtest.md` | 技术指标、策略逻辑、向量化回测 | +| 第 3 篇 | `quant_event_driven_backtest_demo.py` | `doc_03_event_driven_backtest.md` | 事件驱动架构、成本模型 | +| 第 4 篇 | `quant_alpha_factor_demo.py` | `doc_04_alpha_factor.md` | 因子构建、IC/ICIR、分层回测 | +| 第 5 篇 | `quant_portfolio_optimization_demo.py` | `doc_05_portfolio_optimization.md` | MVO、风险平价、Black-Litterman | +| **导航** | — | **`doc_06_astock_practice_guide.md`** | **A股规则、路径规划、实盘注意事项** |