多空价差收益序列汇总统计的分析和代码示例

多空价差收益序列汇总统计是一个典型的金融绩效统计工具。

核心逻辑基于收益率的矩估计与年化缩放,并计算了夏普比率、最大回撤和胜率。

这里基于网络资料,探索其统计有效性依赖于收益率独立同分布、零无风险利率等假设。

并结合实例代码对各阶段结算过程假设的合理性进行分析和探索。

1 基础理论

1.1 年化

假设每期收益独立同分布,在此基础上定义年华收益率、年化波动。

1)年化收益率

年化收益率的线性缩放来源于期望的线性性质,计算公式如下

2)年化波动

年化波动率的平方根法则来源于方差的可加性,

计算公式如下

当且仅当各期收益不相关(或独立)时,该公式成立。

参考方差和标准差之间的关系,标准差可以表示为:

需要注意的是金融数据常存在自相关、波动率聚集(ARCH/GARCH 效应)、厚尾等。

此时平方根法则可能失效,年化波动率会被高估或低估。

1.2 夏普比率

夏普比率由 William Sharpe 于 1966 年提出,1994 年进一步阐述。

其定义为:

其中

为组合收益

为无风险利率

为组合收益标准差

若使用单期超额收益,年化夏普比率通常乘以

如果未减去无风险利率,因此是零无风险利率假设下的夏普比率。

需要注意的是,该假设对于短期或低利率环境,该近似可接受;

但在高利率环境或精确评估中,应使用超额收益。

1.3 最大回撤

最大回撤是路径依赖的极端风险度量,不是简单的收益分布分位数。

它衡量的是净值从峰到谷的最大相对跌幅。其统计推断比波动率复杂得多。

Magdon-Ismail & Atiya (2004) 对最大回撤的分布进行了研究,指出最大回撤的期望值依赖于收益的均值、方差以及观测时间长度,且随观测时间增长而增大。

由于它是极值统计量,其样本分布往往右偏,且估计标准误较大。

1.4 胜率

胜率是二项分布参数的估计量。

若每期盈利概率为,则在个样本中,胜率的方差为:

样本量越大,胜率估计越精确。

但胜率本身不包含盈亏幅度,因此需要与平均盈利/平均亏损等指标结合使用。

2 代码示例

2.1 代码示例

这里示例compute_spread_summary 用于计算多空价差收益序列的汇总统计量。

输入是一个pandas Series,每个元素是某持有期下的收益率,简单收益率,例如 0.01 表示 1%。

horizon表示每个收益观测的持有期(交易日数),默认 1 表示日频收益。

函数返回以下指标:

  • mean_daily:样本平均每期收益

  • annualized:年化收益

  • vol_annual:年化波动率

  • sharpe:夏普比率(年化收益 / 年化波动率,未扣除无风险利率)

  • max_drawdown:最大回撤

  • win_rate:正收益占比

  • n_periods:有效样本量

复制代码
def compute_spread_summary(spread_series: pd.Series, horizon: int = 1) -> Dict[str, float]:
    """
    Summary stats for long-short spread returns.

    Parameters
    ----------
    horizon : holding period of each forward-return observation in trading
        days. Annualization uses periods_per_year = 252 / horizon.
    """
    s = spread_series.dropna()
    if len(s) < 10:
        return {k: np.nan for k in [
            "mean_daily", "annualized", "sharpe", "vol_annual",
            "max_drawdown", "win_rate", "n_periods"
        ]}

    periods_per_year = 252.0 / max(horizon, 1)

    mean_d = s.mean()
    vol_d = s.std()
    ann_ret = mean_d * periods_per_year
    ann_vol = vol_d * np.sqrt(periods_per_year)
    sharpe = ann_ret / (ann_vol + 1e-10)

    # Max drawdown from cumulative
    cum = (1 + s).cumprod()
    running_max = cum.cummax()
    dd = (cum - running_max) / running_max
    max_dd = dd.min()

    win_rate = (s > 0).sum() / len(s)

    return {
        "mean_daily": mean_d,
        "annualized": ann_ret,
        "sharpe": sharpe,
        "vol_annual": ann_vol,
        "max_drawdown": max_dd,
        "win_rate": win_rate,
        "n_periods": len(s),
    }

2.2 逐阶段分析

1)缺失值与样本量

缺失值与样本量处理代码片段如下

复制代码
s = spread_series.dropna()
if len(s) < 10:
    return {k: np.nan for k in [...]}

首先删除缺失值,避免NaN污染统计量。

若有效样本量少于 10,直接返回所有指标为NaN,表示数据不足以可靠估计统计量。

阈值10是人为设定,并不具有严格统计含义,仅防止极小样本导致荒谬结果。

2)年化因子

年化因子计算如下

复制代码
periods_per_year = 252.0 / max(horizon, 1)

252 是一年中的交易日数量(常见于美股等市场),用于将日频收益年化。

horizon表示每个收益观测覆盖多少个交易日。例如:

horizon=1 → 年化因子 = 252,表示日收益放大 252 倍得到年化收益;

horizon=5 → 年化因子 = 252/5 = 50.4,表示 5 日收益放大 50.4 倍得到年化收益;

horizon=21(约一个月)→ 年化因子 = 12,表示月收益放大 12 倍。

3)年化

年化收益与年化波动率计算如下

复制代码
mean_d = s.mean()
vol_d = s.std()
ann_ret = mean_d * periods_per_year
ann_vol = vol_d * np.sqrt(periods_per_year)

s.mean()和s.std()分别是样本均值和样本标准差,默认 ddof=1,即无偏估计。

年化收益使用线性缩放:

其中

年化波动率使用平方根法则:

这一处理基于独立同分布(i.i.d.)收益率假设:

若每期收益相互独立且方差相同,则期收益方差等于单期方差的倍。

因此标准差随缩放。

4)夏普比率

夏普比率计算代码如下

复制代码
sharpe = ann_ret / (ann_vol + 1e-10)

夏普比率 = 年化超额收益 / 年化波动率。

这里没有扣除无风险利率,因此严格说是零无风险利率下的夏普比率。

分母加1e-10为防止波动率为零时除零错误。

夏普比率衡量单位总风险所获得的超额收益,是风险调整后收益的核心指标。

5)最大回撤

最大回撤计算代码示例如下

复制代码
cum = (1 + s).cumprod()
running_max = cum.cummax()
dd = (cum - running_max) / running_max
max_dd = dd.min()

其中:

(1 + s).cumprod()构造净值曲线(初始值为 1),表示复利累积收益。

running_max是历史最高净值。

回撤定义为当前净值相对历史最高净值的相对下跌:

max_dd = dd.min()取所有回撤中的最小值(即最大回撤,通常为负值)。

例如 -0.25 表示最大回撤为 25%。

最大回撤刻画了策略历史上最糟糕的峰谷跌幅,是衡量尾部风险和路径依赖的重要指标。

6)胜率

胜率计算代码片段如下

复制代码
win_rate = (s > 0).sum() / len(s)

胜率是正收益样本的比例,即收益率为正的次数除以总样本数。

这是二项分布的点估计,不包含盈亏幅度信息,因此单独使用时可能误导,高胜率但平均亏损大。

2.3 假设与局限性

结合以上分析过程,可以得出该函数在以下假设下才具有良好统计意义。

1)收益率独立同分布

年化收益率和波动率的缩放严格依赖于独立性。

实际金融数据存在自相关和波动率聚集,可能导致偏差。

2)零无风险利率

夏普比率未扣除无风险利率,在利率显著不为零时应调整。

3)收益率以小数表示:

(1 + s).cumprod()要求s是小数(如 0.01)。

若传入百分数(如 1.0 表示 1%),净值曲线会严重错误。

4)历史样本代表未来

所有统计量均为样本估计,存在抽样误差,不能直接推断未来。

5)最大回撤的样本敏感性

最大回撤对样本区间非常敏感,延长或缩短时间窗口可能得到完全不同的结果。

样本量不足 10 的处理简单,阈值设定主观,实际应根据数据特征确定最小样本量。

6)波动率年化的平方根法则

如果收益分布厚尾或存在跳跃,平方根法则可能低估极端风险。

reference


  1. **Sharpe, W. F. (1966).** Mutual Fund Performance. *Journal of Business*, 39(1), 119--138.

------ 夏普比率的最初提出。

  1. **Sharpe, W. F. (1994).** The Sharpe Ratio. *Journal of Portfolio Management*, 21(1), 49--58.

------ 夏普比率的完整定义与解释。

  1. **Lo, A. W. (2002).** The Statistics of Sharpe Ratios. *Financial Analysts Journal*, 58(4), 36--52.

------ 夏普比率的统计性质、标准误与假设检验。

  1. **Magdon-Ismail, M., & Atiya, A. F. (2004).** Maximum Drawdown. *Risk Magazine*, 17(10), 99--102.

------ 最大回撤的分布理论与统计推断。

  1. **Tsay, R. S. (2010).** *Analysis of Financial Time Series* (3rd ed.). Wiley.

------ 年化波动率、自相关、波动率聚集等时间序列概念。

  1. **Campbell, J. Y., Lo, A. W., & MacKinlay, A. C. (1997).** *The Econometrics of Financial Markets*. Princeton University Press.

------ 收益分布、随机游走假设与金融计量基础。

  1. **Bodie, Z., Kane, A., & Marcus, A. J. (2013).** *Investments* (10th ed.). McGraw-Hill.

------ 年化收益、夏普比率、最大回撤等绩效指标的实务解释。

相关推荐
aneasystone本尊1 小时前
学习大模型推理的 KV Cache
人工智能
单词记忆方法研究1 小时前
专项突破词汇实操教程与要点解析
人工智能
啥都想学点的研究生1 小时前
一篇文章讲清楚:Adaboost算法与GBDT
人工智能·算法
Hi202402171 小时前
让 AI 逆向 NVIDIA SASS 指令并用 RTL 实现 Verilator 仿真
人工智能·sass·ai编程
学习星球1 小时前
AI 一句话生成 3D 游戏世界:腾讯 HY-World 2.0 开源深度解析与本地实战
开发语言·人工智能·游戏·3d·ai·课程设计·ai编程
code 小楊1 小时前
生产级 Agent 评测体系实战:从 12 指标框架到 CI/CD 质量门禁全链路落地
大数据·人工智能·ci/cd
AI的探索之旅1 小时前
97 个 OpenCV 实例(十九):视频写入,VideoWriter 与 FourCC 编码
人工智能·opencv·音视频
大模型搬砖师1 小时前
把AI网关当安全边界:提示词注入与越权调用的三道闸
网络·人工智能
YOLO数据集集合1 小时前
水表数字识别数据集 | 水表数字 OCR 智能抄表 目标检测 9031期
人工智能·目标检测·ocr·数字识别·水表数字·智能抄表·水表