最小方差模型
寻求风险最小的大类资产组合。
max=XTΣX\max=X^{T}\Sigma Xmax=XTΣX
s.t.ΣX=1,Xi≥0,i=1,2,3...s.t. \quad \Sigma X=1 ,X_{i} \ge 0,i=1,2,3...s.t.ΣX=1,Xi≥0,i=1,2,3...
#其中XXX表示资产配置权重向量,Σ\SigmaΣ表示各个资产间的协方差矩阵,我们将选取三个大类资产进行配置,分别是:股票(沪深300),债券(上证国债指数000012),南华商品期货指数(NHCI.NH)进行配置。
代码:
# coding=utf-8import mathimport tushare as tsimport pandas as pdfrom datetime import datetime, date from scipy import stats,integrateimport cvxpy as cpimport numpy as npts.set_token('token码')#获取地址 https://tushare.pro/register?reg=385920pro = ts.pro_api()#读取数据def DF( code='000300.SH'):df = pro.index_daily( ts_code=code, start_date='0101', end_date='')df=df.sort_index(ascending=False)df.index=pd.to_datetime(df.trade_date,format='%Y-%m-%d')#设置日期索引df_close=(df.close/df.close[0])#计算净值return (df_close)ret_nh=DF("NHCI.NH").valuesret_hs300=DF().valuesret_sz=DF('000012.SH').valuesSigma=np.cov( np.vstack([ret_nh,ret_hs300,ret_sz]))#协方差# Create two scalar optimization variables.x = cp.Variable(3)# Create two constraints.constraints = [ x[0]+x[1] +x[2] ==1, x[0]>=0,x[1]>=0,x[2]>=0 ]#必须是凸集才可以# Form objective.obj = cp.Minimize( cp.quad_form(x, Sigma) ) #必须是凸的才可以prob = cp.Problem(obj, constraints)# Solve with ECOS_BB.prob.solve(solver=cp.SCS)print("最优波动率:%.4f" %( prob.value*np.sqrt(252)*100),'%')#最优解print("商品期货:%.2f, 股票: %.2f 债券: %.2f" %(x[0].value,x[1].value,x[2].value))
结果
最优波动率:15.2254 %商品期货:0.52, 股票: 0.01 债券: 0.47
另一种,为四个资产df1 df2 df3 df4按最小风险配置
# coding=utf-8import mathimport tushare as tsimport pandas as pdfrom datetime import datetime, date from scipy import stats,integrateimport cvxpy as cpimport numpy as npfrom scipy.optimize import minimizeimport talibfrom datetime import datetime, datets.set_token('0f14f54c9a2346ec82eb670aeb9a296df74387aaeb88e1e5ca57518a')#获取地址 https://tushare.pro/register?reg=385920pro = ts.pro_api()#读取数据def DF( code='000300.SH'):df = pro.index_daily( ts_code=code, start_date='0101', end_date='')df=df.sort_index(ascending=False)df.index=pd.to_datetime(df.trade_date,format='%Y-%m-%d')#设置日期索引df_close=(df.close/df.close[0])#计算净值return (df_close)ret_nh=DF("NHCI.NH").valuesret_hs300=DF().valuesret_sz=DF('000012.SH').valuesA=np.cov( np.vstack([ret_nh,ret_hs300,ret_sz]))#协方差def objective(x):return x.T@A@xdef constraint1(x):return x[0]+x[1]+x[2] -1# initial guessesn = 3x0 = np.zeros(n)x0[0] = 0.3x0[1] = 0.3x0[2] = 0.4# show initial objectiveprint('Initial SSE Objective: ' + str(objective(x0)))# optimizeb = (0.0,1.0)bnds = (b,b,b)con1 = {'type': 'eq', 'fun': constraint1} #con2 = {'type': 'eq', 'fun': constraint2}#cons = ([con1,con2])solution = minimize(objective,x0,method='SLSQP',bounds=bnds,constraints=con1)x = solution.x# show final objectiveprint('Final SSE Objective: ' + str(objective(x)*np.sqrt(252)))# print solutionprint('Solution')print('x1 = ' + str(x[0]))print('x2 = ' + str(x[1]))print('x3 = ' + str(x[2]))
结果:
Initial SSE Objective: 0.012451694912513387Final SSE Objective: 0.15225413537501667Solutionx1 = 0.5189783250182055x2 = 0.013884606368403066x3 = 0.46713706861339144
两种结果一样
其他量化策略
1.python量化——alpha股票-指数期货对冲策略
2.多因子选股策略
3.海龟交易策略
4.移动平均策略——单/双均线策略
5.改进的美林时钟(介绍)
6.改进的美林时钟策略(一)
7.改进的美林时钟策略(二)
8.改进的美林时钟策略(三)
9.F-F三因子(改进代码+结果)
10.移动波动率策略