200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 量化金融——各种投资组合理论的python实现

量化金融——各种投资组合理论的python实现

时间:2018-12-03 14:55:51

相关推荐

量化金融——各种投资组合理论的python实现

投资组合理论

Markowitz模型

import numpy as npimport matplotlib.pyplot as pltimport scipy.linalg as linalgimport ffnclass MeanVariance:def __init__(self,returns):'''输入收益率'''self.returns=returnsdef min_var(self,goalRet):'''最小化方差函数'''covs=np.array(self.returns.cov())means=np.array(self.returns.mean())L1=np.append(np.append(covs.swapaxes(0,1),[means],0),[np.ones(len(means))],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])L=np.append(L1,L4,0)results=linalg.solve(L,np.append(np.zeros(len(means)),[1,goalRet],0))return (np.array([list(self.returns.columns),results[:-2]]))def cal_var(self,fracs):'''给定个资产比例,计算方差'''return (np.dot(np.dot(fracs,self.returns.cov()),fracs))def cal_mean(self,fracs):mean_risky=ffn.to_returns(self.returns).mean()assert len(fracs)==len(mean_risky)return (np.sum(np.multiply(mean_risky,np.array(fracs))))def frontier_curve(self):'''最小方差前沿线绘制'''goals=[x/500000 for x in range(-100,4000)]variances=list(map(lambda x: self.cal_var(self.min_var(x)[1,:].astype(np.float)),goals))plt.plot(variances,goals)

Black-Litterman模型

主要参数:

P、Q:投资人经验判断

e.g. A的收益率为15%;B比D收益率高5%;B和C比A收益率低6%

P = [ 1 0 0 0 0 0 1 0 − 1 0 − 1 1 2 1 2 0 0 ] P=\begin{bmatrix} 1 & 0 & 0 & 0 & 0 \\ 0 & 1 & 0 & -1 & 0 \\ -1 & \frac12 & \frac12 & 0 & 0 \\ \end{bmatrix}\\ P=⎣⎡​10−1​0121​​0021​​0−10​000​⎦⎤​

q = [ 15 % , 5 % , 6 % ] T q=[15\%,5\%,6\%]^T q=[15%,5%,6%]T

主观判断相对于先验信息所占比重 τ \tau τ

import numpy as npimport pandas as pdfrom numpy import linalgclass BlackLitterman:def __init__(self,returns,tau,P,Q):mu = returns.mean()sigma = returns.cov()pi1 = muts = tau * sigmaOmega = np.dot(np.dot(P,ts), P.T)* np.eye(Q.shape[0])middle = linalg.inv(np.dot(np.dot(P,ts),P.T)+Omega)er=np.expand_dims(pi1,axis=0).T + np.dot(np.dot(np.dot(ts, P.T), middle),(Q-np.expand_dims(np.dot(P,pi1.T),axis=1)))posterirorSigma = sigma+ts-np.dot(ts.dot(P.T).dot(middle).dot(P),ts)self.er=erself.posterirorSigma=posterirorSigmadef blmin_var(self,goalRet):means=np.array(self.er)covs=np.array(self.posterirorSigma)L1=np.append(np.append((covs.swapaxes(0,1)),[means.flatten()],0),[np.ones(len(means))],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])L=np.append(L1,L4,0)results=linalg.solve(L,np.append(np.zeros(len(means)),[1,goalRet],0))return pd.DataFrame(results[:-2],index=self.posterirorSigma.columns,columns=['p_weight'])

资本资产定价模型(CAPM)

R i t − R f t = α i + β i ( R m t − R f t ) + ϵ i t R_{it}-R_{ft}=\alpha_i+\beta_i(R_{mt}-R_{ft})+\epsilon_{it} Rit​−Rft​=αi​+βi​(Rmt​−Rft​)+ϵit​

根据数据用statsmodel.api.OLS拟合即可

Fama-French三因子模型

市场风险溢酬因子,市值因子,账面市值比因子。

理论模型:

E ( R i t ) − R f t = α i + b i ( E ( R m t ) − R f t ) + s i E ( S M B t ) + h i E ( H M L t ) \mathbb{E}(R_{it})-R_{ft}=\alpha_i+b_i(\mathbb{E}(R_{mt})-R_{ft})+s_i\mathbb{E}(SMB_t)+h_i\mathbb{E}(HML_t) E(Rit​)−Rft​=αi​+bi​(E(Rmt​)−Rft​)+si​E(SMBt​)+hi​E(HMLt​)

实证检验:

R i t − R f t = α i + b i ( R m t − R f t ) + s i S M B t + h i H M L t + ϵ i R_{it}-R_{ft}=\alpha_i+b_i(R_{mt}-R_{ft})+s_iSMB_t+h_iHML_t+\epsilon_i Rit​−Rft​=αi​+bi​(Rmt​−Rft​)+si​SMBt​+hi​HMLt​+ϵi​

S M B t : SMB_t: SMBt​: 做空市值小的公司,做多市值大的公司的投资组合的收益率。

市 值 ( M E k t ) = 股 票 价 格 ( P k t ) ∗ 在 外 流 通 股 数 ( Q k t ) 市值(ME_{kt})=股票价格(P_{kt}) * 在外流通股数(Q_{kt}) 市值(MEkt​)=股票价格(Pkt​)∗在外流通股数(Qkt​)取中位数定义高低市值公司。

H M L t : HML_t: HMLt​: 做多高B/M的公司,做空低B/M的公司的投资组合的收益率。

B / M r a t i o k t = 账 面 价 值 B E k t 市 值 M E k t B/M \ ratio_{kt}=\frac{账面价值BE_{kt}}{市值ME_{kt}} B/Mratiokt​=市值MEkt​账面价值BEkt​​

账面价值可从财务报表数据库获取用

** 最后根据数据用statsmodel.api.OLS拟合即可 **

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。