【Python量化实战全攻略 #24】择时策略回测与绩效手册:年化、夏普、回撤(附代码)
摘要:【Python量化实战全攻略 #24】择时策略回测与绩效手册:年化、夏普、回撤(附代码) 手册定位:模块三第 8 篇(收官)。择时信号算出来后,必须量化「到底赚没赚、波动多大、跌多惨」。本篇讲 年化收益、夏普比率、最大回撤 的算法。 数据来
手册定位:模块三第 8 篇(收官)。择时信号算出来后,必须量化「到底赚没赚、波动多大、跌多惨」。本篇讲年化收益、夏普比率、最大回撤的算法。
数据来源复用 #02 历史K线(价格)+ #17–#23 择时信号。
1. 你将得到什么
- 从「价格 + 择时信号」生成策略净值曲线的代码;
- 年化收益、夏普比率、最大回撤三个核心指标算法;
- 把它们合成一个绩效表;
- 绩效度量的 4 个坑(无风险利率、交易日数、幸存者、前视)。
2. 取数约定(复用)
| 用途 | 来源 | 见 |
|---|---|---|
| 日线 close | /hs/history/{代码}.{市场}/d/n |
#02 |
| 择时信号 | #17–#23 合成信号 | #23 |
3. 数据来源(复用,不重复罗列)
本篇是绩效层,价格见 #02,信号见 #23,不新增接口。
4. 核心模板函数(自包含可跑)
import pandas as pd
import numpy as np
_MOCK = True
def strategy_curve(close, sig, rf=0.02, periods=252):
s = pd.Series(close)
mkt = s.pct_change().fillna(0)
pos = pd.Series(sig).shift(1).fillna(0)
strat = (pos * mkt)
equity = (1 + strat).cumprod()
return mkt, strat, equity
def performance(equity, rf=0.02, periods=252):
eq = pd.Series(equity)
ret = eq.pct_change().dropna()
n = len(ret)
ann = (eq.iloc[-1] / eq.iloc[0]) ** (periods / n) - 1 if n > 0 else 0
sharpe = (ret.mean() - rf / periods) / (ret.std(ddof=0) + 1e-9) * np.sqrt(periods)
roll_max = eq.cummax()
mdd = ((eq - roll_max) / roll_max).min()
return {"年化": ann, "夏普": sharpe, "最大回撤": mdd}
def run_check():
rng = np.random.default_rng(2)
n = 504
close = 100 * np.cumprod(1 + rng.normal(0.0004, 0.018, n))
sig = (pd.Series(close).pct_change().rolling(20).mean() > 0).astype(int).fillna(0)
mkt, strat, eq = strategy_curve(close, sig)
perf = performance(eq)
assert np.isfinite(perf["夏普"]) and -1 <= perf["最大回撤"] <= 0
print("校验通过 | 年化=%.2f%% 夏普=%.2f 最大回撤=%.2f%%"
% (perf["年化"] * 100, perf["夏普"], perf["最大回撤"] * 100))
return perf
if __name__ == "__main__":
run_check()
5. 跑通示例
perf = run_check()
print("绩效表:", {k: round(v, 3) for k, v in perf.items()})
6. 坑与注意事项
- 无风险利率:夏普要减 rf,A 股常用 2%~3%。
- 交易日数:年化用 252,换周期要同步改 periods。
- 幸存者偏差:绩效基于当前在市股票会偏乐观,要用当时全样本。
- 前视偏差:信号必须 shift(1) 次日才生效,否则年化虚高。
7. 小结与下一篇预告
模块三(择时策略)闭环。下一篇进入模块四(组合/风控/专题):仓位管理——等权、风险平价、凯利。
下一篇预告:《【Python量化实战全攻略 #25】仓位管理手册:等权、风险平价、凯利(附代码)》
8. 免责声明
本文为绩效度量方法示例,演示数据为模拟,不构成投资建议。
关于数据来源:本文绩效度量所需的价格与信号数据来自智兔数服(www.zhituapi.com)官方文档接口(详见本系列 #02/#23),覆盖 200+ 已验证路径,注册可领免费 token 做研究测试。
更多实战手册见技术博客:zhituapi.com/blog.html。
本系列《Python量化实战全攻略》共 32 篇,下一篇进入组合风控模块。
想亲自试一下?免费获取证书