代码如下:
####### step1
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from scipy.optimize import minimize# 读取收盘价数据
def read_data(file):s="C:/Users\Anita\Desktop"file_address=s+filedf= pd.read_excel(file_address,sheetname="data") # 保证金比例marginal_cost=[0.15,0.3,0.02,0.15,1,1]# 删除前两行说明行df.drop(0,inplace=True)df.drop(1,inplace=True)# 删除最后一行2018年的3月数据df.drop(1497,inplace=True)# 把日期列设置为索引df.set_index('Date',inplace=True)# 缺失值检验:没有缺失值df.isnull().any()  # 把日数据转换为月数据period_type = 'M'__df= df.resample(period_type).last()monthly_df=pd.concat([df.iloc[0,0::].T,__df.T],axis=1).Treturn monthly_df# 计算对数收益率
def calculate_log_return(file):data=read_data(file)variable_list=['IF00.CFE','IC00.CFE','TF00.CFE','AU00.SHF','159920.OF','511880.SH']for j in variable_list:data['return_'+str(j)]=0.0for i in range(1,len(data)):data['return_'+str(j)][i]=np.log(float(data[j][i])/float(data[j][i-1]))return data.iloc[1::,0::]# 将收益率进行标准化处理,形成新的表格std_data
def standardlize_process(file):data=calculate_log_return(file)scaler=StandardScaler()scaler.fit(data)column_list=['IF00.CFE','IC00.CFE','TF00.CFE','AU00.SHF','159920.OF','511880.SH','return_IF00.CFE','return_IC00.CFE','return_TF00.CFE','return_AU00.SHF','return_159920.OF','return_511880.SH']std_data=pd.DataFrame(scaler.transform(data),columns=column_list,index=data.index)std_data=std_data.iloc[:,6::] return std_data#资产收益率序列相关性检验:滚动计算资产的协方差矩阵
def cov_asset(file):return standardlize_process(file).rolling(window=12).cov().iloc[66::,0::] # 风险度量期间为一年,故滚动窗口设置为12个月,从2012-12月末到2018-02月末共计 63个月,每个月6条记录,共63*6=378条记录# 协方差矩阵
cov_matrix=np.matrix(cov_asset("\数据.xlsx"))##### step2# 计算每类资产对总资产组合的风险贡献
def calculate_risk_contribution(weight,one_cov_matrix):weight=np.matrix(weight) sigma=np.sqrt(weight*one_cov_matrix*np.matrix(weight).T)# 边际风险贡献 Marginal Risk Contribution (MRC)MRC=one_cov_matrix*weight.T/sigma# 风险贡献 Risk Contribution (RC)RC=np.multiply(MRC,weight.T)return RC# 定义优化问题的目标函数,即最小化资产之间的风险贡献差
def risk_budget_objective(x_weight,parameters): # x_weight是带求解的各个大类资产下面子标的的权重,parameters是下面函数中的args=[one_cov_matrix,RC_set_ratio]参数传递# x_weight的初始值是函数 calculate_portfolio_weight中的 weight0# 协方差矩阵,也即函数 calculate_portfolio_weight 中传递的 args中的第一个参数 one_cov_matrixone_cov_matrix=parameters[0]# 风险平价下的目标风险贡献度向量,也即函数 calculate_portfolio_weight 中传递的 args中的第二个参数 RC_set_ratioRC_target_ratio=parameters[1] # RC_target为风险平价下的目标风险贡献,一旦参数传递以后,RC_target就是一个常数,不随迭代而改变sigma_portfolio=np.sqrt(x_weight*one_cov_matrix*np.matrix(x_weight).T)RC_target=np.asmatrix(np.multiply(sigma_portfolio,RC_target_ratio))# RC_real是 每次迭代以后最新的真实风险贡献,随迭代而改变RC_real=calculate_risk_contribution(x_weight,one_cov_matrix)sum_squared_error= sum(np.square(RC_real-RC_target.T))[0,0] return sum_squared_error# 优化问题的第一个约束条件
def constraint1(x_weight):return np.sum(x_weight)-1.0# 优化问题的第二个约束条件
def constraint2(x_weight):return x_weight# 根据资产预期目标风险贡献度来计算各资产的权重
def calculate_portfolio_weight(RC_set_ratio,one_cov_matrix):weight0=[0.2, 0.2, 0.2, 0.1, 0.1, 0.2] cons=({'type': 'eq', 'fun': constraint1},{'type': 'ineq', 'fun': constraint2})res= minimize(risk_budget_objective, weight0, args=[one_cov_matrix,RC_set_ratio], method='SLSQP',constraints=cons, options={'disp': True})weight_final= np.asmatrix(res.x)return weight_finaldef calculate_monthly_weight(RC_set_ratio):result={}year=['2012','2013','2014','2015','2016','2017','2018']month=['01','02','03','04','05','06','07','08','09','10','11','12']for i in range(63):date=str(2012+int((i+11)/12))+'-'+ month[(i-1)%12]one_cov_matrix=cov_matrix[i*6:(i*6+6)]result[date]=pd.DataFrame(calculate_portfolio_weight(RC_set_ratio,one_cov_matrix)).iloc[0,0::]#xx=pd.DataFrame(result,index=date)return result## 计算风险平价下每月的资产配置权重 # 假设1:四个资产的风险贡献度相等# 假设2:同类资产下每个标的的风险贡献相同
df_monthly_weight=pd.DataFrame(calculate_monthly_weight([0.25/3, 0.25/3, 0.25, 0.25, 0.25/3, 0.25])).T
df_monthly_weight.columns=['IF00.CFE','IC00.CFE','TF00.CFE','AU00.SHF','159920.OF','511880.SH']
df_monthly_weight#### step3:回测Backtest
## 基于过去一年的风险分配权重,计算各资产的月度收益率
def calculate_RC_monthly_return(file):std_df=standardlize_process(file)   date_list=[]for i in range(63):date_list.append(str(2012+int((i+11)/12))+'-'+ month[(i-1)%12])#date_list_std_df=std_df.iloc[11::,0::].T_std_df.columns=date_list__std__df=_std_df.T__std__df['key']=__std__df.indexdf_monthly_weight['key']=df_monthly_weight.index# 合并表,将月收益数据和权重表横向合并monthly_return=pd.merge(__std__df, df_monthly_weight,on='key')monthly_return.set_index('key',inplace=True)column_list=['return_IF00.CFE','return_IC00.CFE','return_TF00.CFE','return_AU00.SHF','return_159920.OF','return_511880.SH','IF00.CFE','IC00.CFE','TF00.CFE','AU00.SHF','159920.OF','511880.SH']# 计算加权后的各资产收益率:权重乘以资产收益率for i in range(6):monthly_return['weight'+'_'+column_list[i]]=monthly_return[column_list[i]]*monthly_return[column_list[i+6]]monthly__return=monthly_return.iloc[0::,-6::]monthly__return['all_portfolio_return']=monthly__return.apply(lambda x: x.sum(), axis=1)# 用债券收益率作为benchmarkmonthly__return['benchmark']=monthly_return['return_TF00.CFE']return monthly__return## 收益回测,模型评价
def backtest_model1(monthly_data):# 设置评价指标total_return={}annual_return={}excess_return={}annual_volatility={}sharpe={}information_ratio={}win_prob={}drawdown={}tr={}# 单独计算benchmark的相关指标portfolio_list=['weight_return_IF00.CFE','weight_return_IC00.CFE','weight_return_TF00.CFE','weight_return_AU00.SHF','weight_return_159920.OF','weight_return_511880.SH','all_portfolio_return']bench_total_return=(monthly_data['benchmark']+1).T.cumprod()[-1]-1 bench_annual_return=(float(bench_total_return)+1.0)**(1./(5+1/6))-1 # 每一种指标的具体构建方法for i in portfolio_list: monthly=monthly_data[i] total_return[i]=(monthly+1).T.cumprod()[-1]-1 annual_return[i]=(float(total_return[i])+1.0)**(1./(5+1/6))-1 annual_volatility[i]=monthly.std() sharpe[i]=(annual_return[i]-bench_annual_return)/annual_volatility[i] drawdown[i]=monthly.min() win_excess=monthly-monthly_data['benchmark'] win_prob[i]=win_excess[win_excess>0].count()/float(len(win_excess))# 将字典转换为dataframear=pd.DataFrame(annual_return,index=monthly.index).drop_duplicates().Ttr=pd.DataFrame(total_return,index=monthly.index).drop_duplicates().Tav=pd.DataFrame(annual_volatility,index=monthly.index).drop_duplicates().Tsp=pd.DataFrame(sharpe,index=monthly.index).drop_duplicates().Tdd=pd.DataFrame(drawdown,index=monthly.index).drop_duplicates().Twp=pd.DataFrame(win_prob,index=monthly.index).drop_duplicates().Tar['key']=ar.index  #年化收益tr['key']=tr.index  #累积收益av['key']=av.index  #年化波动sp['key']=sp.index  #夏普比率dd['key']=dd.index  #最大回撤wp['key']=wp.index  #胜率backtest_df=pd.merge(ar,pd.merge(tr,pd.merge(av,pd.merge(sp,pd.merge(dd,wp,on='key'),on='key'),on='key'),on='key'),on='key')backtest_df.set_index('key',inplace=True)backtest_df.columns=['annual return','total return','annual volatility','sharpe ratio','drawdown','win prob']return backtest_dfhh=backtest_model1(calculate_RC_monthly_return("\数据.xlsx"))
hh

基于风险平价的资产配置策略相关推荐

  1. 风险平价策略python代码_风险平价组合(risk parity)理论与实践

    本文介绍了风险平价组合的理论与实践:后续文章将对risk parity组合进行更深入探讨以及引入预期收益后的资产配置实战策略. 前言 资产配置是个很广泛的话题,在投资中是一个非常重要的话题 从使用场景 ...

  2. 组合优化- 均值方差、最大夏普、风险平价模型

    组合优化- 均值方差.最大夏普.风险平价模型-基于matlab的实现 理论性质的大家参考网上搜索吧: 关键词:均值方差模型的实现 风险平价模型的实现 组合优化matlab 以上模型实现本质是 二次规划 ...

  3. 尾部相性尾部风险平价和圣杯布

    转 尾部相关性.尾部风险平价和圣杯分布 作者:石川,量信投资创始合伙人,清华大学学士.硕士,麻省理工学院博士:精通各种概率模型和统计方法,擅长不确定性随机系统的建模及优化.知乎专栏:https://z ...

  4. 风险平价组合(risk parity)理论与实践

    本文介绍了风险平价组合的理论与实践:后续文章将对risk parity组合进行更深入探讨以及引入预期收益后的资产配置实战策略.感兴趣的朋友可以直接前往BigQuant人工智能量化投资平台克隆代码进行复 ...

  5. 大类资产智能投顾模型:从风险平价开始,夏普比1.9

    原创文章第86篇,专注"个人成长与财富自由.世界运作的逻辑, AI量化投资". 此前,我们确定了专注未来专注于两个方向: 一是智能投顾方向,用于资产管理,基础是现代投资组合理论,配 ...

  6. 【基金量化研究系列】大类资产配置研究(一)——股债二八配置策略与股债风险平价策略

    文章目录 1. 引言 1.1 资产配置简介 1.2 可投标的说明 1.3 市场基本情况与数据库使用的说明 1.4 本文策略基本假设 2. 资产配置策略一--股债二八策略 2.1 策略简介 2.2 基于 ...

  7. 【Python量化】风险平价策略

    文章目录 一.风险平价策略 二.风险平价组合的构建步骤 第一步,选择底仓. 第二步,计算资产对组合的风险贡献. 第三步,优化组合风险贡献,计算资产权重. 三.风险平价组合的Python实现 3.1 数 ...

  8. 第三届大湾区杯B题思路及代码-基于宏观经济周期的大类资产配置策略构建

    B 题 基于宏观经济周期的大类资产配置策略构建 赛题背景介绍: 赛题数据描述: 问题1. 寻找出高频有效的宏观经济指标,将 2001 年-2021 年国内的宏观经济运行状况划 分成不同的经济状态:(比 ...

  9. 大类资产配置(二)风险预算及风险平价模型

    https://xueqiu.com/9509413026/173064820 风险预算的关键思路在于:测算某种资产的边际风险贡献,即该资产权重的微小变化,对组合风险的影响.从风险预算标准看,当每一种 ...

最新文章

  1. 在桌面右键菜单,停止工作,并提示“资源管理器停止工作”等情况。
  2. 开源Pravega架构解析:如何通过分层解决流存储的三大挑战?
  3. 使用多个JFrame:好的还是不好的做法? [关闭]
  4. 树莓派与Android客户端进行socket通信
  5. Nginx日志文件的配置
  6. ooalv自定义按钮、单击、双击、列编辑切换的事件用法
  7. 危机永远回来,只是什么时候的问题
  8. 开发HTML5手机游戏的5个注意要点--手机开发前景-- 转
  9. mysql 根据地图 坐标 查询 周边景区、酒店
  10. 信息学奥赛一本通 1136:密码翻译 | OpenJudge NOI 1.7 09
  11. 别再只盯着国外!在集设发现了优秀设计师原创作品!
  12. HDU2027 统计元音【文本处理】
  13. 知也atitit.解决struts2 SpringObjectFactory.getClassInstance NullPointerException  v2 q31无涯 - I...
  14. MonkeyEye电影售票系统--系统顺序图
  15. 三阶段最小二乘法 回归分析 3SLS python实现
  16. 《android开发艺术探索》笔记
  17. IDEA配置Tomcat时总是提示:Error running ‘Tomcat 8.5.73‘ 问题
  18. 将 s1 和 r1 上的启动配置文件上传到服务器进行备份,packettracer综合技能练习261...
  19. 微信小程序开发13 云开发:云原生一体化应用开发平台
  20. Java钉钉开发_Exception_异常总结

热门文章

  1. 毕生精力总结的电脑技巧
  2. 【安卓基础】Android直接通过路径来操作其他应用的私有目录,可以吗?
  3. 基于ResNet的猫十二分类
  4. oracle数据库之数据的增删改以及简单的单表查询
  5. Linux下shell脚本的编写
  6. 排序算法整理(冒泡、选择、快排、堆排序、希尔、归并)
  7. cocos2d-之音乐背景播放
  8. 使用Session+Cookie实现7天免登录
  9. 图片怎么转为html格式,ps图片怎么转换为html ps图片转换为html图文教程
  10. python的拼音_Python返回汉字的汉语拼音(原创) | 学步园