陳麗華 曾德生

摘要:該文通過研究馬科維茨的投資組合模型,并將投資組合模型應用到包含6只金融股票的金融行業基金中。首先通過開源的財經接口Tushare獲取股票原始數據,接著利用數據分析的黃金組合庫:Pandas,Numpy,Matplotlib來進行股票數據的預處理、計算分析、數據可視化處理,最后通過分析得出對投資有價值的結論。它可以廣泛應用于其他任何基金投資組合的分析,對做好投資前股票分析具有一定的參考價值。
關鍵詞:數據分析;Python;投資組合模型;收益率;波動率
中圖分類號:TP311 ? ? ?文獻標識碼: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 背景
近年來隨著我國居民收入不斷增長,投資意識和投資熱情不斷增強。股票、基金是普通居民參與投資的最常見方式,比起買一只股票,更多人傾向于投資基金,通過購買公司的基金,讓自己的資金分散投資到更多的股票上,既能降低投資風險,也能獲得較為可觀的收益。如何在風險可控下獲得更高的收益,就需要對資產做配置,也就是投資組合問題。近年來,在金融領域,量化投資技術越來越受到金融企業青睞,特別是隨著大數據分析技術、人工智能技術不斷發展,很多金融投資企業變為技術驅動性金融公司[1-3]。本文主要集中在股票投資組合的研究,以金融股為例,通過分析組合各個股票的歷史數據來構建最優的股票投資組合,采用開源的財經接口Tushare來獲取股票數據,利用Python數據分析的黃金組合庫:Pandas,Numpy,Matplotlib來進行數據的預處理、計算分析、可視化處理。最終得出有價值的數據分析結論。
2 投資組合理論基礎
投資組合理論是亨利·馬科維茨(Harry Markowitz)在1952年提出,目前在投資組合的研究與實踐中仍然被廣泛采用[4]。本文就是基于馬科維茨模型對股票進行分散投資,利用歷史數據計算機出最佳投資組合策略,可以使投資過程中有效避免投機行為帶來的非系統風險,獲得比較穩定收益。在馬科維茨的投資組合模型中,有兩個非常重要的變量用來評估一個投資組織,分別是投資組合的預期收益率和收益率的波動率。假設投資組合由N個股票組成,wi代表投資組合中第i只股票投資金額占投資組合總投資金額的比例,E(Ri)代表投資組合中第i只股票的預期收益率,這里采用該股票歷史數據中的收益率的均值代替,根據模型可以得到投資組合的預期收益率E(RP)公式如(1)所示。
[ERP=i=1NwiERi] ? ? ? ? ? ? ? ? ? ? (1)
假設[σi]表示第i只股票的收益波動率,Cov(Ri,Rj)表示第i只股票收益率與第j只股票收益率之間的協方差,那么投資組合收益波動率[σP]的公式如(2)所示。
[σP=i=1Nj=1NwiwjCov(Ri,Rj)] ? ? ? ? ? ?(2)
3 投資組合數據分析
投資組合數據分析過程大概分為5個步驟:1)從財經接口獲取股票歷史數據;2)對初始數據進行預處理,將處理好的數據存入文件;3)通過數據可視化觀察股票數據的基本走勢;4)計算股票年化平均收益率、年化收益波動率、股票收益率之間協方差、收益率相關系數等;5)構建3000組投資組合,結合馬科維茨模型,計算并觀察最優組合的年收益率、波動率。
3.1 獲取股票歷史數據
本文采用開源免費的財經數據接口Tushare來獲取股票歷史交易數據,Tushare提供了從數據采集、數據清洗加工到數據存儲的功能[5]。本文主要分析某個金融股票型基金,它包含6只金融股票:招商銀行(600036)、中國平安(601318)、工商銀行(601398)、中國太保(601601)、中國人壽(601628)中國光大(601788)。首先通過pip install tushare安裝所需要的Tushare第三方財經數據庫。接下來通過tushare接口獲取交易原始數據,本文通過獲取近五年的交易數據來進行數據分析。第二個步驟包含三個小步驟:1)到官網注冊賬號,并獲取對應的密鑰,并初始化接口;2)定義列表,存儲需要分析的股票代號,股票代號可以在官網查詢;3)遍歷每只股票,通過api接口的daily獲取股票的當天詳細數據,輸入參數:股票代碼、開始時間、結束時間;輸出參數:股票代號、交易日期、開盤價、最低價、最高價、收盤價等等,本項目我們只保存股票代號,交易日期,收盤價。共獲取6個股票從2016年6月1日至2021年7月23日期間的交易數據,共計7518條交易數據。核心代碼如下:
# 1.設置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.遍歷每只股票、讀取相應數據并進行保存。
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)
最終執行后保存在zuhe.csv文件的數據如圖1(截取其中10行數據)所示。
3.2 股票數據預處理
上一個步驟獲取到的股票原始數據不利我們進行數據分析,所以需要對數據進行預處理,數據預處理主要采用Pandas庫來進行處理[6],它分為四個步驟:1)利用df.drop(df.columns[0], axis=1, inplace=True)把上圖中表格數據中的第一列刪除;2)使用代碼:two_level_index_series = df.set_index(["trade_date", "ts_code "])["close"]將交易日期trade_date、股票代號ts_code設定位復合索引;3)應用unstack()函數進行“行轉列”操作,new_df = two_level_index_series.unstack();4)最后將處理好的數據存入新的文件,new_df.to_csv("new_zuhe.csv")。經過數據預處理后,數據整合成1253條數據,每條數據包含日期,跟6只股票當天收盤價。最終數據如圖2所示。
3.3 股票走勢數據可視化
利用Python數據可視化庫matplotlib來繪制2016年6月-2021年7月期間,本文所選6只股票的基本走勢圖[6],首先將股價按照20160601交易日進行歸1處理,然后利用matplotlib庫的plot()函數讀取上面預處理好的數據,并進行可視化展示,可以觀察到每只股票五年內的基本走勢,核心代碼如下。
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)
最終實現的效果圖如圖3所示:
3.4 獲得投資組合的年化平均收益率和年化收益波動率
利用Numpy數值計算庫來計算股票的各種參數,它提供了大量數學函數庫,比如log()、mean()、std()、sqrt()、cov()、corr()等函數,使用方便快捷[6]。下面我們利用函數庫計算出股票日收益率、股票年化平均收益率、股票年化收益波動率、股票收益率之間協方差、收益率相關系數。核心代碼如下:
#計算股票的日收益率
stock_return=np.log(stock_price/stock_price.shift(1))
#股票平均年化收益率
return_mean=stock_return.mean()*252
#股票年化收益波動率
return_volatility=stock_return.std()*np.sqrt(252)
#計算每只股票收益率之間的協方差
return_cov=stock_return.cov()*252
#計算每只股票收益率之間的相關系數
return_corr=stock_return.corr()
3.5 3000個投資組合的收益率與波動率的對比
為了更觀察投資組合不同配比的收益和波動情況,我們利用隨機函數生成3000組隨機權重系數,每一組包含6個值,每個值代表每只股票在總體投資中的占比。這里采用Numpy庫的random()函數來獲得股票權重數組。核心代碼如下:
#從均勻分布中隨機抽取6行,3000列的0-1的隨機數
x_3000=np.random.random((len(return_mean.index),3000))
#生成包含3000組的隨機權重的數組
w_3000=x_3000/np.sum(x_3000,axis=0)
接下來,利用馬科維茨模型中的投資組合預期收益率公式E(RP)(公式1)、投資組合收益波動率公式[σP](公式2),并采用Numpy豐富的函數庫,計算出3000組投資組合的收益率、波動率,最后使用matplotlib庫將3000組數據直接進行可視化顯示,可以直觀查看投資組合的效果,并進行必要的分析。通過圖4可以看出投資組合最高的年化收益率達到17%左右,最低年化收益率大概2%,投資組合的最高波動率接近29%,最低10%左右。核心代碼如下:
#計算投資組合不同的3000個收益率
Rp_3000=np.dot(return_mean,w_3000)
#生成存放投資組合3000個不同收益波動率的初始化數組
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])))
#繪制投資組合收益率與波動率的關系圖
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('投資組合收益率與波動率關系圖',fontsize=13)
plt.grid('True')
plt.show()
4 結束語
本文通過研究馬科維茨的投資組合模型,并將投資組合模型應用到包含6只金融股票的金融行業基金中。首先通過開源的財經接口Tushare獲取股票原始數據,接著利用數據分析的黃金組合庫:Pandas,Numpy,Matplotlib來進行股票數據的預處理、計算分析、數據可視化處理,最后通過分析得出對投資有價值的結論。它可以廣泛應用于其他任何基金投資組合的分析,只需要在本論文的基礎上,將新組合股票代碼傳入程序即可,具有一定的參考價值。
參考文獻:
[1] 王一凡.馬科維茨均值-方差理論在能源期貨投資組合優化中的運用[J].計算機與現代化,2020(7):11-15.
[2] 林郁東.基于Python的財務指標選股與投資策略探析——以2009—2019年我國股票市場為例[J].商訊,2020(1):1-2.
[3] 林溥真.資管新規下A公司理財產品投資組合方案優化研究[D].廣州:廣東工業大學,2019.
[4] Markowitz H. Portfolio selection[J].The Journal of Finance,1952,7(1):77-91.
[5] Tushare大數據開放社區:數據接口[EB/OL]. [2020-12-28].https://tushare.pro/document/2.
[6] Hilpisch Y. Python金融大數據分析[M].姚軍,譯.北京:人民郵電出版社,2015.
【通聯編輯:謝媛媛】
收稿日期:2021-08-25
基金項目:2019年廣東省普通高校特色創新類項目:基于Kubernetes的集群資源調度技術的研究與應用(項目編號:2019GKTSCX173);2020年廣東省教育科學“十三五”規劃課題:粵港澳大灣區背景下東莞高職信息類專業人才培養改革研究(項目編號:2020GXJK310)
作者簡介:陳麗華(1985—),女,廣東東莞人,學士,主要研究方向為金融數據分析、教育教學管理;曾德生(1983—),男,福建龍巖人,副教授,碩士,研究方向為Linux、云計算、職業教育。