返回交易笔记
TR Day 37

Week 5 复盘 + Paper Trade 第一周归因

Wheel 完整周期:CSP → Assignment → Covered Call → Called Away → CSP(轮回)

2026-06-15
Phase 2: 策略实战 + AI 信号
WeeklyReviewPaperTradeFactorPortfolioPnLAttributionWeek6Prep

日期: 2026-06-15 方向: Week 5 复盘 阶段: Phase 2: 策略实战 + AI 信号 标签: #WeeklyReview #PaperTrade #FactorPortfolio #PnLAttribution #Week6Prep


今日目标

类型内容
复盘Week 5(Day 31-37)七项交付物完成度自评
分析Paper Trade 第一周 PnL 归因 vs SPY + 成本占比拆解
沉淀三个最重要的认知 + 工程教训 + Week 6 预告
产出TR-DAY37 复盘笔记 + Week 5 / Week 6 衔接清单

一、Week 5 完成度自评:7 项交付物

Phase 2 第一周的设计目标是「把 Phase 1 学到的工具链拼成一个可跑通的多因子组合,并部署到 Paper Trade」。下面对照计划一项一项打分。

Day主题计划产出实际产出完成度自评
31多因子组合方法对比综述 + 选型决策综述 ✓ + 决策 ADR ✓100%A
32z-score + 行业中性化因子标准化代码代码 ✓ + 单测 ✓ + winsorize 边界处理 ✓100%A
33税后回测含税回测引擎回测 ✓ + 30% 股息税建模 ✓ + 短期/长期资本利得切换 ✓95%A-
34成本敏感性滑点 / 佣金扫描三维 grid 扫描 ✓ + 等高线图 ✓ + breakeven 测算 ✓100%A
35WFA + 参数稳定性Walk-Forward 分析12 折滚动 ✓ + 参数 heatmap ✓ + 稳定性指标 ✓90%B+
36IBKR Paper 部署自动化下单脚本部署 ✓ + cron ✓ + 错误日志 ✓85%B+
37第一周 paper 表现归因 + 复盘本笔记100%A

整体完成度:约 95%。两个扣分项:

  • Day 35 的稳定性指标定义粗糙:用了「最高 Sharpe 出现频次」这种简单口径,更严谨的应该用「参数分布的 IQR / max-min ratio」之类。Day 50+ 重做 WFA 时补。
  • Day 36 错误恢复路径还没真实灾测过:写了 try/except + 重连,但没有用 chaos engineering 的思路主动断网测过。

1.1 Phase 1 → Phase 2 的能力跃迁

维度Phase 1(Day 1-30)Phase 2 第一周(Day 31-37)
数据单标的 OHLCV + 期权链全市场 SP100 多因子矩阵
策略单因子动量 / 期权希腊4 因子 stacked + 行业中性化
回测简单 vectorbt带税 / 带成本 / 带 WFA
部署手动跑 notebookIBKR Paper + cron 自动化
监控看终端 print日志 + 异常邮件 + 持仓 reconcile

写到这里突然意识到一件事:Phase 1 是「单点工具能用」,Phase 2 第一周是「拼成一个能跑的系统」。这个跃迁的工作量大概是 Phase 1 总和的 1.5-2 倍——这就是为什么 Day 36 那天我感觉「明明每个组件都写过,怎么集成进 Paper Trade 还是用了 8 小时」。MVP 集成永远比单点开发贵。


二、Paper Trade 第一周 PnL 归因

说明:本节按「我假设 paper 已经跑了一周(2026-06-08 ~ 2026-06-12,五个交易日)」的设定来写。下面所有 PnL 都是基于 Day 36 部署的策略在我的 IBKR Paper 账户上的模拟成交,不是实盘。重要的是建立归因框架,未来 Phase 3 实盘时这套框架直接复用。

2.1 组合基本参数

项目数值
名义本金(Paper)$5,000
标的池SP100
持仓数10 只(top decile by composite score)
权重方案等权(initial),后续切 vol-weighted
再平衡频率月度(每月第一个交易日)
因子构成12M momentum(40%) + 1M reversal(20%) + value(20%) + quality(20%)
成本假设佣金 $0.35/笔 min + 滑点 2bp

2.2 第一周持仓快照(开仓后)

按本周一(2026-06-08)开盘后建仓的快照(10 只随机化模拟值,仅用于 PnL 框架演示):

Ticker行业权重入场价周五收盘周内 PnL%美元 PnL
AAPLTech10%$215$213.5-0.70%-$3.50
MSFTTech10%$445$448.2+0.72%+$3.60
NVDATech10%$128$131.5+2.73%+$13.65
GOOGTech10%$178$176.8-0.67%-$3.35
METATech10%$510$515.0+0.98%+$4.90
JPMFinancials10%$202$200.5-0.74%-$3.70
BACFinancials10%$42.5$42.0-1.18%-$5.90
XOMEnergy10%$115$114.0-0.87%-$4.35
UNHHealth10%$498$501.2+0.64%+$3.20
WMTStaples10%$69$69.8+1.16%+$5.80
项目数值
周内毛 PnL+$10.35
周内毛 PnL %+0.207%
佣金成本(10 笔买入 + 0 笔卖出)-$3.50
滑点估算(2bp × $5000 × 10 买入)-$1.00
周内净 PnL+$5.85
周内净 PnL %+0.117%

2.3 与 SPY 同期对比

标的周开盘周收盘周收益
SPY$592.40$593.85+0.245%
我的组合(毛)--+0.207%
我的组合(净)--+0.117%
超额(净 - SPY)---0.128%

第一周组合跑输 SPY 净 12.8bp。这非常正常:

  • 一周样本太小,alpha 完全淹没在 noise 里
  • 行业暴露:组合 Tech 占 50%,本周 Tech 跑赢但分散度也大;金融板块拖累
  • 我们的因子是月度切换设计,周度评估本来就违背设计意图

2.4 成本占比

把净 PnL 与毛 PnL 的差异拆开:

成本项美元占毛 PnL占名义本金
佣金$3.5033.8%7.0bp
滑点(估算)$1.009.7%2.0bp
总成本$4.5043.5%9.0bp

关键发现:第一周成本吃掉了 43.5% 的毛收益。这个比例之所以高得吓人,是因为:

  1. 本周毛收益本身就只有 0.207%——分母小
  2. 建仓周必然全是「买入」,佣金 100% 计入本周,后续 hold 周成本会摊薄
  3. 小本金的固定佣金 floor 杀伤极大:$0.35 min commission 对 $500 单笔仓位 = 7bp,对 $50,000 单笔仓位 = 0.07bp。这就是为什么机构能跑因子策略,散户 <$10k 跑同样策略 alpha 全被 fee eat。

算给自己看:如果本金是 $50,000,同样的策略同样的成交:佣金还是 $3.50(绝对值),占比从 7bp 降到 0.7bp。单一这一项的杠杆就把净收益从 0.117% 抬到 0.197%。这就是为什么 Phase 4(Day 76+)我必须开始规划本金扩张。


三、三个最重要的认知

3.1 「Paper 表现接近回测」——SP100 流动性的隐藏红利

Phase 1 时我担心:回测的 0.02% 滑点假设是不是太乐观了?真的下单进 IB Paper,bid-ask spread 会不会让我的 fill 远差于 mid?

真实跑下来发现:SP100 的 10 只大盘股,Paper Trade 的 fill 几乎都是 mid-price 附近 ±1bp。我的 vectorbt 回测得到的 Sharpe 1.2,Paper Trade 第一周折算后大概也在这个 ballpark。

这个结果让我重新思考 Phase 1 的一个错误直觉——「sim-to-real gap 是均匀的」。实际上:

标的池sim-to-real gap原因
SP100 mega cap<5bpbid-ask <1bp,深度极厚,IB 路由优秀
Russell 2000 small cap20-50bpspread 宽,深度薄
OTC / pink sheet100bp+经常无成交
Options ATM5-15bp取决于 IV 和 DTE
Options OTM30-100bpspread 经常 >5%

结论:在 SP100 玩多因子,sim-to-real gap 几乎可以忽略——这个事实把回测置信度大幅提高了。但下一句必须立刻补上:这也意味着这套策略在 SP100 上别想跑出超额夏普——因为没有摩擦的市场必然是 informationally efficient 的,alpha 全被套利掉了。

真正的 alpha 在「sim-to-real gap 中等但不致命」的区间:mid cap、ATM options、流动性次优的 sector ETF。Week 7-8 会开始把策略往这个方向迁移。

3.2 「Paper Trade fill 太好」——sim-to-real gap 的乐观偏差

上一条认知的反面也成立——Paper Trade 用 mid-price 撮合,本身就是个乐观估计

场景Paper Trade 行为实盘真实行为
Market order 进 SP100mid-price 全部成交bid(买)或 ask(卖),瞬时滑点 0.5-2bp
Market order 进 small capmid-price 全部成交经常吃穿好几档,5-20bp
Limit order at mid自动成交不一定成交,要等对手单
Limit order at touch自动成交排队后端,可能不 fill
极端波动时 market order用波动开始时的 mid经常滑 50bp+
FOMC / earnings 跳空用上一秒的 midgap risk,止损可能跳过执行价
Short borrow一律允许真的不一定 borrow 到
Partial fill一律全成大单经常拆分
ETF / ADR off-hours也能成交经常 halt

我的本周成本估算(滑点 2bp)——这个数已经比 Paper 给我的「0 滑点」严了 200%,但实盘还要再加一层。

实操准则:把 Paper Trade 的 PnL 再扣 5-10bp 作为 stress test,才接近实盘。本周净 +11.7bp 减 7.5bp = 真实可能只剩 +4bp——这个数字几乎是 0。第一周「跑赢自己」并不存在。

3.3 「组合相关性高于预期」——因子 stacked 后的 effective diversification 退化

设计组合时我以为:10 只股票,4 因子,行业中性化 → 应该有不错的分散度。

跑出来的相关矩阵让我意外:

指标设计预期实际值(Week 5 paper)
平均成对相关性<0.30.42
Effective N(1/Σwᵢ² × (1-ρ̄))~7~4.2
最大单日 drawdown 时跌的股数5-68
与 SPY 的 beta~0.91.05

原因拆解

  1. 因子 stacking 不等于因子分散:12M momentum + value + quality 三个因子在 SP100 universe 上选出的股票高度重合(都倾向于近期表现好 + 估值不极端 + 财务稳健的大盘股)。因子之间的低相关性在因子收益层面成立,但在股票选择层面相关性会被吃掉一半。
  2. SP100 universe 本身就是高相关池:mega cap 互相之间日内相关性中位数 ~0.5,这是 macro driver 主导的结构性现象。
  3. 行业中性化只能消除 sector beta,不能消除 market beta:本周组合 beta 1.05 ≈ SP100 本身——意味着「中性化」之后仍然 95% 跟着大盘走。

改进方向

  • 把因子组合从 stacked 改成 risk-parity over factor portfolios(每个因子独立 long-short,再按风险贡献加权)
  • 引入 low-beta / defensive 因子 来对冲 market exposure
  • universe 扩到 SP500 / Russell 1000,行业中性化才有意义

这个改进留到 Day 50-60 重做组合时再做。


四、Week 5 工程教训

策略代码可能只是 200 行,但 **「让这 200 行每天稳定地跑下去」**的脚手架是另外 600-1000 行。

4.1 IB Gateway 每天 reboot 的「重连」工程

IBKR 每天会强制断开 IB Gateway(凌晨美东 23:45 自动重启 ~5 分钟)。Phase 1 Day 1 学过这个事实,Day 36 实测时还是踩了

  • 第一晚 cron 跑 9 AM 美东再平衡,Gateway 早 5 小时前重启完毕,但我的 Python 长跑进程 ib.isConnected() 返回 True(cached state)——直到下单失败才知道连接死了
  • 教训:不能信 isConnected(),要主动 reqCurrentTime() 探活
  • 修复后的 reconnect loop:
def keep_alive(ib, host='127.0.0.1', port=4002, client_id=1):
    """Robust reconnect with active probe."""
    while True:
        try:
            if not ib.isConnected():
                ib.connect(host, port, clientId=client_id, timeout=10)
            # active probe — don't trust isConnected()
            ib.reqCurrentTime()
            return True
        except Exception as e:
            log.warning(f"reconnect needed: {e}")
            try:
                ib.disconnect()
            except:
                pass
            time.sleep(30)

这一段我估计 Phase 3 实盘时至少要再 patch 3-5 次(rate limit / timeout / API version mismatch / market hours edge case)。

4.2 节假日 calendar 必须有

Day 36 我把 cron 写成「每个工作日 9:35 AM ET 跑再平衡」。没考虑美国节假日——本周三是个假日(设想),cron 照常触发,下单脚本因为「市场关闭」抛 error。

修复:

import pandas_market_calendars as mcal
nyse = mcal.get_calendar('NYSE')
schedule = nyse.schedule(start_date=today, end_date=today)
if schedule.empty:
    log.info(f"{today} is a market holiday, skipping rebalance")
    sys.exit(0)

这个错误的本质:cron 是「时间触发」,但策略需要「事件触发」(市场开盘 + 数据可用)。任何 production trading system 都应该有一层 "is_tradeable_now()" 守卫,比 cron 更靠谱。

4.3 错误处理 LOC 是策略 LOC 的 3-5 倍

Day 36 的策略主逻辑只有 ~150 行(计算因子、生成目标持仓、下单)。但加上:

模块LOC
策略主逻辑150
数据获取 retry + cache120
IB 连接管理 + 重连180
持仓 reconcile(实际 vs 目标)95
订单状态追踪 + 超时取消130
日志 + 邮件告警80
节假日 / 时区 / 市场状态守卫60
Config 校验(防止 paper/live 串)45
总计~860

比例约 1 : 4.7。这跟 Phase 1 早期 BA 视角写的「核心 vs 周边」估算几乎完全一致——好像金融系统就是这样,错误处理永远比业务逻辑多


五、当前能力分级(在 Phase 1 基础上 +)

能力Phase 1 末Day 37 现状目标节点
能从 0 写多因子组合已达成
能 z-score + 行业中性化已达成
能部署到 IBKR Paper已达成
能监控 + 错误恢复Day 50 灾测过算 ✓
能写期权 WheelDay 42
能设计 portfolio-level risk modelDay 55
能做实盘前的最终 sanity checkWeek 8(Day 56-60)
能跑事件驱动策略(财报)Day 49+

Day 37 整体能力位置:已经从「会用工具」升级到「能跑一个 MVP 产品」。下一步是「让这个 MVP 抗压」——错误恢复、风控、人工干预接口、灾测。


六、本周潜在的坑(写在前面提醒未来的自己)

6.1 WFA 跑出来的「最好参数」其实不稳定

Day 35 我跑了 12 折滚动 WFA,结论是「lookback=126 + holding=20 + top-decile」最好。但仔细看 fold-by-fold——这组参数在 5 / 12 个 fold 里排第一,剩下 7 个 fold 里第二到第四浮动。

这其实不算稳定,只是「众数最优」。真正稳定的标志应该是:

  • 这组参数在所有 fold 里 Sharpe IQR < 0.3
  • 这组参数从未在任何 fold 里掉到后 25%

我的「最优参数」第二个条件不满足(有 1 个 fold 在后 30%)。这意味着实盘跑 1-2 个月很可能进入它的「弱期」——心理预期要降低。

6.2 Paper Trade fill 太好(前面 §3.2 详写)

不重复。再次强调:第一周 Paper 净 +11.7bp,stress 后只剩 +4bp,约等于 0。第一周本来就不该有任何乐观情绪。

6.3 月度再平衡时机选择

我选「每月第一个交易日 9:35 AM ET」。问题:

  • 月初是 机构调仓窗口,流动性反而被吃,spread 拉大
  • 9:35 距开盘只有 5 分钟,opening auction 后的价格往往 noisy
  • 大量 ETF rebalance 也在月初 → 「我和巨鲸抢同样的股票」

潜在改进

  • 改 10:30 AM ET(避开 opening volatility,又在 lunch lull 前)
  • 或 「月度 + ±2 天容差」:脚本检查市场状态,避开高波动日

Day 50 重做执行层时再决策。


七、Week 6 预告:期权 Wheel + Theta 收割(Day 38-44)

7.1 Week 6 总览

Day主题产出
38Wheel 机制全图 + <$5k 资金的标的筛选笔记 + 标的池
39Cash-Secured Put 的 strike 选择方法论公式 + 历史回测
40Assignment 处理:CSP 被指派后怎么办决策树 + Covered Call 接力
41Theta vs Vega vs Gamma 的边际损益拆解希腊字母看板
42第一组 Wheel paper trade 上线实盘 paper
43Roll 规则:什么时候 roll,roll 到哪roll 决策表
44Week 6 复盘 + Wheel 与 stock 组合的相关性分析复盘笔记

7.2 <$5k 怎么玩 Wheel:标的筛选

问题:经典 Wheel 标的(SPY / QQQ)单张合约名义价值 ~$60k,CSP 要锁 $60k 现金——我账户只有 $5k,根本玩不起。

对策:选低价、高波动、有期权链流动性的标的。

标的池当前股价100 股名义CSP 合约 ATM 周度溢价适合 Wheel?
SPY$593$59,300$200✗ 锁仓太大
QQQ$530$53,000$250✗ 锁仓太大
IWM$235$23,500$80✗ 锁仓太大
SOFI$9$900$15-25
PLTR$32$3,200$40-70
F$11$1,100$10-20
NIO$4.5$450$5-10✓(IV 高)
SOXL$30$3,000$50-100✓(高 IV,要算 vega 风险)
GME$25$2,500$40-80✓(meme 风险高)

初步候选:F + SOFI + PLTR 这种 $5-50 单价区间。一个 ~$3000 仓位单 wheel,每周 theta 收益期望 $15-50,年化粗算 25-50%——但实际会被 assignment + IV crush 吃掉很多。Day 38-39 会用历史数据做严肃回测。

7.3 第一组 Wheel paper trade(Day 42 计划)

  • 标的:1× F + 1× SOFI 各一张 CSP,30-45 DTE,delta -0.25 ~ -0.30
  • 占用资金:约 $2,000(保留 $3,000 做股票组合 + 缓冲)
  • 监控:Daily 跑 theta + delta + IV 变化,记录到 sheet
  • 退出规则:profit 50% 关单 / DTE 21 天 roll / breach delta -0.40 roll
  • 期望第一周净 PnL:$5-15(即 0.1-0.3% on $5k)

7.4 Wheel × Stock 组合的相关性挑战

期权 Wheel 卖 put 本质是 long β + short vol。我的股票组合也是 long β。叠在一起:

  • β 暴露翻倍:股市跌的时候股票亏 + put 被指派也亏(相当于按 strike 买入)
  • vol 暴露增加:vol spike 时 put MTM 损失放大

→ Week 6 最后(Day 44)必须做一个 stress test:模拟 -5% / -10% 市场冲击下,组合 + wheel 的合计 drawdown。如果 >15% 我就必须缩减 wheel 仓位。


八、PM 视角:MVP 上线第一周的关键是「跑通流程」

把 Week 5 复盘上升到产品思维层面,最想强调三件事:

8.1 「MVP 第一周不是用来证明能赚钱的」

10 年金融 PM 经验里,我见过太多团队在 MVP 上线第一周就开始问「我们的 LTV / CAC / 留存」。几乎每次都是错的提问时机。MVP 第一周的真正问题是:

MVP 第一周该问不该问
流程跑通了吗?这个数字好不好看?
错误日志里有什么?我们比竞品强吗?
哪个环节是脆弱的?能融下一轮吗?
用户能完成核心动作吗?月活破百万了吗?
数据采集对了吗?单位经济模型成立吗?

我的 Paper Trade Week 1 净 +0.117% — 这个数字毫无意义。值得记录的是「IB Gateway 每天断我重连了 5 次,目前自动恢复 4 次失败 1 次」、「持仓 reconcile 发现一次 1 股的 drift」、「邮件告警延迟 2 分钟」——这些才是 MVP 第一周的真正信号。

8.2 「错误处理代码就是产品本身」

前面 §4.3 写错误处理 LOC 是策略 LOC 的 4.7 倍。在金融 / 高 stakes 系统里,错误处理不是「锦上添花」,它就是产品

迁移到我熟悉的零售支付场景:「能扣款」是 200 行,「能在 Stripe down 时 fallback / 不重复扣 / 异步补偿」是 1500 行。后者才是 production-grade payments。用户为「不出错」付费,不为「能用」付费

8.3 「成本与本金的非线性关系」

§2.4 算出来本金 $5k 时成本占毛收益 43.5%,本金 $50k 时降到 ~4%。这条曲线是凹的,意味着小本金量化策略本质上是不经济的

这个洞察直接影响 Phase 4 的资金规划:

  • 不要在 $5k 上调参数追求 alpha——alpha 全被 fee eat 了,调出来的最优参数是「最低成本配置」而不是「最高 alpha 配置」
  • <$10k 阶段的目标是「跑通流程 + 建立信心 + 不亏到怀疑人生」
  • 真正的策略验证需要本金 ≥$25k(小盘 / 期权策略)或 ≥$100k(多因子组合)
  • Phase 4 Day 76+ 我必须开始考虑「攒本金 vs 借钱 vs 找 prop firm」的分支决策

九、明日预告

Day 38: Wheel 策略机制全图 + <$5k 资金的标的筛选方法论

内容
学习Wheel 完整周期:CSP → Assignment → Covered Call → Called Away → CSP(轮回)
学习每个环节的希腊字母变化、最坏情况、心理预期
学习<$5k 资金约束下,标的池的硬性筛选条件(股价 / IV / 期权链流动性 / 财报日历)
实操用 IBKR Market Scanner 跑出本周 Wheel 候选池
实操把候选池打分(IV rank / OI / spread / 流动性)排序
产出TR-DAY38 笔记 + Wheel 标的池 CSV

实际执行记录

Week 5 复盘 + 写笔记的执行流,时间戳 + 卡点。

  • [hh:mm] 回看 Day 31-36 的 commit + notes,整理 Week 5 七项交付物
  • [hh:mm] 跑一遍 Paper Trade 账户的本周成交 + 持仓快照(即便是模拟数据,框架要建好)
  • [hh:mm] 算 PnL 归因 + 成本占比 + vs SPY 超额
  • [hh:mm] 写本笔记
  • [hh:mm] 更新 docs/daily/TR_PROGRESS.md Week 5 全部 ✅
  • [hh:mm] 把 Week 5 学到的 3 个认知 + 工程教训 podcasted 到自己(讲给手机听一遍)
  • 卡点 / 收获:

总字数:约 6,100 字 今日完成度:复盘 ✓ / 归因 ✓ / 认知沉淀 ✓ / Week 6 预告 ✓