python多股票投資組合
㈠ 如何用python實現Markowitz投資組合優化
多資產的組合配置進行三方面的優化。 1.找到有效前沿。在既定的收益率下使組合的方差最校 2.找到sharpe最優的組合(收益-風險均衡點) 3.找到風險最小的組合
㈡ 想利用Python給多個字詞想讓他們兩兩組合
num=int(input('請輸入10以內的數值:'))+1
foreachinrange(1,num):
each=str(each)
foreach1inrange(1,num):
each1=str(each1)
ifeach1==each:
continue
s=each+each1
print(s)
㈢ 如何用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]:
㈣ 如何用python實現Markowitz投資組合優化
m投資組合模型的一個很有力的替代是Index model,或者我們說的single factor model,因為markowitz是需要計算全部股票的協方差和方差的,如果證券的數量很多,計算量會非常大(這些在investment的參考書裡面有),我下面就把原話打給你 first,the model requires a huge number of estimates to fill the covariance matrix.second ,the model does not provide any guideline to the forecasting to the security risk premiums that are essential to construct the efficient frontier of risky assets.第一個是硬傷,單單計算NYSE的股票就要4.5百萬的估計量,而同等條件下index model才需要9002個估計量,這就是為什麼markowitz模型很多人不願意用的願意,而優點也很直接,如果你的估算值是准確的,那麼m模型的結果比其他都准確
㈤ 股票投資組合值的計算
20%*1.2+10%0.9+30%1.5+40%*2=0.24+0.09+0.5+0.8=1.63
㈥ 如何用python實現Markowitz投資組合優化
看這個文章
https://zhuanlan.hu.com/p/20604930?refer=quantstory
用python實現Markowitz投資組合優化
㈦ 股票投資組合是什麼
股票投資組合,是指投資者在進行股票投資時,根據各種股票的風險程度、獲利能力等方面的因素,按照一定的規律和原則進行股票的選擇、搭配以降低投資風險的一種方法。其理論依據就是股市內各類股票的漲跌一般不是同步的,總是有漲有跌,此起彼伏。因此,當在一種股票上的投資可能因其價格的暫時跌落而不能盈利時,還可以在另外一些有漲勢的股票上獲得一定的收益,從而可以達到迴避風險的目的。應當明確的是,這一種方法只適用於資金投入量較大的投資者。
股票投資管理是資產管理的重要組成部分之一。股票投資組合管理的目標就是實現效用最大化,即使股票投資組合的風險和收益特徵能夠給投資者帶來最大的滿足。因此,構建股票投資組合的原因有二:一是為降低證券投資風險;二是為實現證券投資收益最大化。
組合管理是一種區別於個別資產管理的投資管理理念。組合管理理論最早由馬柯威茨於1952年系統地提出,他開創了對投資進行整體管理的先河。目前,在西方國家大約有1/3的投資管理者利用數量化方法進行組合管理。構建投資組合並分析其特性是職業投資組合經理的基本活動。在構建投資組合過程中,就是要通過證券的多樣化,使由少量證券造成的不利影響最小化。
一、分散風險
股票與其他任何金融產品一樣,都是有風險的。所謂風險就是指預期投資收益的不確定性。我們常常會用籃子裝雞蛋的例子來說明分散風險的重要性。如果我們把雞蛋放在一個籃子里,萬一這個籃子不小心掉在地上,那麼所有的雞蛋都可能被摔碎;而如果我們把雞蛋分散在不同的籃子里,那麼一個籃子掉了不會影響其他籃子里的雞蛋。資產組合理論表明,證券組合的風險隨著組合所包含的證券數量的增加而降低,資產間關聯性低的多元化證券組合可以有效地降低個別風險。
我們一般用股票投資收益的方差或者股票的p值來衡量一隻股票或股票組合的風險。通常股票投資組合的方差是由組合中各股票的方差和股票之間的協方差兩部分組成,組合的期望收益率是各股票的期望收益率的加權平均。除去各股票完全正相關的情況,組合資產的標准差將小於各股票標准差的加權平均。當組合中的股票數目N增加時,單只股票的投資比例減少,方差項對組合資產風險的影響下降;當N趨向無窮大時,方差項將檔近0,組合資產的風險僅由各股票之間的協方差所決定。也就是說,通過組合投資,能夠減少直至消除各股票自身特徵所產生的風險(非系統性風險),而只承擔影響所有股票收益率的因素所產生的風險(系統性風險)。
二、實現收益最大化
股票投資組合管理的目標之一就是在投資者可接受的風險水平內,通過多樣化的股票投資使投資者獲得最大收益。從市場經驗來看,單只股票受行業政策和基本面的影響較大,相應的收益波動往往也很大。在公司業績快速增長時期可能給投資者帶來可觀的收益,但是如果因投資者未觀察到的信息而導致股票價格大幅下跌,則可能給投資者造成很大的損失。因此,在給定的風險水平下,通過多樣化的股票選擇,可以在一定程度上減輕股票價格的過度波動,從而在一個較長的時期內獲得最大收益。
㈧ 三種股票投資組合風險計算
整個投資組合的方差 =0.3*0.3*100+0.3*0.3*144+0.4*0.4*169+2*0.3*0.3*120+2*0.3*0.4*130+2*0.3*0.4*156 = 139.24
三個股票的投資組合方差=w1*w1*股票1的方差+w2*w2*股票2的方差+w3*w3*股票3的方差+ 2*w1*w2*股票1和2的協方差+2*w1*w3*股票1和3的協方差+2*w2*w3*股票2和3的協方差