资产收益率与风险
pandas读取数据可以使用一列作为索引(时间)
data=pd.read_csv('',index_col='')
data.index=pd.to_datetime(data.index)
data.index.name='Date'
收益率计算
直接算
close # Date price
# 价格滞后一期
lagclose=close.shift(1)
# 一期收益率
simpleret=(close-lagclose)/lagclose
simpleret.name='simpleret'
# 两期收益率
simpleret2=(close-close.shift(2))/close.shift(2)
simpleret2.name='simpleret2'
# 合并
calret=pd.DataFrame({'close':close,'lagclose':lagclose})
calret=pd.merge(calclose,pd.DataFrame(simpleret))
calret['simpleret2']=pd.DataFrame(simpleret)
ffn库
import ffn
# 价格计算收益率
ffnsimpleret=ffn.to_returns(close)
ffnsimpleret.name='ffnsimpleret'
# 复利收益率
ffncomporet=ffn.te_log_returns(close)
ffncomporet.name='ffncomporet'
可以直接调用DataFrame的plot方法绘制图
simpleret.plot() # 收益率
((1+simpletret).cumprod()-1).plot() # 累计收益率
风险度量
方差
.var()
.std()
下行风险(Downside Deviation)
资产价格低于无风险收益率部分的发散程度
def cal_downside_deviation(returns,rf=None):
if rf==None:
rf=returns.mean()
temp=returns[returns<rf]
dev=(sum((rf-temp)**2)/len(returns))**0.5
return dev
风险价值(Risk at Value)
在α%置信水平下,可能发生的最大损失。
历史模拟法(用历史数据分布计算)
returns.quantile(0.05)
returns.quantile(α%)
协方差矩阵法(用正态分布)
from scipy.stats import norm
norm.ppf(α%,returns.mean(),returns.std())
期望亏空(ES)
收益率低于VaR的期望。
returns[returns<=returns.quantile(0.05)].mean()
最大回撤
maxdrawdown=ffn.calc_max_drowdown(returns)