第 1 课:pandas 入门 + 跑通回测框架 + 作业 1~4
学习用时参考:2~3 小时(含作业) 代码文件:
01_pandas入门.py、run_backtest.py学完本课 → 打开lessons/02_多标的回测.md开新会话学第 2 课
0. 新会话背景速览(给"接手的 AI"看的 30 秒)
- 项目位置:
D:/code/量化交易 - 项目是"A股量化交易入门":目标跑通 数据 → 信号 → 回测 → 评估 闭环
- 学生水平:Python 初学者(基础 1/10),中文交流
- 运行方式:项目根目录下
python 文件名.py - 关键文件:
config.py:所有可调参数(股票池、日期、成本、策略参数)data/fetcher.py:取真实行情(腾讯/东财/akshare 依次尝试 + CSV 缓存)data/demo.py:离线演示数据(教学用)strategies/dual_ma.py、strategies/bollinger.py:策略(信号 1=持有 0=空仓)strategies/rsi.py:学生自己写的 RSI 策略backtest/engine.py:向量化回测引擎(核心是signal.shift(1))backtest/metrics.py:绩效指标(夏普、回撤、胜率……)run_backtest.py:主入口,5 只股票跑三种策略 + 买入持有基准- 已内置 A股特性:不能做空(仓位 0~1)、T+1(shift(1) 隔日生效)、佣金万2.5双向、印花税万5卖出、滑点、前复权数据
1. 本课目标
- 学会 pandas 操作 K 线的最核心 4 个技能(本项目 90% 的代码靠它们)
- 看懂回测框架每一层在干什么(config → strategy → engine → metrics → run_backtest)
- 完成作业 1~4,亲手改参数、改策略、写新策略、对比买入持有
2. 第一部分:pandas 入门(10 分钟)
运行 python 01_pandas入门.py,边跑边看输出。重点记住 4 个技能:
| 技能 | 写法 | 干什么 |
|---|---|---|
| 看数据 | df.head() / df.shape |
前几行长什么样、多少行多少列 |
| 取数 | df["close"] / df[["date","close"]] |
选一列 / 多列 |
| 统计 | df["close"].mean() / .describe() |
平均值、describe 全量统计 |
| 算指标 | df["close"].pct_change()、df["close"].rolling(20).mean() |
日收益率、均线(量化两大基础操作) |
配套小抄:条件筛选 (df["close"] > df["close"].mean()).sum()(收盘价高于均价的天数)。
3. 第二部分:看懂回测框架(约 50 分钟)
按这个顺序读代码,每层都回答"这层解决什么问题":
3.1 config.py(5 分钟)
所有"想改的东西"集中在这:股票池、日期、初始资金、交易成本、策略参数。改参数永远不翻代码,只改这个文件。
3.2 strategies/dual_ma.py(5 分钟)
双均线规则:快线(如 MA10)上穿慢线(如 MA30)→ 买入;下穿 → 卖出。 返回和 K 线等长的信号序列:1=持有,0=空仓。
3.3 backtest/engine.py(20 分钟)⭐ 全项目最重要的一行
position = signal.shift(1)
含义:信号是"今天收盘"算出来的,只能"明天"执行。shift(1) 把"隔一天执行"写进代码,这是防止前视偏差(用未来数据骗自己)的第一道保险。A股 T+1 也靠它模拟。
成本模型:佣金(买卖双向)+ 印花税(卖出)+ 滑点(双向),按成交金额比例折算到收益率上。
3.4 backtest/metrics.py(10 分钟)
- 总收益率 / 年化收益率:赚了多少
- 夏普比率:每承担 1 份波动换几份超额收益(>1 不错)
- 最大回撤:最惨时从高点亏多少(新手最该盯的指标)
- 卡玛比率:年化/回撤
- 胜率、交易次数
3.5 run_backtest.py(10 分钟)
主流程:取数据 → 算信号 → 回测 → 指标 → 画净值对比图。 注意它把"买入持有"也当成一个假策略放进对比表——你的策略连"躺着不动"都打不赢的话,就没意义。
4. 第三部分:作业 1~4(按顺序做)
作业 1:改双均线参数
改 config.py 里 MA_FAST / MA_SLOW(试 10/30、10/60),重跑 run_backtest.py,观察夏普和回撤变化。
要点(做完再想):为什么没有一组参数永远最好? - 参数好 = 恰好拟合了过去某段行情(过拟合的雏形) - 市场结构(牛/熊/震荡)会变,参数不可能通吃 - 换个时间段、换个股票池,最优参数就换了
作业 2:布林带卖出线改上轨
去 strategies/bollinger.py,把卖出条件从"回到中轨"改成"冲上上轨":
signal[df["close"] > upper] = 0 # 卖出线 = 上轨
对比哪种更赚、哪种回撤更大。
已完成状态:当前 bollinger.py 已是上轨版,但文件头注释还写着"中轨",记得顺手把注释改对(这是代码整洁的好习惯)。
作业 3:自己写 RSI 策略
新建 strategies/rsi.py:
- RSI < 30 买入(超卖),RSI > 70 卖出(超买)
- 提示:RSI 公式可百度,涨跌幅用 df["close"].diff() 算
参考实现要点(strategies/rsi.py 已有一份):
- 收益分正负:涨的部分、跌的部分(取绝对值)
- 平滑用 Wilder 的指数平均:ewm(alpha=1/period, adjust=False)
- 处理"只涨不跌"导致除零:avg_loss == 0 时 RSI 直接给 100
写完在 run_backtest.py 里 import 并调用(当前已集成,表格里多出"RSI"一列)。
作业 4(进阶):对比买入持有
在 run_backtest.py 里给每只股票算"策略收益 − 买入持有收益",看哪些股票上策略跑输了。
要点:很多新手发现自己的策略其实不如躺着不动——这是量化路上最重要的一课。当前代码已内置"买入持有"基准列,直接看表格对比即可。
5. 学完自检清单
- [ ] 能说出
pct_change()和rolling()的用途 - [ ] 能解释
signal.shift(1)防止什么问题 - [ ] 能说出 A股 5 个特性分别对应框架里的什么处理
- [ ] 作业 1:调过 MA 参数并观察过夏普/回撤变化
- [ ] 作业 2:改过上轨版布林带并对比过两种卖出线
- [ ] 作业 3:
strategies/rsi.py存在且被run_backtest.py调用 - [ ] 作业 4:看明白"买入持有"基准列,知道策略在哪些股票上跑输
6. 下一课预告
第 2 课:多标的回测(lessons/02_多标的回测.md,代码 02_多标的回测.py)
把同一套策略跑遍 50 只股票,学会看"平均绩效 + 赢面",真正理解:
"策略好不好,不看它在一只股票上赚了多少,要看它在整个股票池上稳定的赢面。"