[Количественная оценка Python] Стратегия паритета рисков


Эта статья была впервые опубликована на официальном аккаунте: Python for Finance

Ссылка: https://mp.weixin.qq.com/s/9FkCgVhygWDFWTBVhy-Spw

1. Стратегия паритета риска

Доктор Эдвард Цянь, главный инвестиционный директор Pan Agora Fund, предложил известную стратегию паритета рисков. Позже эта модель использовалась фондом Bridge Water Fund в реальных инвестициях и когда-то имела большой успех.

Эта стратегия выступает за распределение риска, а не за распределение активов. Традиционная модель надеется контролировать волатильность всего инвестиционного портфеля, в то время как паритет риска контролирует относительный риск, так что риски каждого актива относительно сбалансированы. Поскольку риски портфеля сбалансированы, он теоретически может противостоять всем видам рисков, что и является так называемой стратегией All Weather.

24/7 Торговые стратегии

Идея торговой стратегии All Weather заключается в том, что независимо от рыночной среды инвестиционный портфель может получать более высокую доходность с поправкой на риск . Еще из названия видно, что неважно, штормит погода или ясна, я стою на месте и смотрю на ситуацию с улыбкой.

Принцип портфеля паритета риска заключается в определении распределения активов путем распределения средств таким образом, чтобы каждый актив в равной степени вносил вклад в общий риск портфеля. По сути, эта концепция отражает классический портфель 1/n, в котором средства распределяются поровну между всеми активами. По этой причине портфели с равным риском иногда называют портфелями ERC.

2. Этапы построения портфеля паритета риска

Первым шагом является выбор нижнего положения.

Доктор Цянь Эньпин указал в «Основах паритета риска» (2016), что существует три типа премий за риск, стоящих за активами, а именно премия за риск акций, премия за риск процентной ставки и премия за инфляционный риск. С теоретической точки зрения выбор активов с низкой корреляцией, большими различиями в атрибутах активов и хорошей ликвидностью поможет улучшить карту распределения паритета риска.

Второй шаг заключается в расчете доли риска актива в портфеле.

Определим вклад актива в предельный риск в портфеле как частную производную от волатильности портфеля к весу, а вклад актива в общий риск как произведение веса актива и его вклада в предельный риск: MRC i = ∂ σ p ∂ wi = cov ( ri , rp
) σ p TRC i = wi ∂ σ p ∂ wi = wicov ( ri , rp ) σ p MRC_i = \ frac {\ partial \ sigma_p} {\ partial w_i} = \ frac {cov ( r_i,r_p)}{\sigma_p} \\TRC_i=w_i\frac{\partial\sigma_p}{\partial w_i}=w_i\frac{cov(r_i,r_p)}{\sigma_p}МР Ся"="шяσр"="прсо v ( гя,рр)ТР Ся"="жяшяσр"="жяпрсо v ( гя,рр)
Среди них wi w_iжяУказывает вес актива, θ \ тетаθ представляет ковариационную матрицу активов,σ p = w θ w T \sigma_p=\sqrt{w\theta w^T}пр"="шв шТ Измеряйте риск портфеля.

Третий шаг — оптимизация вклада в риск портфеля и расчет веса актива.

Для портфеля с паритетом риска активы вносят равный вклад в общий риск, а именно:
TRC i = TRC j TRC_i=TRC_jТР Ся"="ТР Сдж
Весовое решение по сути представляет собой задачу квадратичной оптимизации.Чтобы найти минимальное значение вклада актива в риск портфеля, в этой статье для ее решения используется функция минимизации в Python: min ∑ i = 1 n ∑ j = 1 n ( TRC
i − TRC j ) 2 s .t .∑ wi = 1 , wi ∈ [ 0 , 1 ] min\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}(TRC_i -TRC_j)^2 \\ ст\сумма w_i=1,w_i\in[0,1]миня = 1ндж = 1н( ТР СяТР Сдж)2с . т .жя"="1 ,жяе[ 0 ,1 ]

3. Реализация портфеля паритета риска на Python

Предположим, что имеется инвестиционный портфель, содержащий 5 акций: Ping An (000001), Gree Electric (000651), Aier Ophthalmology (300015), Kweichow Moutai (600519) и Changan Automobile (000625), создайте портфель с паритетом риска.

3.1 Обзор данных

Перед расчетом нам сначала нужно получить исторические данные о цене акций 5 акций, здесь мы используем пакет AKShare . Это бесплатный пакет интерфейса финансовых данных Python с открытым исходным кодом. Большая часть формата данных, возвращаемых AKShare, относится к типу pandas DataFrame, что очень удобно для анализа и визуализации данных с помощью pandas/NumPy/Matplotlib.

После получения исторических данных о цене акции мы вычисляем ее логарифмическую доходность и получаем ковариационную матрицу дисперсии.

import pandas as pd
import numpy as np
import akshare as ak
from scipy.optimize import minimize

# 读入5支股票 2015-01-01 到 2021-12-31 日收盘价数据,并计算对数收益率
def get_ret(code):
    data = ak.stock_zh_a_hist(symbol=code, period="daily", start_date="20150101", end_date='20211231', adjust="")
    data.index = pd.to_datetime(data['日期'],format='%Y-%m-%d') #设置日期索引
    close = data['收盘'] #日收盘价
    close.name = code
    ret = np.log(close/close.shift(1)) #日收益率
    return ret

codes=['000001','000651','300015','600519','000625']
ret = pd.DataFrame()
for code in codes:
	ret_ = get_ret(code)
	ret = pd.concat([ret,ret_],axis=1)
ret = ret.dropna()

R_cov = ret.cov() #计算协方差
cov= np.array(R_cov)

3.2 Создание портфеля с паритетом риска

def risk_budget_objective(weights,cov):
    weights = np.array(weights) #weights为一维数组
    sigma = np.sqrt(np.dot(weights, np.dot(cov, weights))) #获取组合标准差   
    #sigma = np.sqrt(weights@cov@weights)
    MRC = np.dot(cov,weights)/sigma  #MRC = cov@weights/sigma
    #MRC = np.dot(weights,cov)/sigma
    TRC = weights * MRC
    delta_TRC = [sum((i - TRC)**2) for i in TRC]
    return sum(delta_TRC)

'''
#若将权重weights转化为二维数组的形式,则编制函数如下:
def risk_budget_objective(weights,cov):
    weights = np.matrix(weights) #weights为二维数组
    sigma = np.sqrt(np.dot(weights, np.dot(cov, weights.T))[0,0]) #获取组合标准差   
    #sigma = np.sqrt((weights@[email protected])[0,0])   
    MRC = np.dot(cov,weights.T).A1/sigma
    #MRC = np.dot(weights,cov).A1/sigma
    TRC = weights.A1 * MRC
    delta_TRC = [sum((i - TRC)**2) for i in TRC]
    return sum(delta_TRC)
'''

def total_weight_constraint(x):
    return np.sum(x)-1.0
     
x0 = np.ones(cov.shape[0]) / cov.shape[0]
bnds = tuple((0,None) for x in x0)
cons = ({
    
    'type': 'eq', 'fun': total_weight_constraint})
#cons = ({'type':'eq', 'fun': lambda x: sum(x) - 1})
options={
    
    'disp':False, 'maxiter':1000, 'ftol':1e-20} 

solution = minimize(risk_budget_objective, x0,args=(cov), bounds=bnds, constraints=cons, method='SLSQP', options=options)

# 求解出权重
final_weights = solution.x #权重
for i in range(len(final_weights)):
    print(f'{
      
      final_weights[i]:.1%}投资于{
      
      R_cov.columns[i]}')

Результат решения:

24.3%投资于000001
16.7%投资于000651
16.1%投资于300015
24.8%投资于600519
18.1%投资于000625

Ссылки: https://thequantmba.wordpress.com/2016/12/14/risk-parityrisk-budgeting-portfolio-in-python/

Supongo que te gusta

Origin blog.csdn.net/mfsdmlove/article/details/126166840
Recomendado
Clasificación