1. Black-Litterman模型简介

在python实现资产配置(1)----Markowitz 投资组合模型中, 我们已经见过如何使用Markowitz求得最优资产配比. 这是一种在已知未来各资产的概率分布,然后再求解的方法.

Markowitz模型输入参数包括历史数据法和情景分析法两种方法,情景分析法的缺点是主观因素,随意性太强,因此使用历史数据法, 将资产的均值和协方差输入模型是比较常见的作法. 不过, 不足之处很明显: 未来的资产收益率分布不一定与过去相同. 此外, Markowitz 模型结果对输入参数过于敏感.

Black-Litterman模型就是基于此的改进. 其核心思想是将投资者对大类资产的观点 (主观观点) 与市场均衡收益率 (先验预期收益率)相结合,从而形成新的预期收益率(后验预期收益率). 这里的先验预期收益率的分布可以是贝叶斯推断中的先验概率密度函数的多元正态分布形式,投资者的主观观点就是贝叶斯推断中的似然函数(可以看作新的信息, 因为做出主观判断必然是从外界获取得到了这些资产的收益率变化信息), 而相应的, 后验预期收益率也可以从后验概率密度函数中得到. 具体的推导可以看我的这篇文章:从贝叶斯定理到贝叶斯推断.

BL模型的求解步骤包括下面几步:

(1) 使用历史数据估计预期收益率的协方差矩阵作为先验概率密度函数的协方差.

(2) 确定市场预期之收益率向量, 也就是先验预期收益之期望值. 作为先验概率密度函数的均值. 或者使用现有的期望值和方差来反推市场隐含的均衡收益率(Implied Equilibrium Return Vector), 不过在使用这种方法时, 需要知道无风险收益率

的大小.

(3) 融合投资人的个人观点,即根据历史数据(看法变量的方差)和个人看法(看法向量的均值)

(4) 修正后验收益.

是均衡收益率协方差的调整系数,可以根据信心水平来判断.

是历史资产收益率的协方差矩阵, P是投资者的观点矩阵,

是似然函数(即投资者观点函数)中的协方差矩阵,其值为

的对角阵,

是先验收益率的期望值.

(5) 投资组合优化: 将修正后的期望值与协方差矩阵即

重新代入Markowitz投资组合模型求解.

2. Black-litterman 模型的python实现

(1)定义求解函数,输入为投资者观点P,Q以及目前资产的市场收益率矩阵,输出为后验的市场收益率和协方差矩阵.

import numpy as np

import baostock as bs

import pandas as pd

from numpy import linalg

def blacklitterman(returns,tau,P,Q):

mu = returns.mean()

sigma = returns.cov()

pil = np.expand_dims(mu,axis = 0).T

ts = tau * sigma

ts_1 = linalg.inv(ts)

Omega = np.dot(np.dot(P,ts), P.T)* np.eye(Q.shape[0])

Omega_1 = linalg.inv(Omega)

er = np.dot(linalg.inv(ts_1 + np.dot(np.dot(P.T,Omega_1),P)),(np.dot(ts_1 ,pil)+np.dot(np.dot(P.T,Omega_1),Q)))

posterirorSigma = linalg.inv(ts_1 + np.dot(np.dot(P.T,Omega_1),P))

return [er, posterirorSigma]

(2) 实列分析

我们继续研究python实现资产配置(1)----Markowitz 投资组合模型中的五支股票: 白云机场, 福建高速, 华夏银行, 生益科技和浙能电力. 假设现在分析师的观点为:

白云机场, 华夏银行, 浙能电力, 生益科技四只股票的日均收益率均值为0.3%

白云机场和福建高速的日均收益率均值高于浙能电力0.1%

则投资者观点矩阵P为:

Q 为:

则获取后验收益率和协方差的代码为:

pick1 = np.array([1,0,1,1,1])

q1 = np.array([0.003*4])

pick2 = np.array([0.5,0.5,0,0,-1])

q2 = np.array([0.001])

P = np.array([pick1,pick2])

Q = np.array([q1,q2])

获取股票数据, 并且获得后验的均值和方差:

def get_stock_data(t1,t2,stock_name):

lg = bs.login()

print('login respond error_code:' + lg.error_code)

print('login respond error_msg:' + lg.error_msg)

#### 获取沪深A股历史K线数据 ####

# 详细指标参数,参见“历史行情指标参数”章节

rs = bs.query_history_k_data(stock_name,

"date,code,open,high,low,close,preclose,volume,amount,adjustflag,turn,tradestatus,pctChg,isST",

start_date=t1, end_date=t2,

frequency="d", adjustflag="3")

print('query_history_k_data respond error_code:' + rs.error_code)

print('query_history_k_data respond error_msg:' + rs.error_msg)

#### 打印结果集 ####

data_list = []

while (rs.error_code == '0') & rs.next():

# 获取一条记录,将记录合并在一起

data_list.append(rs.get_row_data())

result = pd.DataFrame(data_list, columns=rs.fields)

print(result)

#### 结果集输出到csv文件 ####

result.to_csv("D:\stockdata\history_A_stock_k_data.csv", index=False)

print(result)

#### 登出系统 ####

bs.logout()

result['date'] = pd.to_datetime(result['date'])

result.set_index("date", inplace=True)

return result

byjc = get_stock_data('2014-1-1','2015-1-1','sh.600004')

hxyh = get_stock_data('2014-1-1','2015-1-1','sh.600015')

zndl = get_stock_data('2014-1-1','2015-1-1','sh.600023')

fjgs = get_stock_data('2014-1-1','2015-1-1','sh.600033')

sykj = get_stock_data('2014-1-1','2015-1-1','sh.600183')

by = byjc['pctChg']

by.name = 'byjc'

by = pd.DataFrame(by,dtype=np.float)/100

hx = hxyh['pctChg']

hx.name = 'hxyh'

hx = pd.DataFrame(hx,dtype=np.float)/100

zn = zndl['pctChg']

zn.name = 'zndl'

zn = pd.DataFrame(zn,dtype=np.float)/100

fj = fjgs['pctChg']

fj.name = 'fjgs'

fj = pd.DataFrame(fj,dtype=np.float)/100

sy = sykj['pctChg']

sy.name = 'sykj'

sy = pd.DataFrame(sy,dtype=np.float)/100

sh_return = pd.concat([by,fj,hx,sy,zn],axis=1)

res = blacklitterman(sh_return,0.1,P,Q)

p_mean = pd.DataFrame(res[0],index = sh_return.columns, columns = ['posterior_mean'])

p_cov = res[1]

print(p_mean)

print(p_cov)

这时候,已经可以使用Markowitz模型进行资产的配置. 定义新的函数blminVar以求解资产配置权重. 该函数的输入变量为blacklitterman函数的输出结果, 以及投资人的目标收益率goalRet.假设目标收益率为年化70%,则goalRet = 0.7:

def blminVar(blres, goalRet):

covs = np.array(blres[1],dtype=float)

means = np.array(blres[0],dtype=float)

L1 = np.append(np.append(covs.swapaxes(0,1),[means.flatten()],axis=0),

[np.ones(len(means))],axis=0).swapaxes(0,1)

L2 = list(np.ones(len(means)))

L2.extend([0,0])

L3 = list(means)

L3.extend([0,0])

L4 = np.array([L2,L3],dtype=float)

L = np.append(L1,L4,axis=0)

results = linalg.solve(L,np.append(np.zeros(len(means)),[1,goalRet]))

return pd.DataFrame(results[:-2],columns = ['p_weight'])

blresult = blminVar(res,0.70/252)

print(blresult)

输出结果为:

0-5分别对应上面的五只股票.

参考文献

蔡立耑:量化投资——以python为工具. 电子工业出版社

华泰证券: 周期轮动下的BL资产配置策略

中信建投:基于Black-Litterman的多资产配置策略

均值方差模型python_python实现资产配置(2)--Blacklitterman 模型相关推荐

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

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

  2. 大类资产配置(一)均值方差模型MOV

    大类资产配置专题(四)均值方差模型(MVO):https://xueqiu.com/9509413026/172746747 MVO的基本思想是:假定投资者都是风险厌恶的,根据各类资产的预期收益和方差 ...

  3. 均值方差模型python_Python机器学习之“选择最优模型”

    关键问题是:假如模型效果不好,应该如何改善?答案可能有以下几种.用更复杂 / 更灵活的模型. 用更简单 / 更确定的模型. 采集更多的训练样本. 为每个样本采集更多的特征. 问题的答案往往与直觉相悖. ...

  4. 数量金融学(8):Markowitz均值-方差模型(2)

    之前写过一篇.那个时候不是很懂-- Review:数量金融学(3):Markowitz均值-方差模型 现在重新整理一下. 第一部分,生成各个资产组合的风险-收益特征. 先上效果图. 再上代码. # - ...

  5. 马科维茨均值方差模型

    马科维茨均值方差模型 马科维茨均值-方差模型为多目标优化问题,有效前沿即多目标优化问题的pareto解(风险一定,收益最大:收益一定,风险最小) 马科维茨模型以预期收益率期望度量收益,以收益率方差度量 ...

  6. 【量化笔记】Markowitz均值-方差模型

    Markowitz均值-方差模型是一种确定在N种资产上投资比例的模型 假定现在投资人初始财富W0W_0W0​,在N种资产上的投资比重分别为w1,w2,w3,...,wNw_1,w_2,w_3,..., ...

  7. 数量金融学(3):Markowitz均值-方差模型

    上个世纪50年代(1952年),Markowitz发表一篇论文,标志着证券投资组合理论的正式诞生. 简单来说,Markowitz投资组合模型是根据每种证券的预期收益率.方差及证券之间的协方差矩阵,计算 ...

  8. matlab均值方差模型,马科维茨均值方差模型的Matlab实现(10页)-原创力文档

    马科维茨均值方差模型的Matlab 实现 假设投资者可选的基金如下:股票型基金-诺安高端制造股票 (001707).混 合型基金-嘉实主题新动力混合 (070021).债券型基金-博时裕瑞纯债债券 ( ...

  9. python实现马科维茨模型的资本市场线_均值方差模型与资本市场线

    马科维茨在假设投资者以预期收益率的波动程度衡量风险且是理性的,在相同风险下追求最高收益率在相同收益率下要求最低的风险的条件下得到均值方差模型. 如图所示,阴影部分即可行集,即所有证券或组合的可选择集, ...

最新文章

  1. ANDROID 中UID与PID的作用与区别
  2. C语言 ##__VA_ARGS__ - C语言零基础入门教程
  3. 爬虫python 新闻,Python爬虫实例--爬取人民网新闻
  4. 嵌入式数据库Sqlite移植教程-转
  5. C4D四视图切换及基本操作
  6. Excel获取目标时间点/日期的方法
  7. 我的世界租赁服自定义服务器,我的世界租借服务器(我的世界技巧教程 租赁服务器玩家间传送功能)...
  8. eval在python中的作用_浅谈Python中eval的强大与危害
  9. /config.php,app/admin/config.php · 静水流深/wotuoquan - Gitee.com
  10. 基于Android的减肥塑身平台
  11. a洋发卡网sadnt模板美化
  12. 255%可用已接通电源_直流稳压电源五款电路图详解
  13. 如何蒸出白白胖胖的馒头
  14. 汽车租赁APP应用开发
  15. java 快速创建map_快速创建 Map
  16. win10打开计算机加载很慢,win10我的电脑打开慢怎么办_win10此电脑打开慢解决方法-win7之家...
  17. JDK1.8(jdk8)的下载与安装
  18. 使用HTML制作静态网站 中国传统文化 丝绸之路 (学生网页设计作业源码)
  19. 项目管理有感之需求调研
  20. 蝴蝶效应--不经意间改变人的一生

热门文章

  1. Kotlin - 改良观察者模式
  2. 让linux识别html,8 款浏览器对 HTML5 支持评测
  3. 相关性搜索(自然语言处理NLP)相关资料(待更
  4. 14、Java——迷你图书管理器(对象+数组)
  5. LCD1602液晶显示屏学习笔记
  6. 运维笔记(三)服务器介绍和XShell使用
  7. 软件绿化之实践一--绿化搜狗输入法
  8. MysqlWorkbench中无法显示表[tables could not be fetched]
  9. mysql中ndb_restore_mysql ndb集群与恢复
  10. 我用wxPython搭建GUI量化系统之wx.grid实现excel功能