
正文
关于用python求似然函数的信息
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
python实现资产配置(2)--Blacklitterman 模型
在 python实现资产配置(1)----Markowitz 投资组合模型 中, 我们已经见过如何使用Markowitz求得最优资产配比. 这是一种在已知未来各资产的概率分布,然后再求解的方法.
Markowitz模型输入参数包括历史数据法和情景分析法两种方法,情景分析法的缺点是主观因素,随意性太强,因此使用历史数据法, 将资产的均值和协方差输入模型是比较常见的作法. 不过, 不足之处很明显: 未来的资产收益率分布不一定与过去相同. 此外, Markowitz 模型结果对输入参数过于敏感.
Black-Litterman模型就是基于此的改进. 其核心思想是将投资者对大类资产的观点 (主观观点) 与市场均衡收益率 (先验预期收益率)相结合,从而形成新的预期收益率(后验预期收益率). 这里的先验预期收益率的分布可以是贝叶斯推断中的先验概率密度函数的多元正态分布形式,投资者的主观观点就是贝叶斯推断中的似然函数(可以看作新的信息, 因为做出主观判断必然是从外界获取得到了这些资产的收益率变化信息), 而相应的, 后验预期收益率也可以从后验概率密度函数中得到. 具体的推导可以看我的这篇文章: 从贝叶斯定理到贝叶斯推断 .
BL模型的求解步骤包括下面几步:
(1) 使用历史数据估计预期收益率的协方差矩阵作为先验概率密度函数的协方差.
(2) 确定市场预期之收益率向量, 也就是先验预期收益之期望值. 作为先验概率密度函数的均值. 或者使用现有的期望值和方差来反推市场隐含的均衡收益率(Implied Equilibrium Return Vector), 不过在使用这种方法时, 需要知道无风险收益率 的大小.
(3) 融合投资人的个人观点,即根据历史数据(看法变量的方差)和个人看法(看法向量的均值)
(4) 修正后验收益.
是均衡收益率协方差的调整系数,可以根据信心水平来判断. 是历史资产收益率的协方差矩阵, P是投资者的观点矩阵, 是似然函数(即投资者观点函数)中的协方差矩阵,其值为 的对角阵, 是先验收益率的期望值.
(5) 投资组合优化: 将修正后的期望值与协方差矩阵即 重新代入Markowitz投资组合模型求解.
(1)定义求解函数,输入为投资者观点P,Q以及目前资产的市场收益率矩阵,输出为后验的市场收益率和协方差矩阵.
(2) 实列分析
我们继续研究 python实现资产配置(1)----Markowitz 投资组合模型 中的五支股票: 白云机场, 福建高速, 华夏银行, 生益科技和浙能电力. 假设现在分析师的观点为:
获取股票数据, 并且获得后验的均值和方差:
这时候,已经可以使用Markowitz模型进行资产的配置. 定义新的函数blminVar以求解资产配置权重. 该函数的输入变量为blacklitterman函数的输出结果, 以及投资人的目标收益率goalRet.假设目标收益率为年化70%,则goalRet = 0.7:
输出结果为:
0-5分别对应上面的五只股票.
相关问答
Q1: 怎么看python中逻辑回归输出的解释
以下为python代码,由于训练数据比较少,这边使用了批处理梯度下降法,没有使用增量梯度下降法。
##author:lijiayan##data:2016/10/27
##name:logReg.pyfrom numpy import *import matplotlib.pyplot as pltdef loadData(filename):
data = loadtxt(filename)
m,n = data.shape print 'the number of examples:',m print 'the number of features:',n-1 x = data[:,0:n-1]
y = data[:,n-1:n] return x,y#the sigmoid functiondef sigmoid(z): return 1.0 / (1 + exp(-z))#the cost functiondef costfunction(y,h):
y = array(y)
h = array(h)
J = sum(y*log(h))+sum((1-y)*log(1-h)) return J# the batch gradient descent algrithmdef gradescent(x,y):
m,n = shape(x) #m: number of training example; n: number of features x = c_[ones(m),x] #add x0 x = mat(x) # to matrix y = mat(y)
a = 0.0000025 # learning rate maxcycle = 4000 theta = zeros((n+1,1)) #initial theta J = [] for i in range(maxcycle):
h = sigmoid(x*theta)
theta = theta + a * (x.T)*(y-h)
cost = costfunction(y,h)
J.append(cost)
plt.plot(J)
plt.show() return theta,cost#the stochastic gradient descent (m should be large,if you want the result is good)def stocGraddescent(x,y):
m,n = shape(x) #m: number of training example; n: number of features x = c_[ones(m),x] #add x0 x = mat(x) # to matrix y = mat(y)
a = 0.01 # learning rate theta = ones((n+1,1)) #initial theta J = [] for i in range(m):
h = sigmoid(x[i]*theta)
theta = theta + a * x[i].transpose()*(y[i]-h)
cost = costfunction(y,h)
J.append(cost)
plt.plot(J)
plt.show() return theta,cost#plot the decision boundarydef plotbestfit(x,y,theta):
plt.plot(x[:,0:1][where(y==1)],x[:,1:2][where(y==1)],'ro')
plt.plot(x[:,0:1][where(y!=1)],x[:,1:2][where(y!=1)],'bx')
x1= arange(-4,4,0.1)
x2 =(-float(theta[0])-float(theta[1])*x1) /float(theta[2])
plt.plot(x1,x2)
plt.xlabel('x1')
plt.ylabel(('x2'))
plt.show()def classifyVector(inX,theta):
prob = sigmoid((inX*theta).sum(1)) return where(prob = 0.5, 1, 0)def accuracy(x, y, theta):
m = shape(y)[0]
x = c_[ones(m),x]
y_p = classifyVector(x,theta)
accuracy = sum(y_p==y)/float(m) return accuracy
调用上面代码:
from logReg import *
x,y = loadData("horseColicTraining.txt")
theta,cost = gradescent(x,y)print 'J:',cost
ac_train = accuracy(x, y, theta)print 'accuracy of the training examples:', ac_train
x_test,y_test = loadData('horseColicTest.txt')
ac_test = accuracy(x_test, y_test, theta)print 'accuracy of the test examples:', ac_test
学习速率=0.0000025,迭代次数=4000时的结果:
似然函数走势(J = sum(y*log(h))+sum((1-y)*log(1-h))),似然函数是求最大值,一般是要稳定了才算最好。
下图为计算结果,可以看到训练集的准确率为73%,测试集的准确率为78%。
这个时候,我去看了一下数据集,发现没个特征的数量级不一致,于是我想到要进行归一化处理:
归一化处理句修改列loadData(filename)函数:
def loadData(filename):
data = loadtxt(filename)
m,n = data.shape print 'the number of examples:',m print 'the number of features:',n-1 x = data[:,0:n-1]
max = x.max(0)
min = x.min(0)
x = (x - min)/((max-min)*1.0) #scaling y = data[:,n-1:n] return x,y
在没有归一化的时候,我的学习速率取了0.0000025(加大就会震荡,因为有些特征的值很大,学习速率取的稍大,波动就很大),由于学习速率小,迭代了4000次也没有完全稳定。现在当把特征归一化后(所有特征的值都在0~1之间),这样学习速率可以加大,迭代次数就可以大大减少,以下是学习速率=0.005,迭代次数=500的结果:
此时的训练集的准确率为72%,测试集的准确率为73%
从上面这个例子,我们可以看到对特征进行归一化操作的重要性。
Q2: 统计学6-抽样分布
抽样分布也称统计量分布、随机变量函数分布,是指样本估计量的分布。 样本估计量是样本的一个函数,在统计学中称作统计量,因此抽样分布也是指统计量的分布 【1】。以样本平均数为例,它是总体平均数的一个估计量,如果按照相同的样本容量,相同的抽样方式,反复地抽取样本,每次可以计算一个平均数,所有可能样本的平均数所形成的分布,就是样本平均数的抽样分布。
也就是说,我们将 抽样分布 定义为 样本统计量 的分布。
有多种样本统计量:均值,方差,标准差。
如果说我们有随机变量X,和方差 σ 2 ,那么 的分布 (样本平均数的抽样分布) 方差为: σ 2 /n
我们经常使用希腊符号作为 参数 ,使用小写字母作为对应 统计量 。有时候在文学作品中,你也会看到带有 "帽子" 的希腊字母,表示这是对应 参数 的估算。
下面这个表格提供了一些最常见的参数和对应统计量:
大数法则 表示 随着样本容量增加,样本平均数越来越接近总体平均数 。
但是我们首先如何确定样本平均数可以估计总体平均数呢?我们以后如何识别参数与统计量的其他关系呢?
下面是三种最常见的估计技巧:
最大似然估计 (英语:maximum likelihood estimation,缩写为MLE),也称 极大似然估计 、 最大概似估计 ,是用来估计一个概率模型的参数的一种方法【4】。
上文已经提到,似然函数取得最大值表示相应的参数能够使得统计模型最为合理。
最大似然估计的做法是:首先选取似然函数(一般是概率密度函数)或概率质量函数),整理之后求最大值。实际应用中一般会取 似然函数的对数作为求最大值的函数 ,这样求出的最大值和直接求最大值得到的结果是相同的。 似然函数的最大值不一定唯一,也不一定存在 。与矩法估计比较,最大似然估计的精确度较高,信息损失较少,但计算量较大。
贝叶斯估计(Bayesian estimation)是利用贝叶斯定理【7】结合 新的证据 及以前的 先验概率 ,来得到 新的概率 。它提供了一种计算假设概率的方法,基于假设的先验概率、给定假设下观察到不同数据的概率以及观察到的数据本身。
贝叶斯估计将 后验概率 (考虑相关证据或数据后,某一事件的条件机率)推导为 先验概率 (考虑相关证据或数据前,某一事件不确定性的机率)及 似然函数 的共同作用结果。贝叶斯推断根据贝叶斯定理计算后验概率:
针对不同的 H 数值,只有 P(H) 和 P(E|H) (都在分子)会影响 P(H|E) 的数值。假说的 后验概率 和其 先验概率 (固有似然率)和新产生的 似然率 (假说和新得到证据的相容性)乘积成正比。
贝叶斯估计最关键的点是可以利用贝斯定理结合新的证据及以前的先验机率,来得到新的机率(这和频率论推论相反,频率论推论只考虑证据,不考虑先验机率)。
而且贝叶斯估计可以迭代使用:在观察一些证据后得到的后设机率可以当作新的先验机率,再根据新的证据得到新的后设机率。因此贝斯定理可以应用在许多不同的证据上,不论这些证据是一起出现或是不同时出现都可以,这个程序称为 贝叶斯更新 (Bayesian updating)。
中心极限定理表示样本容量足够大,平均数的抽样分布越接近正态分布。
中心极限定理 实际上应用于这些常见的统计量中:
推论统计在于使用我们收集的数据( 样本 )对更大的总体数据( 总体 )得出结论。
使用推论统计要求我们对准确代表感兴趣的总体进行取样。
收集数据的常见方式是调查。然而,根据提问的问题和提问的方式,调查会带有 偏见性 。这是解决项目时你应该想到的话题。
Bootstrap方法是非常有用的一种统计学上的估计方法,是斯坦福统计系的教授Bradley Efron【9】在总结、归纳前人研究成果的基础上提出一种新的非参数统计方法。【8】
Bootstrap是可进行统计量区间估计的统计方法,也称为自助法。
我们往往无法知道总体的参数,因此我们通过抽样来试图对总体的参数进行估计。为此,一种方法是不停的对总体不停的取样,来得出样本统计量的分布。但是,这显然是不可能的。还有两种方法能派上用场:
对于#1,如果你能确定假设成立,即整体服从某一种分布,那么只要计算量在可接受的范围内,就没有问题。比方说,总体服从正态分布,那么样本来自总体,也能以正态分布进行描述,抽样分布为正态分布。然而,当总体分布未知的时候,只能以Bootstrap方法进行分析。
我们有理由采用#2,因为样本是我们仅有的也是最好的关于总体的信息,而且,大多数随机抽取的样本同总体非常的相似。【10】
Bootstrap是放回抽样。这里以一个🌰来描述其基本过程:
假设我们有两个金融资产X和Y,我们现在想要合理配置这两个资产,使得其资产组合的风险最小。也就是找到一个α,使得Var(αX + (1-α) Y)最小。这个问题几十年前马尔可维茨已经在其投资组合理论里给出了解答,最优的α表达式如下:
我们发现,通过Bootstrap方法我们竟然不仅可以估计α的值( 这点普通方法也可以很容易做到),还可以估计α的accuracy也就是其Standard Error。这可是只利用原有的样本进行一次估计所做不到的。那么Bootstrap对于分布特性的估计效果究竟如何呢?请看下图:
左边是真实的α分步,右边则是基于bootstrap方法得到的1000个α的分布,可以看到,二者是比较相近的,也就是说Bootstrap有着不错的估计效果。而且当重复次数增多,Bootstrap的估计效果会更好。
不仅是α的标准差,如果我们想要估计α的中位数、分位数等统计量,也是可以通过Boostrap方法做到的,其整个流程可以用下面一张图诠释:
本质上,Bootstrap方法,是将一次的估计过程,重复上千次上万次,从而便得到了得到上千个甚至上万个的估计值,于是利用这不止一个的估计值,我们就可以估计α均值以外的其他统计量:比如标准差、中位数等。
在 python 中使用 random.choice 实际上是自助法。无论选择多少次,我们数据集中任何数字的概率保持不变。
【1】 抽样分布
【2】 似然函数
【3】 贝叶斯法则
【4】 最大似然估计
【5】 卡尔·皮尔逊
【6】 Method of Moments
【7】 统计学5-贝叶斯法则 : 关于先验概率,后验概率,条件概率的概念及他们之间的关系,可以参考这篇文章。
【8】 Bootstrap详解 :本文的例子来自于这篇文章。
【9】 布拉德利·埃弗龙
【10】
关于用python求似然函数和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。







