天天看點

【金融資料分析】基于python實作收益率和風險分析1. 導入資料分析包并設定好繪圖工具屬性2. 擷取股票資料3. 收益率4 年化收益5 風險度量

小白一枚,金融大資料分析作業,順便總結一下。

下面的資料以中國銀行股票為例,其他股票的而分析方法類似。程式設計工具:Jupyter notebook

1. 導入資料分析包并設定好繪圖工具屬性

import pandas as pd
import matplotlib.pyplot as plt
import ffn  #金融計算包
import tushare as ts#擷取金融資料的工具包
%matplotlib inline
plt.rcParams['font.sans-serif'] = ['SimHei']  #用來正常顯示中文标簽
plt.rcParams['axes.unicode_minus'] = False  #用來正常顯示負号
           

2. 擷取股票資料

tushare工具包可以擷取股票資料,擷取的資料一般隻能是最近幾年的股價資料。更早的資料擷取不到,可以換用pandas的資料擷取包。

chinaBank = ts.get_hist_data('601988', '2018-01-01', '2019-01-01')  #中國銀行
chinaBank = chinaBank.sort_values(by='date', ascending=True)  #資料轉化為升序
Close = chinaBank.close
Close.head()
           

3. 收益率

3.1 一期收益率

在計算之前,一定要確定日期索引是dataTime類型,否則可能出現計算出錯的問題。

#将索引值變換成日期型資料(datetime),
Close.index = pd.to_datetime(Close.index)
#收盤價格滞後一期,第一位資料由于沒有前項,值會變為NaN
lagClose = Close.shift(1)
#将收盤價格與滞後一期的收盤價格合并,轉換成DataFrame資料
Close_hebing = pd.DataFrame({"Close": Close, "lagClose": lagClose})
Close_hebing.head()
#收益率
simpleret = (Close - lagClose) / lagClose
simpleret.name = 'simpleret'
#中國銀行一期收益率
simpleret.head()  #每天的收益率
           

3.2 二期收益率

#二期收益率
simpleret2 = (Close - Close.shift(2)) / Close.shift(2)
simpleret2.name = 'simpleret2'
simpleret2.head()
           

3.3 單期收益率曲線圖

plt.figure(figsize=(10, 6))
simpleret.plot()
           

作圖的結果如下:

【金融資料分析】基于python實作收益率和風險分析1. 導入資料分析包并設定好繪圖工具屬性2. 擷取股票資料3. 收益率4 年化收益5 風險度量

3.4 累積(多期)收益率曲線圖

第二行代碼的表達式是多期收益率的表達式,多期表達式與一期收益率有一個近似的函數表達式,具體推導需要自行百度一下相關證明。

plt.figure(figsize=(10, 6))
((1 + simpleret).cumprod() - 1).plot()  #累乘cumprod并繪圖
           
【金融資料分析】基于python實作收益率和風險分析1. 導入資料分析包并設定好繪圖工具屬性2. 擷取股票資料3. 收益率4 年化收益5 風險度量

4 年化收益

計算年化收益前需要獲得每日的日收益,年收益的計算公式代碼裡面已經附上。

#累加cumsum和累乘cumprod
#年華收益率計算公式:[(1+r1)*(1+r2)*...(1+rn)]**(n/m),n為一年股票交易天數,m為大盤交易天數
annualize = (1 + simpleret).cumprod()[-1]**(245 / 311) - 1
print("中國銀行2018年年收益:" + str(annualize))
           

5 風險度量

5.1 度量方式1——方差度量風險

方差度量風險,相當于是資料的穩定性,這裡轉化為收益的穩定性。

returnS = ffn.to_returns(chinaBank.close).dropna() #計算一期收益率
print("中國銀行方差風險:" + str(returnS.std()**2)) #std()函數是标準差,需要平方
           

5.2 度量方式1——下行風險

這裡自定義了下行風險偏差函數。無風險收益率不僅可以用自身的平均收益率,還可以使用各個典型的銀行定期收益率作為無風險收益率。

#下行偏差風險函數,傳回值越大則對應的風險越大
def cal_down_risk(returns):
    mu = returns.mean()#無風險利率,這裡取平均值
    temp = returns[returns < mu]
    down_risk = (sum((mu - temp)**2) / len(returns))**0.5
    return (down_risk)
print("下行風險:" + str(cal_down_risk(returnS)))