⏱ 用时2~3 小时(含作业)📄 代码01_pandas入门.py、run_backtest.py

第 1 课:pandas 入门 + 跑通回测框架 + 作业 1~4

学习用时参考:2~3 小时(含作业) 代码文件:01_pandas入门.pyrun_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.pystrategies/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. 本课目标

  1. 学会 pandas 操作 K 线的最核心 4 个技能(本项目 90% 的代码靠它们)
  2. 看懂回测框架每一层在干什么(config → strategy → engine → metrics → run_backtest)
  3. 完成作业 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.pyMA_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 只股票,学会看"平均绩效 + 赢面",真正理解: "策略好不好,不看它在一只股票上赚了多少,要看它在整个股票池上稳定的赢面。"