目录
一、当数据为净值,求年化收益率
前置:
文章中用到的数据
链接:https://pan.baidu.com/s/1rKLM45dq_xIKxcI54Nq0qg
提取码:c298
公式:
计算过程(jupyter notebook):
import pandas as pd
df = pd.read_csv('./temptemp.csv',encoding='utf-8')
df['o_date'] = df['date']
df['o_date'] = pd.to_datetime(df['o_date'])
df.dropna(inplace=True)
df.sort_values(by='o_date', ascending=True, inplace=True)
df.head()
# value值从1开始,每一日的value是当日的净值
# 对应到公式,第一行的value为初始净值,最后一行的value为最终净值
first_one = df.iloc[0]
last_one = df.iloc[-1]
annual_profilt = pow(last_one['value']/first_one['value'],250/len(df))-1
annual_profilt
二、当数据为收盘价,求年化收益率
推导:
设,
1. 周期为p,例如p可以是日、周、月、季度等,对应的就是日收益率、周收益率、月收益率、季度收益率等;数据个数为N
2. 每期收益率为Rp,每期平均收益率为,年化平均收益率为
3. 对应周期p,一年有m个周期p,例如:p为日,m为252;p为周,m为52;p为月,m为12等
求,
1. 每期平均收益率
2. 年化收益率
代码:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
df_aapl = pd.read_csv('AAPL.csv',encoding='utf-8')
df_aapl.head()
df_aapl['ret'] = df_aapl['Close'].pct_change()
df_aapl.head()
df_aapl['ret'].plot(figsize=(8,4))
# 计算日平均收益率
# prod() 将所有数值乘起来
r_daily_mean = ((1+df_aapl['ret']).prod())**(1/df_aapl.shape[0])-1
r_daily_mean
# out: 0.0006941719590121131
# 计算年收益率
annual_rets = (1+r_daily_mean)**252-1
annual_rets
# out: 0.19109213356890775
# 适用不同周期收益率计算年化收益率函数
def annualize_rets(returns,n_periods):
'''
给定一系列的收益率和期数,算出年化收益率
'''
# 每一期的平均收益
r_periodic_mean = ((1+returns).prod())**(1/returns.shape[0])-1
return (1+r_periodic_mean)**n_periods-1
annualize_rets(df_aapl['ret'],252)
# out: 0.19109213356890775