策略年化收益计算公式
年化收益率是评估任何投资策略(包括量化策略)最核心、最直观的指标之一,但它绝不是一个孤立的数字。必须将其放在风险、市场环境、计算方法和对比基准的背景下进行全面分析,否则极易产生误导。
一、年化收益率的定义与计算
定义:年化收益率是把策略在特定时间段内的总收益(无论策略运行了1个月还是5年),换算成相当于投资期限为一年的标准化收益率。其目的是为了消除投资期限不同带来的比较障碍,使不同策略之间的收益表现具有可比性。
核心计算方法:
- 总收益率法(简单情况):
- 如果策略运行了
T
年(T可以是小数,如0.5年代表6个月),总收益率为R_total
。 年化收益率 = (1 + R_total)^(1/T) - 1
- 例子:策略运行3年,总收益为50%(即
R_total = 0.5
)。年化收益率 = (1 + 0.5)^(1/3) - 1 ≈ 14.47%
- 复利法(更精确,考虑资金进出):
- 通常使用时间加权收益率(Time-Weighted Rate of Return, TWR) 来消除资金流入流出的影响,然后进行年化。
- 或者通过策略的每日/每周/每月收益率序列进行计算:
年化收益率 = (1 + 平均周期收益率)^(年化周期数) - 1
- 例子:策略有250个交易日,每日平均收益率为0.05%。
年化收益率 = (1 + 0.0005)^250 - 1 ≈ 13.3%
二、深入分析年化收益的多个维度
只看一个孤立的年化收益数字是极其危险的。一个30%的年化收益,可能来自高风险赌博,也可能来自稳健的套利。必须结合以下维度进行分析:
1. 风险调整后收益(最重要的一环)
高收益可能只是承担了更高风险的补偿。风险调整后收益才能真实反映策略的“性价比”。
- 夏普比率:最常用的风险调整收益指标。
公式 = (年化收益率 - 无风险利率) / 年化波动率
- 解读:它表示每承受一单位总风险(波动),能获得多少超出无风险利率的超额收益。夏普比率越高,策略的“质量”通常越好。通常,夏普比率大于1被认为是好的,大于2是非常优秀的。必须注意,计算夏普比率时使用的波动率是年化的。
下面是计算的公式代码
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime
def simple_annualized_return(initial_value, final_value, days):
"""
计算简单年化收益率
参数:
initial_value -- 初始投资金额
final_value -- 最终价值
days -- 投资天数
返回:
年化收益率(小数形式)
"""
holding_period_return = (final_value - initial_value) / initial_value
years = days / 365
annualized_return = holding_period_return / years
return annualized_return
def cagr(initial_value, final_value, years):
"""
计算复合年化增长率(CAGR)
参数:
initial_value -- 初始投资金额
final_value -- 最终价值
years -- 投资年数
返回:
年化收益率(小数形式)
"""
if years <= 0:
raise ValueError("投资年数必须大于0")
if initial_value <= 0:
raise ValueError("初始投资金额必须大于0")
cagr = (final_value / initial_value) ** (1 / years) - 1
return cagr
def annualized_return_from_periodic(returns, periods_per_year=252):
"""
根据周期收益率计算年化收益率
参数:
returns -- 周期收益率列表(小数形式)
periods_per_year -- 年化周期数(默认252个交易日)
返回:
年化收益率(小数形式)
"""
if not returns:
return 0
cumulative_return = np.prod([1 + r for r in returns]) - 1
n_periods = len(returns)
years = n_periods / periods_per_year
annualized_return = (1 + cumulative_return) ** (1 / years) - 1
return annualized_return
def visualize_growth(initial_value, annual_return, years):
"""
可视化投资增长情况
参数:
initial_value -- 初始投资金额
annual_return -- 年化收益率(小数形式)
years -- 投资年数
"""
values = [initial_value]
for i in range(1, years + 1):
values.append(values[-1] * (1 + annual_return))
plt.figure(figsize=(10, 6))
plt.plot(range(years + 1), values, marker='o')
plt.title('投资增长可视化 (年化收益率: {:.2%})'.format(annual_return))
plt.xlabel('年份')
plt.ylabel('投资价值')
plt.grid(True)
plt.show()
# 示例使用
if __name__ == "__main__":
# 示例1: 简单年化收益率计算
initial = 10000
final = 12000
days = 180
simple_ar = simple_annualized_return(initial, final, days)
print(f"简单年化收益率: {simple_ar:.2%}")
# 示例2: CAGR计算
years = 3
cagr_value = cagr(initial, final, years)
print(f"复合年化增长率(CAGR): {cagr_value:.2%}")
# 示例3: 从周期收益率计算年化收益率
daily_returns = [0.01, -0.005, 0.02, 0.015, -0.01] # 5个交易日的收益率
annualized = annualized_return_from_periodic(daily_returns)
print(f"从周期收益率计算的年化收益率: {annualized:.2%}")
# 示例4: 可视化投资增长
visualize_growth(initial_value=10000, annual_return=0.08, years=10)
数据结果