两个回测报告的夏普不一致:用同一成交与净值重算指标
两个股票回测报告的夏普不同,不应立即断言某个引擎坏了。可能是收益频率、标准差分母、年化或无风险输入不同。先重建同一原始收益序列,再一次改变一种口径,勾稽剩余差额,不能为了数字吻合随意修改公式。
本文独立重算微型合成账户并输出公式对照,是外部检查,不说明CoTrading提供这些口径,也不赋予样例统计投资意义。保持同一市场和币种,区分算术一致与未来有效,不能把四条虚构观测的高比率宣传成真实策略成绩。
先确认确实是同一运行
对齐运行身份、数据配置引用、会话、成本和末期持仓,取得真实净值及支持成交。如果一份多一天,或另一份没估开放仓位,差异首先来自输入,不只是公式。不要跳过这些检查,直接争论应乘根号二百五十二还是其他数。
确认两份净值在相同费用之后。已经入账的交易费包含在净值中,再从各期收益减一次会重复扣除。先勾稽现金、证券和成本,再把序列作为共同指标基础。只有总利润一样,也不足以证明逐期路径一样,后者直接影响波动与夏普。
检查外部投入与取款,相邻余额比值不会自动剔除资金流。需要取得恰当的流量调整收益,或先做另一项资金流重算。本文没有外部流水,五个合成估值连续,因此在声明边界内可以使用普通相邻比值,不能将此条件推广到持续入金账户。
把公式契约写清
逐报告列收益类型、采样期间、收益条数、基准或无风险约定、标准差分母和年化因子。算术均值与复合增长、简单收益与对数收益分别标明。列名都叫return,并不证明拿到相同向量,默认值也必须查证。
Sharpe本人原文讨论历史差额收益均值相对变动性的比率,并说明时间依赖。本文无风险设零,采用常见平方根缩放来核对算术,属于声明假设,不是对所有存在自相关股票收益的通用统计修正。
共同约定为逐会话简单收益、样本标准差、每模型年二百五十二会话、无风险零。二百五十二是示意选择,不能自动适配所有市场和频率,也不能从四个观测推断已覆盖一年。真实市场日历与计分周期需要另外确认。
五个净值生成四条收益
合成净值为[100,101,100,102,101],相邻简单收益按后值除前值再减一,约为百分之一、负百分之〇点九九〇〇九九、百分之二、负百分之〇点九八〇三九二。五个估值只有四条收益,不是五条。全期账户回报百分之一,又与四条收益算术平均不同。
保留会话键,计算前确认频率。缺中间估值不能直接丢掉,再把跨两期变化当一期。样例检查缺失数值,但信任其固定连续会话输入,没有实现通用交易所日历验证器;接入真实数据时不能省掉这一前置步骤。
Python statistics文档区分样本stdev和总体pstdev。共同结果采用前者,另算后者复现一种报告分歧。没有运行数据科学库或金融服务,公式各项都可以直接查看,读者不需依赖一个不可见的默认指标函数。
复现两类报告不一致
平均超额收益除样本标准差,再乘二百五十二平方根,结果二点七三八七七七七七。同样四条收益改总体标准差,得到三点一六二四六八一六;继续用样本标准差,但年化改三百六十五,得到三点二九六一一九五五。
| 口径 | 合成年化比率 |
|---|---|
| 样本标准差,252 | 2.73877777 |
| 总体标准差,252 | 3.16246816 |
| 样本标准差,365 | 3.29611955 |
四条观测下,总体口径是样本口径乘√(4/3);三百六十五口径是原结果乘√(365/252)。代码实际断言两种关系,无需改变成交或另造价格,就解释了差额。显示的小数位与内部比较精度分开,不能用舍入标签作为相等证明。
高比率只来自四条虚构观测,没有支持策略优秀的证据。这里故意让口径影响容易观察,目的不是估计可信长期风险调整收益,也不评价任何真实证券。把数算对,是研究条件之一,不是有效性结论本身。
按共同口径独立重算
核心公式如下,完整例还检查无效输入和标准差边界:
returns = [b/a - 1 for a, b in zip(equity, equity[1:])]
period_rf = (1 + annual_rf) ** (1 / annual_sessions) - 1
excess = [r - period_rf for r in returns]
ratio = sqrt(annual_sessions) * mean(excess) / stdev(excess)
无风险换算把年值当作有效年利率。连续复利、报价收益率或逐日变化基准都需要另外声明的转换。本例默认零,不影响打印表,但真实报告的非零年值不能直接每天减一次,也不能百分比小数单位混用。
程序还用偏差平方和独立推导样本标准差,与函数结果在相对容差一万亿分之一内核对。这是小样例的算术断言,不是所有报告导出的统一容差建议。真实政策应提前确定数值单位、容差和舍入,不要看到差额后才放宽。
不可计算就保留不可用
两个净值只有一条收益,不能计算样本标准差,返回样本不足。三个相同净值波动零,返回零波动。序列含缺失,返回无效或缺失。三类都不补成夏普零,也不把空白当作策略表现一般。
零波动反例不同于“波动不为零、均值恰为零”的合法零比率。填零会混淆未定义与已计算,还会改变排名。显示无穷大也不能据此宣布无风险盈利,特别是在短合成序列或输入缺失导致的常数曲线上。
非正净值、无效年化次数、无效有效年利率应拒绝或采用另一模型。普通简单收益要求正基数,不能静默裁剪不可能值。样例也拒绝非正会话数及小于等于负百分之百的有效年值,避免复合换算失去当前模型含义。
剩余差额逐层定位
公式统一后,逐项比原始向量、日期键、费用、无风险序列及中间均值和标准差。一次只改一项,保留前后表。仍超容差时,调查舍入、漏日或未声明变换,不能不断更换年化因子,直到撞中偏好数字。
原报告与重算并列,不覆盖原值。检查者应看见哪些差额由样本分母解释,哪些还未知。支持成交用于核对费用和敞口,但夏普来自声明收益序列,不直接来自盈利交易金额清单。每笔与每日比率的观察单位、持续时间不同,不能混排。
导出可复算指标表
交接包含五个净值、四条收益、无风险约定、样本量、均值、标准差、年化因子、最终值和不可用原因。每项对应运行和期间引用,避免后来抄表时把另一版本指标贴到当前净值。初值和末值的百分之一复合桥也一起保存。
如果导出只保留两位收益小数,精度可能不足以重现原指标,应取得未舍入序列,或明确可达到的容差范围。不能用大量小数显示制造精确感,却不给支持那些位数的输入。不同周期对照还要说明时间跨度,不把频率变化误称为数值计算误差。
最后核对结果状态是否跟数值一起传播到前端或表格。无效状态若导出时被默认填成零,正确底层函数也无法保护最终排名。本文独立脚本保留状态和空比率,但没有验证任何产品渲染或导出流程,真实使用仍需端到端检查。
基准还应与账户币种和期间相符。把另一币种利率直接当成本币无风险值,会引入新的经济假设,并非单纯公式选择。需要另外转换时,保留来源和转换政策,不在当前差额表中静默处理。
运行与验收
下载完整示例。使用Python 3.12或更新版本,运行python R620.py。标准库断言复现三个比率,核对独立样本算术与口径比例,并保留样本不足、零波动和缺失的不可用状态。输出只证明这些合成规则。
验收要求运行身份和输入一致,公式选择有记录,剩余数值差额满足预定容差或有明确解释。净值、成本、频率、基准或年化改变后重算,保留原报告版本。算术一致不验证真实行情、投资显著性或产品行为,不能把口径勾稽说成策略盈利审计。
常见问题
每日和每笔夏普能直接比吗?
不能。观察单位与时间约定不同,需要明确共同基础。
零波动就是夏普零吗?
不是。本公式分母零时不可计算。