陳麗華 曾德生
摘要:該文通過研究馬科維茨的投資組合模型,并將投資組合模型應(yīng)用到包含6只金融股票的金融行業(yè)基金中。首先通過開源的財經(jīng)接口Tushare獲取股票原始數(shù)據(jù),接著利用數(shù)據(jù)分析的黃金組合庫:Pandas,Numpy,Matplotlib來進(jìn)行股票數(shù)據(jù)的預(yù)處理、計算分析、數(shù)據(jù)可視化處理,最后通過分析得出對投資有價值的結(jié)論。它可以廣泛應(yīng)用于其他任何基金投資組合的分析,對做好投資前股票分析具有一定的參考價值。
關(guān)鍵詞:數(shù)據(jù)分析;Python;投資組合模型;收益率;波動率
中圖分類號:TP311 ? ? ?文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2021)32-0029-03
Data Analysis of Portfolio Returns and Volatility Based on Python Technology
CHEN Li-hua, ZENG De-sheng
(Information Engeering Institute, Guangdong Innovative Technical College, Dongguan 523960, China)
Abstract: In this paper, we study Markowitz's portfolio model and apply the portfolio model to a financial sector fund containing six financial stocks. Firstly, we obtain the raw stock data through the open source financial interface Tushare, then we use the golden combination libraries for data analysis: Pandas, Numpy, Matplotlib for stock data pre-processing, computational analysis, data visualization processing, and finally, we draw valuable conclusions for investment through analysis. It can be widely used in the analysis of any other fund portfolios, and has a certain reference value for ?pre-investment stock analysis.
Key words: data analysis; Python; portfolio selection model; rate of return; volatility
1 背景
近年來隨著我國居民收入不斷增長,投資意識和投資熱情不斷增強(qiáng)。股票、基金是普通居民參與投資的最常見方式,比起買一只股票,更多人傾向于投資基金,通過購買公司的基金,讓自己的資金分散投資到更多的股票上,既能降低投資風(fēng)險,也能獲得較為可觀的收益。如何在風(fēng)險可控下獲得更高的收益,就需要對資產(chǎn)做配置,也就是投資組合問題。近年來,在金融領(lǐng)域,量化投資技術(shù)越來越受到金融企業(yè)青睞,特別是隨著大數(shù)據(jù)分析技術(shù)、人工智能技術(shù)不斷發(fā)展,很多金融投資企業(yè)變?yōu)榧夹g(shù)驅(qū)動性金融公司[1-3]。本文主要集中在股票投資組合的研究,以金融股為例,通過分析組合各個股票的歷史數(shù)據(jù)來構(gòu)建最優(yōu)的股票投資組合,采用開源的財經(jīng)接口Tushare來獲取股票數(shù)據(jù),利用Python數(shù)據(jù)分析的黃金組合庫:Pandas,Numpy,Matplotlib來進(jìn)行數(shù)據(jù)的預(yù)處理、計算分析、可視化處理。最終得出有價值的數(shù)據(jù)分析結(jié)論。
2 投資組合理論基礎(chǔ)
投資組合理論是亨利·馬科維茨(Harry Markowitz)在1952年提出,目前在投資組合的研究與實踐中仍然被廣泛采用[4]。本文就是基于馬科維茨模型對股票進(jìn)行分散投資,利用歷史數(shù)據(jù)計算機(jī)出最佳投資組合策略,可以使投資過程中有效避免投機(jī)行為帶來的非系統(tǒng)風(fēng)險,獲得比較穩(wěn)定收益。在馬科維茨的投資組合模型中,有兩個非常重要的變量用來評估一個投資組織,分別是投資組合的預(yù)期收益率和收益率的波動率。假設(shè)投資組合由N個股票組成,wi代表投資組合中第i只股票投資金額占投資組合總投資金額的比例,E(Ri)代表投資組合中第i只股票的預(yù)期收益率,這里采用該股票歷史數(shù)據(jù)中的收益率的均值代替,根據(jù)模型可以得到投資組合的預(yù)期收益率E(RP)公式如(1)所示。
[ERP=i=1NwiERi] ? ? ? ? ? ? ? ? ? ? (1)
假設(shè)[σi]表示第i只股票的收益波動率,Cov(Ri,Rj)表示第i只股票收益率與第j只股票收益率之間的協(xié)方差,那么投資組合收益波動率[σP]的公式如(2)所示。
[σP=i=1Nj=1NwiwjCov(Ri,Rj)] ? ? ? ? ? ?(2)
3 投資組合數(shù)據(jù)分析
投資組合數(shù)據(jù)分析過程大概分為5個步驟:1)從財經(jīng)接口獲取股票歷史數(shù)據(jù);2)對初始數(shù)據(jù)進(jìn)行預(yù)處理,將處理好的數(shù)據(jù)存入文件;3)通過數(shù)據(jù)可視化觀察股票數(shù)據(jù)的基本走勢;4)計算股票年化平均收益率、年化收益波動率、股票收益率之間協(xié)方差、收益率相關(guān)系數(shù)等;5)構(gòu)建3000組投資組合,結(jié)合馬科維茨模型,計算并觀察最優(yōu)組合的年收益率、波動率。
3.1 獲取股票歷史數(shù)據(jù)
本文采用開源免費(fèi)的財經(jīng)數(shù)據(jù)接口Tushare來獲取股票歷史交易數(shù)據(jù),Tushare提供了從數(shù)據(jù)采集、數(shù)據(jù)清洗加工到數(shù)據(jù)存儲的功能[5]。本文主要分析某個金融股票型基金,它包含6只金融股票:招商銀行(600036)、中國平安(601318)、工商銀行(601398)、中國太保(601601)、中國人壽(601628)中國光大(601788)。首先通過pip install tushare安裝所需要的Tushare第三方財經(jīng)數(shù)據(jù)庫。接下來通過tushare接口獲取交易原始數(shù)據(jù),本文通過獲取近五年的交易數(shù)據(jù)來進(jìn)行數(shù)據(jù)分析。第二個步驟包含三個小步驟:1)到官網(wǎng)注冊賬號,并獲取對應(yīng)的密鑰,并初始化接口;2)定義列表,存儲需要分析的股票代號,股票代號可以在官網(wǎng)查詢;3)遍歷每只股票,通過api接口的daily獲取股票的當(dāng)天詳細(xì)數(shù)據(jù),輸入?yún)?shù):股票代碼、開始時間、結(jié)束時間;輸出參數(shù):股票代號、交易日期、開盤價、最低價、最高價、收盤價等等,本項目我們只保存股票代號,交易日期,收盤價。共獲取6個股票從2016年6月1日至2021年7月23日期間的交易數(shù)據(jù),共計7518條交易數(shù)據(jù)。核心代碼如下:
# 1.設(shè)置Token
ts.set_token('填寫獲取到的個人密鑰')
# 初始化接口
ts_api = ts.pro_api()
#2.定義列表,存儲你需要分析的股票代號
ts_codes = ['600036.SH','601318.SH','601398.SH','601601.SH','601628.SH','601788.SH']
#3.遍歷每只股票、讀取相應(yīng)數(shù)據(jù)并進(jìn)行保存。
for ts_code in ts_codes:
data = ts_api.daily(ts_code=ts_code, start_date='20160601', end_date='20210725')
if(ts_code=="600036.SH"):
data[['ts_code','trade_date','close']].to_csv('zuhe.csv',mode='a')
else:
data[['ts_code','trade_date','close']].to_csv('zuhe.csv',mode='a',header=False)
最終執(zhí)行后保存在zuhe.csv文件的數(shù)據(jù)如圖1(截取其中10行數(shù)據(jù))所示。
3.2 股票數(shù)據(jù)預(yù)處理
上一個步驟獲取到的股票原始數(shù)據(jù)不利我們進(jìn)行數(shù)據(jù)分析,所以需要對數(shù)據(jù)進(jìn)行預(yù)處理,數(shù)據(jù)預(yù)處理主要采用Pandas庫來進(jìn)行處理[6],它分為四個步驟:1)利用df.drop(df.columns[0], axis=1, inplace=True)把上圖中表格數(shù)據(jù)中的第一列刪除;2)使用代碼:two_level_index_series = df.set_index(["trade_date", "ts_code "])["close"]將交易日期trade_date、股票代號ts_code設(shè)定位復(fù)合索引;3)應(yīng)用unstack()函數(shù)進(jìn)行“行轉(zhuǎn)列”操作,new_df = two_level_index_series.unstack();4)最后將處理好的數(shù)據(jù)存入新的文件,new_df.to_csv("new_zuhe.csv")。經(jīng)過數(shù)據(jù)預(yù)處理后,數(shù)據(jù)整合成1253條數(shù)據(jù),每條數(shù)據(jù)包含日期,跟6只股票當(dāng)天收盤價。最終數(shù)據(jù)如圖2所示。
3.3 股票走勢數(shù)據(jù)可視化
利用Python數(shù)據(jù)可視化庫matplotlib來繪制2016年6月-2021年7月期間,本文所選6只股票的基本走勢圖[6],首先將股價按照20160601交易日進(jìn)行歸1處理,然后利用matplotlib庫的plot()函數(shù)讀取上面預(yù)處理好的數(shù)據(jù),并進(jìn)行可視化展示,可以觀察到每只股票五年內(nèi)的基本走勢,核心代碼如下。
import matplotlib.pyplot as plt
stock_price=pd.read_csv('new_zuhe.csv',parse_dates = ['trade_date'], index_col = ['trade_date']).iloc[:,:]
(stock_price/stock_price.iloc[0]).plot(figsize=(9,6),grid=True)
最終實現(xiàn)的效果圖如圖3所示:
3.4 獲得投資組合的年化平均收益率和年化收益波動率
利用Numpy數(shù)值計算庫來計算股票的各種參數(shù),它提供了大量數(shù)學(xué)函數(shù)庫,比如log()、mean()、std()、sqrt()、cov()、corr()等函數(shù),使用方便快捷[6]。下面我們利用函數(shù)庫計算出股票日收益率、股票年化平均收益率、股票年化收益波動率、股票收益率之間協(xié)方差、收益率相關(guān)系數(shù)。核心代碼如下:
#計算股票的日收益率
stock_return=np.log(stock_price/stock_price.shift(1))
#股票平均年化收益率
return_mean=stock_return.mean()*252
#股票年化收益波動率
return_volatility=stock_return.std()*np.sqrt(252)
#計算每只股票收益率之間的協(xié)方差
return_cov=stock_return.cov()*252
#計算每只股票收益率之間的相關(guān)系數(shù)
return_corr=stock_return.corr()
3.5 3000個投資組合的收益率與波動率的對比
為了更觀察投資組合不同配比的收益和波動情況,我們利用隨機(jī)函數(shù)生成3000組隨機(jī)權(quán)重系數(shù),每一組包含6個值,每個值代表每只股票在總體投資中的占比。這里采用Numpy庫的random()函數(shù)來獲得股票權(quán)重數(shù)組。核心代碼如下:
#從均勻分布中隨機(jī)抽取6行,3000列的0-1的隨機(jī)數(shù)
x_3000=np.random.random((len(return_mean.index),3000))
#生成包含3000組的隨機(jī)權(quán)重的數(shù)組
w_3000=x_3000/np.sum(x_3000,axis=0)
接下來,利用馬科維茨模型中的投資組合預(yù)期收益率公式E(RP)(公式1)、投資組合收益波動率公式[σP](公式2),并采用Numpy豐富的函數(shù)庫,計算出3000組投資組合的收益率、波動率,最后使用matplotlib庫將3000組數(shù)據(jù)直接進(jìn)行可視化顯示,可以直觀查看投資組合的效果,并進(jìn)行必要的分析。通過圖4可以看出投資組合最高的年化收益率達(dá)到17%左右,最低年化收益率大概2%,投資組合的最高波動率接近29%,最低10%左右。核心代碼如下:
#計算投資組合不同的3000個收益率
Rp_3000=np.dot(return_mean,w_3000)
#生成存放投資組合3000個不同收益波動率的初始化數(shù)組
Vp_3000=np.zeros_like(Rp_3000)
#通過for計算3000個不同收益波動率
for i in range(len(Rp_3000)):
Vp_3000[i]=np.sqrt(np.dot((w_3000.T)[i],np.dot(return_cov,w_3000[:,i])))
#繪制投資組合收益率與波動率的關(guān)系圖
plt.figure(figsize=(9,6))
plt.scatter(Vp_3000,Rp_3000)
plt.xlabel('波動率',fontsize=13)
plt.ylabel('收益率',fontsize=13,rotation=90)
plt.xticks(fontsize=13)
plt.yticks(fontsize=13)
plt.title('投資組合收益率與波動率關(guān)系圖',fontsize=13)
plt.grid('True')
plt.show()
4 結(jié)束語
本文通過研究馬科維茨的投資組合模型,并將投資組合模型應(yīng)用到包含6只金融股票的金融行業(yè)基金中。首先通過開源的財經(jīng)接口Tushare獲取股票原始數(shù)據(jù),接著利用數(shù)據(jù)分析的黃金組合庫:Pandas,Numpy,Matplotlib來進(jìn)行股票數(shù)據(jù)的預(yù)處理、計算分析、數(shù)據(jù)可視化處理,最后通過分析得出對投資有價值的結(jié)論。它可以廣泛應(yīng)用于其他任何基金投資組合的分析,只需要在本論文的基礎(chǔ)上,將新組合股票代碼傳入程序即可,具有一定的參考價值。
參考文獻(xiàn):
[1] 王一凡.馬科維茨均值-方差理論在能源期貨投資組合優(yōu)化中的運(yùn)用[J].計算機(jī)與現(xiàn)代化,2020(7):11-15.
[2] 林郁東.基于Python的財務(wù)指標(biāo)選股與投資策略探析——以2009—2019年我國股票市場為例[J].商訊,2020(1):1-2.
[3] 林溥真.資管新規(guī)下A公司理財產(chǎn)品投資組合方案優(yōu)化研究[D].廣州:廣東工業(yè)大學(xué),2019.
[4] Markowitz H. Portfolio selection[J].The Journal of Finance,1952,7(1):77-91.
[5] Tushare大數(shù)據(jù)開放社區(qū):數(shù)據(jù)接口[EB/OL]. [2020-12-28].https://tushare.pro/document/2.
[6] Hilpisch Y. Python金融大數(shù)據(jù)分析[M].姚軍,譯.北京:人民郵電出版社,2015.
【通聯(lián)編輯:謝媛媛】
收稿日期:2021-08-25
基金項目:2019年廣東省普通高校特色創(chuàng)新類項目:基于Kubernetes的集群資源調(diào)度技術(shù)的研究與應(yīng)用(項目編號:2019GKTSCX173);2020年廣東省教育科學(xué)“十三五”規(guī)劃課題:粵港澳大灣區(qū)背景下東莞高職信息類專業(yè)人才培養(yǎng)改革研究(項目編號:2020GXJK310)
作者簡介:陳麗華(1985—),女,廣東東莞人,學(xué)士,主要研究方向為金融數(shù)據(jù)分析、教育教學(xué)管理;曾德生(1983—),男,福建龍巖人,副教授,碩士,研究方向為Linux、云計算、職業(yè)教育。