两类投资组合策略及代码
CPPI
概念
固定比例投资组合保险策略
公式
A t = D t + E t A_t=D_t+E_t At=Dt+Et
E t = m i n { M ∗ ( A t − F t ) , A t } E_t=min\lbrace\ M*(A_t-F_t),A_t\rbrace Et=min{ M∗(At−Ft),At}
A t 指 t 期 总 资 产 , D t 指 无 风 险 资 产 , E t 指 风 险 资 产 , F t 指 最 低 保 险 金 额 , M 指 投 资 乘 数 A_t指t期总资产,D_t指无风险资产, E_t指风险资产,F_t指最低保险金额,M指投资乘数 At指t期总资产,Dt指无风险资产,Et指风险资产,Ft指最低保险金额,M指投资乘数
例子
固定比例投资组合保险策略的具体操作方式与买入持有策略类似,运用此投资组合保险策略,就是投资者先决定乘数 M,并确定要保金额,再将要保金额值的现值投资于无风险资产,另将剩余的金额投资于风险资产。
为了便于说明,下面我们举一个简单的例子:设投资人的起初总资产价值为100万,某风险资产组合的总市值也为100万,最低保险金额为80万,乘数大小为2。因此,期初以40万投资在风险资产组合上,作为主动性资产,其余60万投资在无风险资产上,作为保留资产。当风险资产组合的总市值从100%跌至80%时,此时投资人在风险资产组合上的投资值变为32万。此时投资人的资产总值为92万。根据CPPI的策略,此时投资人应投资在主动性资产上的仓位为24万。这时投资人在风险资产组合中的仓位减少8万。同理,当风险资产组合的总市值从100万升到120万,投资人投资在风险资产组合中的仓位从40万升到56万。
代码
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
def MaxDrawdown(return_list):
'''最大回撤率'''
i = np.argmax((np.maximum.accumulate(return_list) -
return_list) / np.maximum.accumulate(return_list)) # 结束位置
if i == 0:
return 0
j = np.argmax(return_list[:i]) # 开始位置
return (return_list[j] - return_list[i]) / (return_list[j])
def calc_rate(day, rate, rate_type):
if rate_type == 0:
return (1 + rate*day)
elif rate_type == 1:
return np.exp(rate*day)
def getData(filename):
"""
处理数据,获得各年的日涨跌幅
: param filename: 输入文件,需要包含两列,日期和日涨跌
: return: 输出dateframe格式数据,为按年分的日期和日涨跌
"""
raw_data = pd.read_excel(filename)[['日期', 'rate']]
raw_data.rename(columns={
'日期': 'day', 'rate': 'random_ret'}, inplace=True)
raw_data['day'] = pd.to_datetime(raw_data['day'], format='%Y%m%d')
raw_data.set_index('day', inplace=True)
year = raw_data.resample('y')
year.sum() # 做一次无意义的运算 year才可以用来循环
data = [j for i, j in year]
return data
def outputQuantResult(Return, nav, trading_day_sum):
"""
输入经过该策略后的时间序列结果, 绘制收益图像
: param Return: 收益结果数据
: param nav: 总资产
: param trading_day_sum: 交易日总数
: return Results: Dataframe格式的年收益,年波动性,夏普比率,最大回撤
"""
annual_return, annual_volatility, Sharpe, Maxdrawdown = [], [], [], []
for i in range(len(Return)):
df_return = pd.DataFrame