天天看點

金融學習之十七——使用Tushare繪制系統風險存在性

在股票投資中,投資者面臨的除了收益外,還有相應的風險。根據風險是否可以規避,理論上講風險劃分為系統風險和非系統風險。系統風險是由于企業外部的宏觀環境中各種不可抗因素的作用下而産生的風險,這些因素包括全球性或區域性恐慌、貿易争端、經濟衰退、政府出台經濟調控政策等等。對于系統風險,投資者無法提前感覺和采取措施規避,也無法通過分散投資進行消除。而非系統風險則是由于企業自身的因素而引發的風險,這些因素包括财務風險、經營風險、信用風險、偶然事件風險等。非系統風險往往可以通過充分分散化投資的方式來進行消除。

本講主要想通過繪制圖形來描述系統風險的存在性,具體思想為:選擇N支股票,令N從1至n進行變化,每當投資組合加入一支新股票時,假定每支股票所占權重相等并重新計算該組合的收益率波動率,觀察整個投資組合的收益率波動率的變化情況。

最初的想法是擷取有代表性的建構指數(如上證180,上證50,中證500等)的股票資料,可惜我的tushare權限太低,已經沒有足夠分數直接擷取對應資料了,是以,本文采用的方法是:随機在全部股票中,選擇出一定數量的股票,就不管是否有代表性了,反正根據理論,當分散越充分後,非系統風險也就越小,那就能展現出系統風險的問題了。

首先擷取股票基本資訊,目的是為了拿到所有股票的股票代碼,展示前2條資料看看:

import tushare as ts
pro=ts.pro_api('b497571a3ddd7dde8ebe28b372879594b2f8356c918ad80dae01605b')
df=pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,list_date')
print(df.shape)
df.head(2)
           
金融學習之十七——使用Tushare繪制系統風險存在性

接着定義一個空數組,随機添加一些股票的索引數字進去,根據這些數字,在後面找到表中對應的行,并取出其股票代碼:

import datetime
s=[]
import random
for i in range(500):#值可以更改,為了獲得較大數量的股票
    k=random.randint(0,4462)
    s.append(k)
s=list(set(s))
for i in s:
    if df.loc[i].list_date>'20170101':
        s.remove(i)
           

為了避免某些股票在資料計算的區間(2017-2018兩年)缺失資料,這裡對所有2017年之後上市的公司索引進行了删除。

然後建立一個空資料框,将清單中所有的行索引對應的股票資訊進行擷取并存儲,這裡隻要收盤價close:

import pandas as pd
dt=pd.DataFrame()
k=0
for i in s:
    dt[df.loc[i]['name']]=pro.daily(ts_code=df.loc[i].ts_code, start_date='20170101', end_date='20181231')['close']
           

然後再删除資料框中,列内有空資料的列:

dt=dt.T.dropna().T
           

檢視一下資料:

dt.shape
           

發現結果為(487, 149),有149支股票,487天的交易資料,湊合用了。

對資料框進行按首行歸一處理,并計算出每支股票的收益率:

dt=dt/dt.loc[0]
import numpy as np
r=np.log(dt.astype('float')/dt.astype('float').shift(1))
r=r.dropna()
           

再根據前兩講所講到的方法,計算投資組合的收益率波動率,投資組合每增加一支股票就重新計算一次:

n=len(r.columns)
vp=np.zeros(n)  #用于存儲每增加一支股票後的波動率
for i in range(1,n+1):
    weight=np.ones(i)/i
    cov=252*r.iloc[:,:i].cov()
    vp[i-1]=np.sqrt(np.dot(weight,np.dot(cov,weight.T)))
           

拿到所有的投資組合波動率變化值後,進行繪圖:

k=np.arange(n)+1
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False
plt.figure(figsize=(10,8))
plt.plot(k,vp,'b-',lw=2,label='波動率')
plt.xlabel(u'',fontsize=12)
plt.ylabel(u'',fontsize=12,rotation=90)
plt.title(u'系統風險存在圖',fontsize=14)
plt.grid(True)
plt.legend()
plt.show()
           

第一次的資料做的有點少,是以表現還不是特别好,不過大概趨勢是很明顯的,當股票數量增加時,波動率前期急劇下降,後續逐漸下降(但可能資料不好,居然還有反彈?):

金融學習之十七——使用Tushare繪制系統風險存在性

為了更好的展示,我把資料量增大了,将随機值個數設為1000後,得到的是426支股票,而圖形表現則為:

金融學習之十七——使用Tushare繪制系統風險存在性

可以發現,當組合的股票數量超過一定數量時,不管如何增加股票的數量,這個投資組合的收益率波動率就在20%的附近平穩滑動,是以,這個波動率是無法消除的,也就是我們所提到的系統風險,20%也可以視為是系統風險的水準。另外,這個股票數量一般是在40以上,在本文中,趨近于75,也就是說股票數量足夠大時,就可以充分分散掉非系統風險。