多股票投資組合+馬科維茨計算組合

import matplotlib.pyplot as plt
from pandas import read_excel
import numpy as np
import tushare as ts
import pandas as pd
import datetime
token=''
pro=ts.pro_api(token)

獲取財務數據

#獲取財務數據
ticker_list = ['601318.SH','601336.SH','601398.SH','601888.SH','603993.SH']
for ticker in ticker_list:df = pro.daily_basic(ts_code = ticker,fields = 'ts_code,trade_date,total_mv,circ_mv,pe,pb')df1 = pro.daily(ts_code = ticker)df1.to_excel('stock_data/'+ticker + '.xlsx')df.to_excel('stock_data/'+ticker + '_basic.xlsx')

獲取股票價格數據

#獲取股票價格數據
ticker_list = ['601318.SH','601336.SH','601398.SH','601888.SH','603993.SH']
for ticker in ticker_list:df = pro.daily(ts_code = ticker)df.to_excel('stock_data/'+ticker + '.xlsx')

?設定股票池

#設定股票池
ticker_list = ['601318.SH','601336.SH','601398.SH','601888.SH','603993.SH']
#循環獲取股票價格和財務數據
for ticker in ticker_list:df1 = pd.read_excel('stock_data/'+ticker + '.xlsx',engine='openpyxl')df2 = pd.read_excel('stock_data/'+ticker + '_basic.xlsx',engine='openpyxl')df2 = df2[['trade_date','pe','pb','total_mv','circ_mv']]df3 = pd.merge(df1,df2,on='trade_date')df3.to_excel('stock_data/'+ticker + '.xlsx')
#設定空的DataFrame變量,存儲數據
StockPrices = pd.DataFrame()
#存儲每只股票的平均市值
market_value_list = []
ticker_list = ['601318.SH','601336.SH','601398.SH','601888.SH','603993.SH']
for ticker in ticker_list:df = read_excel('stock_data/'+ticker+'.xlsx',engine='openpyxl')#更改日期格式df['trade_date'] = df.trade_date.apply(lambda x:datetime.datetime.strptime(str(x),"%Y%m%d").strftime("%Y-%m-%d"))#按照日期升序排列。上小下大df =df.sort_values('trade_date',ascending=True)stock_data = df.set_index('trade_date')#print(stock_data.head())
#     stock_data = stock_data.loc['2016-03-01':'2017-12-29']#print(stock_data.head())#獲取股票收盤價StockPrices[ticker] = stock_data['close']#print(StockPrices.head())#將市值存入列表market_value_list.append(stock_data['total_mv'].mean())#print(market_value_list[:5])
StockPrices.index.name= 'trade_date'
print(StockPrices.head())#計算每日收益率,并丟棄缺失值
StockReturns = StockPrices.pct_change().dropna()
#打印前5行數據
print(StockReturns.head())

計算加權收益

#將收益率數據拷貝到新的變量stock_return,這是為了后續調用的方便
stock_return = StockReturns.copy()
#print(stock_return.head())
#設置組合權重,存儲為numpy數據類型
portfolio_weights = np.array([0.32,0.15,0.10,0.18,0.25])
#計算加權的股票收益
WeightedReturns = stock_return.mul(portfolio_weights,axis=1)
#計算投資組合的收益
StockReturns['Portfolio'] = WeightedReturns.sum(axis=1)#print(StockReturns.head())
#繪制組合收益隨時間變化的圖
StockReturns.Portfolio.plot()
plt.show()

組合收益累計曲線

#定義累積收益曲線繪制函數
def cumulative_returns_plot(name_list):for name in name_list:CumlativeReturns = ((1+StockReturns[name]).cumprod()-1)CumlativeReturns.plot(label=name)plt.legend()plt.show()
#計算累積的組合收益,并繪圖
cumulative_returns_plot(['Portfolio'])

等權重收益曲線

#等權重的投資組合
#設置投資組合中的股票的數據
numstocks = 5
#平均分配每一項的權重
portfolio_weights_ew = np.repeat(1/numstocks,numstocks)
#計算等權重組合的收益
StockReturns['Portfolio_EW'] = stock_return.mul(portfolio_weights_ew,axis=1).sum(axis=1)
#打印前5行數據
print(StockReturns.head())
#繪制累計收益曲線
cumulative_returns_plot(['Portfolio','Portfolio_EW'])

市值加權

#市值加權的投資組合
#將上述獲得的每支股票的平均是指轉換為數組
market_values = np.array(market_value_list)
#計算市值權重
market_weights = market_values / np.sum(market_values)
#計算市值加權的組合收益
StockReturns['Portfolio_MVal'] = stock_return.mul(market_weights,axis=1).sum(axis=1)
#打印前5行數據
print(StockReturns.head())
#繪制累積收益曲線
cumulative_returns_plot(['Portfolio','Portfolio_EW','Portfolio_MVal'])
投資組合的相關性分析
#投資組合的相關矩陣
#相關矩陣用于估算多支股票收益之間的線性關系
#計算相關矩陣
correlation_matrix = stock_return.corr()
#輸出相關矩陣
print(correlation_matrix)
import seaborn as sns
#創建熱力圖
sns.heatmap(correlation_matrix,annot=True,cmap='rainbow',linewidths=1.0,annot_kws={'size':8})
plt.xticks(rotation=0)
plt.yticks(rotation=75)
plt.show()
#投資組合的協方差矩陣
#相關系數只反應了股票之間的線性關系,但并不能告訴我們股票的波動情況,而協方差矩陣則包含這一信息
#計算協方差矩陣
cov_mat = stock_return.cov()
#年化協方差矩陣
cov_mat_annual = cov_mat * 252
#輸出協方差矩陣
print(cov_mat_annual)
sns.heatmap(cov_mat_annual,annot=True,cmap='rainbow',linewidths=1.0,annot_kws={'size':8})
#投資組合的標準差
#計算投資組合的標準差
portfolio_volatility = np.sqrt(np.dot(portfolio_weights.T,np.dot(cov_mat_annual,portfolio_weights)))
print(portfolio_volatility)
#計算股票的最優投資組合
#使用蒙特卡洛模擬Markowitz模型
#設置模擬的次數
number  = 10000
#設置空的numpy數組,用于存儲每次模擬得到的權重,收益率和標準差
random_p = np.empty((number,7))
#設置隨機數種子,這里是為了結果可重復
np.random.seed(7)#循環模擬10000次隨機的投資組合
for i in range(number):#生成5個隨機數,并歸一化,得到一組隨機的權重數據random5 = np.random.random(5)random_weight =  random5/np.sum(random5)#計算年平均收益率mean_return = stock_return.mul(random_weight,axis=1).sum(axis=1).mean()annual_return = (1+mean_return)**252 -1#計算年化標準差,也成為波動率random_volatility = np.sqrt(np.dot(random_weight.T,np.dot(cov_mat_annual,random_weight)))#將上面生成的權重,和計算得到的收益率、標準差存入數據random_p中random_p[i][:5] =random_weightrandom_p[i][:5] = annual_returnrandom_p[i][6] = random_volatility#將Numpy數組轉化為DataF數據框
RandomPortfolios = pd.DataFrame(random_p)
#設置數據框RandomPortfolios每一列的名稱
RandomPortfolios.columns=[ticker + '_weight' for ticker in ticker_list]+['Returns','Volatility']#繪制散點圖
RandomPortfolios.plot('Volatility','Returns',kind='scatter',alpha=0.3)
plt.show()
#投資風險最小組合
#找到標準差最小數據的索引列
min_index = RandomPortfolios.Volatility.idxmin()#在收益-風險散點圖中突出風險最小的點
RandomPortfolios.plot('Volatility','Returns',kind= 'scatter',alpha = 0.3)
x = RandomPortfolios.loc[min_index,'Volatility']
y = RandomPortfolios.loc[min_index,'Returns']
plt.scatter(x,y,color='red')
#將該點坐標顯示在途中并保留四位小數
plt.text(np.round(x,4),np.round(y,4),(np.round(x,4),np.round(y,4)),ha= 'left',va='bottom',fontsize=10)
plt.show()
#提取足校波動組合對應的權重,并轉換成numpy數組
GMV_weights = np.array(RandomPortfolios.iloc[min_index,0:numstocks])
#計算GMV投資組合收益
StockReturns['Portfolio_GMV'] = stock_return.mul(GMV_weights,axis=1).sum(axis=1)
#輸出風險最小投資組合的權重
print(GMV_weights)
#投資風險最大組合
#找到標準差最大數據的索引列
max_index = RandomPortfolios.Volatility.idxmax()#在收益-風險散點圖中突出風險最小的點
RandomPortfolios.plot('Volatility','Returns',kind= 'scatter',alpha = 0.3)
x = RandomPortfolios.loc[max_index,'Volatility']
y = RandomPortfolios.loc[max_index,'Returns']
plt.scatter(x,y,color='red')
#將該點坐標顯示在途中并保留四位小數
plt.text(np.round(x,4),np.round(y,4),(np.round(x,4),np.round(y,4)),ha= 'left',va='bottom',fontsize=10)
plt.show()
#提取足校波動組合對應的權重,并轉換成numpy數組
GMV_weights = np.array(RandomPortfolios.iloc[max_index,0:numstocks])
#計算GMV投資組合收益
StockReturns['Portfolio_GMV'] = stock_return.mul(GMV_weights,axis=1).sum(axis=1)
#輸出風險最小投資組合的權重
print(GMV_weights)
#投資收益最小組合
#找到收益最小數據的索引列
min_index = RandomPortfolios.Returns.idxmin()#在收益-風險散點圖中突出風險最小的點
RandomPortfolios.plot('Volatility','Returns',kind= 'scatter',alpha = 0.3)
x = RandomPortfolios.loc[min_index,'Volatility']
y = RandomPortfolios.loc[min_index,'Returns']
plt.scatter(x,y,color='red')
#將該點坐標顯示在途中并保留四位小數
plt.text(np.round(x,4),np.round(y,4),(np.round(x,4),np.round(y,4)),ha= 'left',va='bottom',fontsize=10)
plt.show()
#提取足校波動組合對應的權重,并轉換成numpy數組
GMV_weights = np.array(RandomPortfolios.iloc[min_index,0:numstocks])
#計算GMV投資組合收益
StockReturns['Portfolio_GMV'] = stock_return.mul(GMV_weights,axis=1).sum(axis=1)
#輸出風險最小投資組合的權重
print(GMV_weights)
#投資收益最大組合
#找到收益最大數據的索引列
max_index = RandomPortfolios.Returns.idxmax()#在收益-風險散點圖中突出風險最小的點
RandomPortfolios.plot('Volatility','Returns',kind= 'scatter',alpha = 0.3)
x = RandomPortfolios.loc[max_index,'Volatility']
y = RandomPortfolios.loc[max_index,'Returns']
plt.scatter(x,y,color='red')
#將該點坐標顯示在途中并保留四位小數
plt.text(np.round(x,4),np.round(y,4),(np.round(x,4),np.round(y,4)),ha= 'left',va='bottom',fontsize=10)
plt.show()
#提取足校波動組合對應的權重,并轉換成numpy數組
GMV_weights = np.array(RandomPortfolios.iloc[max_index,0:numstocks])
#計算GMV投資組合收益
StockReturns['Portfolio_GMV'] = stock_return.mul(GMV_weights,axis=1).sum(axis=1)
#輸出風險最小投資組合的權重
print(GMV_weights)
#投資最優組合
#夏普最優組合的選擇
#設置無風險回報率為0.03
risk_free = 0.03
#計算每項資產的夏普比率
RandomPortfolios['Sharpe'] = (RandomPortfolios.Returns - risk_free) / RandomPortfolios.Volatility
#繪制收益-標準差的散點圖,并用顏色描繪夏普比率
plt.scatter(RandomPortfolios.Volatility,RandomPortfolios.Returns,c=RandomPortfolios.Sharpe)
plt.colorbar(label='Sharpe Ratio')
plt.show()
# 找到夏普比率最大數據對應的索引值
max_index = RandomPortfolios.Sharpe.idxmax()
# 在收益-風險散點圖中突出夏普比率最大的點
RandomPortfolios.plot('Volatility', 'Returns', kind='scatter', alpha=0.3)
x = RandomPortfolios.loc[max_index,'Volatility']
y = RandomPortfolios.loc[max_index,'Returns']
plt.scatter(x, y, color='red')
#將該點坐標顯示在圖中并保留四位小數
plt.text(np.round(x,4),np.round(y,4),(np.round(x,4),np.round(y,4)),ha='left',va='bottom',fontsize=10)
plt.show()# 提取最大夏普比率組合對應的權重,并轉化為numpy數組
MSR_weights = np.array(RandomPortfolios.iloc[max_index, 0:numstocks])
# 計算MSR組合的收益
StockReturns['Portfolio_MSR'] = stock_return.mul(MSR_weights, axis=1).sum(axis=1)
#輸出夏普比率最大的投資組合的權重
print(MSR_weights)
# 找到夏普比率最大數據對應的索引值
max_index = RandomPortfolios.Sharpe.idxmax()
# 在收益-夏普散點圖中突出夏普比率最大的點
RandomPortfolios.plot('Sharpe', 'Returns', kind='scatter', alpha=0.3)
x = RandomPortfolios.loc[max_index,'Sharpe']
y = RandomPortfolios.loc[max_index,'Returns']
plt.scatter(x, y, color='red')
#將該點坐標顯示在圖中并保留四位小數
plt.text(np.round(x,4),np.round(y,4),(np.round(x,4),np.round(y,4)),ha='left',va='bottom',fontsize=10)
plt.show()# 提取最大夏普比率組合對應的權重,并轉化為numpy數組
MSR_weights = np.array(RandomPortfolios.iloc[max_index, 0:numstocks])
# 計算MSR組合的收益
StockReturns['Portfolio_MSR'] = stock_return.mul(MSR_weights, axis=1).sum(axis=1)
#輸出夏普比率最大的投資組合的權重
print(MSR_weights)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/449558.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449558.shtml
英文地址,請注明出處:http://en.pswp.cn/news/449558.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

并發編程(十六)——java7 深入并發包 ConcurrentHashMap 源碼解析

以前寫過介紹HashMap的文章,文中提到過HashMap在put的時候,插入的元素超過了容量(由負載因子決定)的范圍就會觸發擴容操作,就是rehash,這個會重新將原數組的內容重新hash到新的擴容數組中,在多線…

[邊分治+線段樹合并]「CTSC2018」暴力寫掛

題目梗概 給出兩棵1為根的樹,求\(d[x]d[y]-d[lca(x,y)]-d[lca(x,y)]\)的最大值 解題思路 套路化簡之后\((d[x]d[y]dis(x,y)-2*d[lca(x,y)])/2\) 第二棵樹上的lca化不掉,所以考慮在第二棵上枚舉lca 先說說這題的解法,邊分樹的合并. 邊分和點分有什么區別,邊分在合并類似\(d[x]d[…

HEVC/H265 文檔獲得

HEVC/H265文檔是很重要的標準,因為代碼有時由于效率問題而修改,這是最重要的參考: HEVC approved by ITU-T and ISO/IEC "Geneva, 25 January 2013 – A new video coding standard building on the PrimeTime Emmy award winning IT…

期權計算隱含波動率

牛頓迭代法 from scipy.stats import norm import numpy as np def bscall(S,K,r,sigma,t):d1(np.log(S/K)(r0.5*sigma**2)*t)/(sigma*np.sqrt(t))d2d1-sigma*np.sqrt(t)return S*norm.cdf(d1)-K*np.exp(-r*t)*norm.cdf(d2) def bsput(S,K,r,sigma,t):d1(np.log(S/K)(r0.5*sigm…

進擊的二維碼 | ArcBlock 課堂預告

ArcBlock Technical Learning Series 第十七期進擊的二維碼本周三,1 月 30 日下午 1:30 時 (美國太平洋時間 29日下午 21:30 時),由 ArcBloc 后端工程師孫博山 授課。復制代碼二維碼源于日本,如今世界各國都在使用。一張簡單的二維…

期權數據計算

判斷是否為調倉日 ef is_adjust_day(self, dom1):判斷是否是每月的調倉日。 :params int dom: 每月第幾個交易日進行調倉,缺省是第1個交易日。:return: 如果是調倉日,返回True,否則返回False。ret Falsetoday self.datetime.date()…

由Docker的MySQL官方鏡像配置的容器無法啟動問題解決辦法(修改配置后無法啟動)

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 為了方便閱讀,我在原文基礎上加了一些批注,說明我自己的情況,用紅色標示。 這篇文章記錄了我在使用…

HEVC/H265 主要設計者談HEVC/H265

Overview of the High Ef?ciency Video Coding (HEVC) Standard Gary J. Sullivan, Fellow, IEEE, Jens-Rainer Ohm, Member, IEEE, Woo-Jin Han, Member, IEEE, and Thomas Wiegand, Fellow, IEEE Gary J. Sullivan是H263&#xff…

阿里云 Aliplayer高級功能介紹(九):自動播放體驗

基本介紹經常會碰到客戶詢問,為什么我設置了autoplay為true,但是沒有自動播放,每次都要向客戶解釋這個是瀏覽器從用戶體驗角度考慮做的限制,客戶會繼續詢問那我要怎么做? 針對這個問題Aliplayer也專們做過優化&#xf…

指數定投(行不行學習)

import tushare as ts import pandas as pd import numpy as np from scipy import stats import tushare as ts import matplotlib.pyplot as plt %matplotlib inline #正常顯示畫圖時出現的中文和負號 from pylab import mpl mpl.rcParams[font.sans-serif][SimHei] mpl…

centOS安裝python3.7.2

1.查看centos中自帶的Python地址:which python(一般在 /usr/bin/python) 2.切換到python安裝目錄:cd /usr/bin 3.查看對應的Python版本指向:ls -l python* 4.創建一個空目錄:mkdir /usr/local/python3 5.…

有進度條圓周率Π計算

圓周率π的計算 一、圓周率π的簡介 圓周率的介紹圓周率用希臘字母 π(讀作pi)表示,是一個常數(約等于3.141592654),是代表圓周長和直徑的比值。它是一個即無限不循環小數,在日常生活中&#xf…

期權制作回測數據

將指定的檔位的期權,指定階段剩余到期日的期權數據合并,用于回測 import pandas as pd import numpy as np import akshare as ak pd.set_option("display.max_rows",None) pd.set_option("display.max_columns",None)nh_price ak…

HEVC/H265 HM10.0 分析(一)NALread.cpp

下面分析 NALread.cpp 函數和代碼。 void read(InputNALUnit& nalu, vector<uint8_t>& nalUnitBuf) {/* perform anti-emulation prevention */TComInputBitstream *pcBitstream new TComInputBitstream(NULL);convertPayloadToRBSP(nalUnitBuf, (nalUnitBuf[0]…

Docker run 命令 參數說明

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 docker run &#xff1a;創建一個新的容器并運行一個命令 語法 docker run [OPTIONS] IMAGE [COMMAND] [ARG...][OPTIONS] IMAGE [COM…

【云周刊】第205期:阿里云重磅開源實時計算平臺Blink,挑戰計算領域的“珠峰”...

本期頭條 阿里云重磅開源實時計算平臺Blink&#xff0c;挑戰計算領域的“珠峰” 信息爆炸的時代&#xff0c;智能推薦已經被應用到各類互聯網產品中&#xff0c;但為千萬級甚至億級規模的用戶實時做精準的推薦難度極高。這一難題已經被阿里攻克了&#xff1a;雙11的第1分鐘&…

凱特勒通道(backtrader)

import backtrader as bt import datetime import pandas as pd import matplotlib.pyplot as plt import backtrader.analyzers as btanalyzers#定義指標 class Ketler(bt.Indicator):params dict(ema20,atr 17)lines (expo,atr,upper,lower)plotinfo dict(subplot False)p…

MYSQL安裝報錯 -- 出現Failed to find valid data directory.

運行環境&#xff1a;windows10數據庫版本&#xff1a;mysql.8.0.12安裝方式&#xff1a;rpm包直接安裝 問題描述&#xff1a;mysql初始化的時候找不到對應的數據庫存儲目錄 報錯代碼&#xff1a; 2018-10-13T03:29:24.179826Z 0 [System] [MY-010116] [Server] D:\Program Fil…

Mysql 取用逗號分隔的字串的子串的方法:SUBSTRING_INDEX

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 有一張部門表&#xff1a;appbricks_department &#xff0c;有 id 字段和 rank_tree 字段。 rank_tree&#xff1a;記錄的是當前部門的…

UCloud首爾機房整體熱遷移是這樣煉成的

2019獨角獸企業重金招聘Python工程師標準>>> 2018年下半年&#xff0c;UCloud首爾數據中心因外部原因無法繼續使用&#xff0c;需要在很短時間內將機房全部遷走。為了不影響用戶現網業務&#xff0c;我們放棄了離線遷移方案&#xff0c;選擇了非常有挑戰的機房整體熱…