python量化策略——大类资产配置模型(最小方差模型)

最小方差模型

寻求风险最小的大类资产组合。

max ⁡ = X T Σ X \max=X^{T}\Sigma X max=XTΣX
s . t . Σ X = 1 , X i ≥ 0 , i = 1 , 2 , 3... s.t. \quad \Sigma X=1 ,X_{i} \ge 0,i=1,2,3... s.t.ΣX=1,Xi0,i=1,2,3...
#其中 X X X表示资产配置权重向量, Σ \Sigma Σ表示各个资产间的协方差矩阵,我们将选取三个大类资产进行配置,分别是:股票(沪深300),债券(上证国债指数000012),南华商品期货指数(NHCI.NH)进行配置。

代码:

# coding=utf-8
import math
import tushare as ts
import pandas as pd
from datetime import datetime, date 
from scipy import stats,integrate
import cvxpy as cp
import numpy as np
ts.set_token('token码')#获取地址 https://tushare.pro/register?reg=385920
pro = ts.pro_api()
#读取数据
def DF( code='000300.SH'):
    
    df = pro.index_daily( ts_code=code, start_date='20100101', end_date='20200810')
    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").values
ret_hs300=DF().values
ret_sz=DF('000012.SH').values

Sigma=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-8
import math
import tushare as ts
import pandas as pd
from datetime import datetime, date 
from scipy import stats,integrate
import cvxpy as cp
import numpy as np
from scipy.optimize import minimize
import talib
from datetime import datetime, date

ts.set_token('0f14f54c9a2346ec82eb670aeb9a296df74387aaeb88e1e5ca57518a')#获取地址 https://tushare.pro/register?reg=385920
pro = ts.pro_api()
#读取数据
def DF( code='000300.SH'):
    
    df = pro.index_daily( ts_code=code, start_date='20100101', end_date='20200810')
    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").values
ret_hs300=DF().values
ret_sz=DF('000012.SH').values

A=np.cov( np.vstack([ret_nh,ret_hs300,ret_sz]))#协方差

def objective(x):
    return x.T@A@x

def constraint1(x):
    return x[0]+x[1]+x[2] -1


# initial guesses
n = 3
x0 = np.zeros(n)
x0[0] = 0.3
x0[1] = 0.3
x0[2] = 0.4


# show initial objective
print('Initial SSE Objective: ' + str(objective(x0)))

# optimize
b = (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 objective
print('Final SSE Objective: ' + str(objective(x)*np.sqrt(252)))

# print solution
print('Solution')
print('x1 = ' + str(x[0]))
print('x2 = ' + str(x[1]))
print('x3 = ' + str(x[2]))


结果:

Initial SSE Objective: 0.012451694912513387
Final SSE Objective: 0.15225413537501667
Solution
x1 = 0.5189783250182055
x2 = 0.013884606368403066
x3 = 0.46713706861339144

两种结果一样

其他量化策略

1.python量化——alpha股票-指数期货对冲策略
2.多因子选股策略
3.海龟交易策略
4.移动平均策略——单/双均线策略
5.改进的美林时钟(介绍)
6.改进的美林时钟策略(一)
7.改进的美林时钟策略(二)
8.改进的美林时钟策略(三)
9.F-F三因子(改进代码+结果)
10.移动波动率策略

你可能感兴趣的:(python量化)