← 返回博客列表

【Python量化实战全攻略 #24】择时策略回测与绩效手册:年化、夏普、回撤(附代码)

2026年10月20日 09:28 · 智兔数服 · Python量化实战全攻略

摘要:【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. 坑与注意事项

  1. 无风险利率:夏普要减 rf,A 股常用 2%~3%。
  2. 交易日数:年化用 252,换周期要同步改 periods。
  3. 幸存者偏差:绩效基于当前在市股票会偏乐观,要用当时全样本。
  4. 前视偏差:信号必须 shift(1) 次日才生效,否则年化虚高。

7. 小结与下一篇预告

模块三(择时策略)闭环。下一篇进入模块四(组合/风控/专题):仓位管理——等权、风险平价、凯利。

下一篇预告:《【Python量化实战全攻略 #25】仓位管理手册:等权、风险平价、凯利(附代码)》

8. 免责声明

本文为绩效度量方法示例,演示数据为模拟,不构成投资建议。


关于数据来源:本文绩效度量所需的价格与信号数据来自智兔数服(www.zhituapi.com)官方文档接口(详见本系列 #02/#23),覆盖 200+ 已验证路径,注册可领免费 token 做研究测试。
更多实战手册见技术博客:zhituapi.com/blog.html。
本系列《Python量化实战全攻略》共 32 篇,下一篇进入组合风控模块。

想亲自试一下?免费获取证书