1. 如何用python实现Markowitz投资组合优化
多股票策略回测时常常遇到问题。
仓位如何分配?
你以为基金经理都是一拍脑袋就等分仓位了吗?
或者玩点玄乎的斐波拉契数列?
OMG,谁说的黄金比例,让我看到你的脑袋(不削才怪)!!
其实,这个问题,好多好多年前马科维茨(Markowitz)我喜爱的小马哥就给出答案——投资组合理论。
根据这个理论,我们可以对多资产的组合配置进行三方面的优化。
1.找到有效前沿。在既定的收益率下使组合的方差最小。
2.找到sharpe最优的组合(收益-风险均衡点)
3.找到风险最小的组合
跟着我,一步两步,轻松实现。
该理论基于用均值和方差来表述组合的优劣的前提。将选取几只股票,用蒙特卡洛模拟初步探究组合的有效前沿。
通过最大Sharpe和最小方差两种优化来找到最优的资产组合配置权重参数。
最后,刻画出可能的分布,两种最优以及组合的有效前沿。
注:
文中的数据API来自量化平台聚宽,在此表示感谢。
原文见【组合管理】——投资组合理论(有效前沿)(包含正态检验部分)
0.导入需要的包
import pandas as pd
import numpy as np
import statsmodels.api as sm #统计运算
import scipy.stats as scs #科学计算
import matplotlib.pyplot as plt #绘图
1.选取几只感兴趣的股票
000413 东旭光电,000063 中兴通讯,002007 华兰生物,000001 平安银行,000002 万科A
并比较一下数据(2015-01-01至2015-12-31)
In[1]:
stock_set = ['000413.XSHE','000063.XSHE','002007.XSHE','000001.XSHE','000002.XSHE']
noa = len(stock_set)
df = get_price(stock_set, start_date = '2015-01-01', end_date ='2015-12-31', 'daily', ['close'])
data = df['close']
#规范化后时序数据
(data/data.ix[0]*100).plot(figsize = (8,5))
Out[1]:
2.计算不同证券的均值、协方差
每年252个交易日,用每日收益得到年化收益。计算投资资产的协方差是构建资产组合过程的核心部分。运用pandas内置方法生产协方差矩阵。
In [2]:
returns = np.log(data / data.shift(1))
returns.mean()*252
Out[2]:
000413.XSHE 0.184516
000063.XSHE 0.176790
002007.XSHE 0.309077
000001.XSHE -0.102059
000002.XSHE 0.547441
In [3]:
returns.cov()*252
Out[3]:
3.给不同资产随机分配初始权重
由于A股不允许建立空头头寸,所有的权重系数均在0-1之间
In [4]:
weights = np.random.random(noa)
weights /= np.sum(weights)
weights
Out[4]:
array([ 0.37505798, 0.21652754, 0.31590981, 0.06087709, 0.03162758])
4.计算预期组合年化收益、组合方差和组合标准差
In [5]:
np.sum(returns.mean()*weights)*252
Out[5]:
0.21622558669017816
In [6]:
np.dot(weights.T, np.dot(returns.cov()*252,weights))
Out[6]:
0.23595133640121463
In [7]:
np.sqrt(np.dot(weights.T, np.dot(returns.cov()* 252,weights)))
Out[7]:
0.4857482232609962
5.用蒙特卡洛模拟产生大量随机组合
进行到此,我们最想知道的是给定的一个股票池(证券组合)如何找到风险和收益平衡的位置。
下面通过一次蒙特卡洛模拟,产生大量随机的权重向量,并记录随机组合的预期收益和方差。
In [8]:
port_returns = []
port_variance = []
for p in range(4000):
weights = np.random.random(noa)
weights /=np.sum(weights)
port_returns.append(np.sum(returns.mean()*252*weights))
port_variance.append(np.sqrt(np.dot(weights.T, np.dot(returns.cov()*252, weights))))
port_returns = np.array(port_returns)
port_variance = np.array(port_variance)
#无风险利率设定为4%
risk_free = 0.04
plt.figure(figsize = (8,4))
plt.scatter(port_variance, port_returns, c=(port_returns-risk_free)/port_variance, marker = 'o')
plt.grid(True)
plt.xlabel('excepted volatility')
plt.ylabel('expected return')
plt.colorbar(label = 'Sharpe ratio')
Out[8]:
6.投资组合优化1——sharpe最大
建立statistics函数来记录重要的投资组合统计数据(收益,方差和夏普比)
通过对约束最优问题的求解,得到最优解。其中约束是权重总和为1。
In [9]:
def statistics(weights):
weights = np.array(weights)
port_returns = np.sum(returns.mean()*weights)*252
port_variance = np.sqrt(np.dot(weights.T, np.dot(returns.cov()*252,weights)))
return np.array([port_returns, port_variance, port_returns/port_variance])
#最优化投资组合的推导是一个约束最优化问题
import scipy.optimize as sco
#最小化夏普指数的负值
def min_sharpe(weights):
return -statistics(weights)[2]
#约束是所有参数(权重)的总和为1。这可以用minimize函数的约定表达如下
cons = ({'type':'eq', 'fun':lambda x: np.sum(x)-1})
#我们还将参数值(权重)限制在0和1之间。这些值以多个元组组成的一个元组形式提供给最小化函数
bnds = tuple((0,1) for x in range(noa))
#优化函数调用中忽略的唯一输入是起始参数列表(对权重的初始猜测)。我们简单的使用平均分布。
opts = sco.minimize(min_sharpe, noa*[1./noa,], method = 'SLSQP', bounds = bnds, constraints = cons)
opts
Out[9]:
status: 0
success: True
njev: 4
nfev: 28
fun: -1.1623048291871221
x: array([ -3.60840218e-16, 2.24626781e-16, 1.63619563e-01, -2.27085639e-16, 8.36380437e-01])
message: 'Optimization terminated successfully.'
jac: array([ 1.81575805e-01, 5.40387481e-01, 8.18073750e-05, 1.03137662e+00, -1.60038471e-05, 0.00000000e+00])
nit: 4
得到的最优组合权重向量为:
In [10]:
opts['x'].round(3)
Out[10]:
array([-0. , 0. , 0.164, -0. , 0.836])
sharpe最大的组合3个统计数据分别为:
In [11]:
#预期收益率、预期波动率、最优夏普指数
statistics(opts['x']).round(3)
Out[11]:
array([ 0.508, 0.437, 1.162])
7.投资组合优化2——方差最小
接下来,我们通过方差最小来选出最优投资组合。
In [12]:
#但是我们定义一个函数对 方差进行最小化
def min_variance(weights):
return statistics(weights)[1]
optv = sco.minimize(min_variance, noa*[1./noa,],method = 'SLSQP', bounds = bnds, constraints = cons)
optv
Out[12]:
status: 0
success: True
njev: 7
nfev: 50
fun: 0.38542969450547221
x: array([ 1.14787640e-01, 3.28089742e-17, 2.09584008e-01, 3.53487044e-01, 3.22141307e-01])
message: 'Optimization terminated successfully.'
jac: array([ 0.3851725 , 0.43591119, 0.3861807 , 0.3849672 , 0.38553924, 0. ])
nit: 7
方差最小的最优组合权重向量及组合的统计数据分别为:
In [13]:
optv['x'].round(3)
Out[13]:
array([ 0.115, 0. , 0.21 , 0.353, 0.322])
In [14]:
#得到的预期收益率、波动率和夏普指数
statistics(optv['x']).round(3)
Out[14]:
array([ 0.226, 0.385, 0.587])
8.组合的有效前沿
有效前沿有既定的目标收益率下方差最小的投资组合构成。
在最优化时采用两个约束,1.给定目标收益率,2.投资组合权重和为1。
In [15]:
def min_variance(weights):
return statistics(weights)[1]
#在不同目标收益率水平(target_returns)循环时,最小化的一个约束条件会变化。
target_returns = np.linspace(0.0,0.5,50)
target_variance = []
for tar in target_returns:
cons = ({'type':'eq','fun':lambda x:statistics(x)[0]-tar},{'type':'eq','fun':lambda x:np.sum(x)-1})
res = sco.minimize(min_variance, noa*[1./noa,],method = 'SLSQP', bounds = bnds, constraints = cons)
target_variance.append(res['fun'])
target_variance = np.array(target_variance)
下面是最优化结果的展示。
叉号:构成的曲线是有效前沿(目标收益率下最优的投资组合)
红星:sharpe最大的投资组合
黄星:方差最小的投资组合
In [16]:
plt.figure(figsize = (8,4))
#圆圈:蒙特卡洛随机产生的组合分布
plt.scatter(port_variance, port_returns, c = port_returns/port_variance,marker = 'o')
#叉号:有效前沿
plt.scatter(target_variance,target_returns, c = target_returns/target_variance, marker = 'x')
#红星:标记最高sharpe组合
plt.plot(statistics(opts['x'])[1], statistics(opts['x'])[0], 'r*', markersize = 15.0)
#黄星:标记最小方差组合
plt.plot(statistics(optv['x'])[1], statistics(optv['x'])[0], 'y*', markersize = 15.0)
plt.grid(True)
plt.xlabel('expected volatility')
plt.ylabel('expected return')
plt.colorbar(label = 'Sharpe ratio')
Out[16]:
2. 用Python中的蒙特卡洛模拟两支股票组成的投资组合的价格趋势分析
蒙特卡洛模拟是一种模拟把真实系统中的概率过程用计算机程序来模拟的方法。对于投资组合的价格趋势分析,可以使用Python中的蒙特卡洛模拟。首先,回顾投资组合的价格趋势。投资组合中的股票价格的趋势是受多种因素影响的,可分为经济、政治和技术因素,其中经济因素最重要。因此,蒙特卡洛模拟可以模拟这些因素对投资组合价格趋势的影响,并通过计算机绘制投资组合价格趋势的曲线。
Python中的蒙特卡洛模拟首先需要计算投资组合中各股票价格的每一期的收益率,其次,计算出投资组合的收益率;随后,计算预测投资组合的期权价格,并将所有的期权价格叠加起来,从而绘制投资组合的价格曲线。最后,在投资组合的价格曲线的基础上,可以分析投资组合在不同时期的价格走势,并进行投资组合结构的调整,从而获得最优投资组合。
3. 在股票模拟交易中采取了哪些投资组合和交易
理性的交易策略应该包括以下几种基本类型:(一)价值型策略:即着眼于股票的内在价值。
最典型的一个是巴菲特,完全从公司基本面上寻找投资机会。
(二)趋势型策略:通俗说,就是追涨杀跌。
从众心理是趋势的主要基础。
趋势也是股市运行的最明显特征。
(三)能量型策略:前面的趋势型主要关注价格,而能量型主要关注的是成交量。
(四)周期型策略:螺旋式上升是世界最常见的发展方式,股市也不例外。
一个螺旋就是一个周期。
我们常说的波段,它的学名应该也叫周期。
(五)突变型策略:突变就是价格发生突然变化的意思。
突变往往是容易把握的好机会。
(六)跟庄型策略:分析庄家坐庄思路与操作,采取相应行动。
炒股的方法很多,最重要的是找到自己的盈利方式,新手前期不防先用个模拟盘去练习一段时日,从模拟中找出一套自己盈利的方式,目前的牛股宝模拟炒股还不错,功能全面,行情跟实盘同步,使用起来有一定的帮助。
股票投资策略主要有哪几种
股票交易系统是自己选股、买卖、持仓的行为指南。
是否有一套适合自己、适应市场的交易系统,是能否持续稳定盈利的关键。
1、自选股应该建立自己的自选股股票池,动态管理、持续跟踪自选股,时机到来时可买入。
自选股票的选股逻辑: 热点题材股、成长股、困境逆转股、低估股、资产突变重组股、套利股等。
2、组合原则:适当分散当出现买点时,应利用组合的方式进行买入,注意适当分散投资。
可以避免满仓或者重仓单一股票的黑天鹅事件和长时间不涨或者被套的心态急躁问题。
股票组合应该是不同行业、不同题材的股票。
3、顺势而为顺势加仓持仓、逆势减仓或空仓,绝对不用逆势而为。
严格遵守生命线操作纪律,当大盘和个股的价格运行在生命线上时做多,反之看空。
生命线主要指均线,一般短线操作是10日均线、中长线操作20日或者30日均线。
4、仓位管理分批买入和卖出,当出现入场时机时,应分批买入多只股票,同理当卖出时机出现时,也应该分批卖出,注意自己的仓位控制。
当大盘强势放量上涨,个股普涨时,应重仓操作;
反之则需要减仓或者空仓。
5、持续完善操作系统依据上面的几点,即可建立自己的操作系统。
平时操作时,需严格按操作系统进行操作。
操作系统建立后不是一成不变的,应该结合自己的实际操作,不断改进完善自己的操作系统,确保自己持续稳定的盈利。
回答于 1 小时前
抢首赞
尼N K相机D850—北京国贸旗舰店折扣活动中
值得一看的尼康相机相关信息推荐
尼K相机北京朝阳旗舰店,位于朝阳区东大桥8号【国贸CBD商区世贸天街】北150米.SOHO尚都北塔B座4层2425.
北京朝尚佳徕科技有..广告
尼康相机d850-京东数码,爆款限量抢购!
尼康(Nikon) D810 进阶版 全画幅数码 单反相机 D850 套机 d850 70-200mm f/2.8E VR
¥34999 元
尼康(Nikon) D810 进阶版 全画幅数码 单反相机 D850 套机 d850 24-70mmf/2.8E VR
¥34999 元
尼康(Nikon) D810 进阶版 全画幅数码 单反相机 D850 套机 d850 24-70mm f/2.8G
¥31000 元
京东广告
住人集装箱多少钱一个-量身定制_认准法利莱_【可租可售】
住人集装箱多少钱一个,“法利莱”22年集装箱房集生产,设计,安装,售后一体,无需改水电,拎包入住!住人集装箱多少钱一个,造型美观,规格齐全,工地现场考察设计,20年施工经验,放心之选!
4. 投资组合理论的内容
该理论包含两个重要内容:均值-方差分析方法和投资组合有效边界模型。
在发达的证券市场中,马科维茨投资组合理论早已在实践中被证明是行之有效的,并且被广泛应用于组合选择和资产配置。但是,我国的证券理论界和实务界对于该理论是否适合于我国股票市场一直存有较大争议。
从狭义的角度来说,投资组合是规定了投资比例的一揽子有价证券,当然,单只证券也可以当作特殊的投资组合。本文讨论的投资组合限于由股票和无风险资产构成的投资组合。
人们进行投资,本质上是在不确定性的收益和风险中进行选择。投资组合理论用均值—方差来刻画这两个关键因素。所谓均值,是指投资组合的期望收益率,它是单只证券的期望收益率的加权平均,权重为相应的投资比例。当然,股票的收益包括分红派息和资本增值两部分。所谓方差,是指投资组合的收益率的方差。我们把收益率的标准差称为波动率,它刻画了投资组合的风险。
人们在证券投资决策中应该怎样选择收益和风险的组合呢?这正是投资组合理论研究的中心问题。投资组合理论研究“理性投资者”如何选择优化投资组合。所谓理性投资者,是指这样的投资者:他们在给定期望风险水平下对期望收益进行最大化,或者在给定期望收益水平下对期望风险进行最小化。
因此把上述优化投资组合在以波动率为横坐标,收益率为纵坐标的二维平面中描绘出来,形成一条曲线。这条曲线上有一个点,其波动率最低,称之为最小方差点(英文缩写是MVP)。这条曲线在最小方差点以上的部分就是着名的(马考维茨)投资组合有效边界,对应的投资组合称为有效投资组合。投资组合有效边界一条单调递增的凹曲线。
如果投资范围中不包含无风险资产(无风险资产的波动率为零),曲线AMB是一条典型的有效边界。A点对应于投资范围中收益率最高的证券。
如果在投资范围中加入无风险资产,那么投资组合有效边界是曲线AMC。C点表示无风险资产,线段CM是曲线AMB的切线,M是切点。M点对应的投资组合被称为“市场组合”。
如果市场允许卖空,那么AMB是二次曲线;如果限制卖空,那么AMB是分段二次曲线。在实际应用中,限制卖空的投资组合有效边界要比允许卖空的情形复杂得多,计算量也要大得多。
在波动率-收益率二维平面上,任意一个投资组合要么落在有效边界上,要么处于有效边界之下。因此,有效边界包含了全部(帕雷托)最优投资组合,理性投资者只需在有效边界上选择投资组合。