【金融數據分析】基於python實現收益率和風險分析


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

下面的數據以中國銀行股票為例,其他股票的而分析方法類似。編程工具: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  #用來正常顯示負號
[/code]

#  2. 獲取股票數據

tushare工具包可以獲取股票數據,獲取的數據一般只能是最近幾年的股價數據。更早的數據獲取不到,可以換用pandas的數據獲取包。

```code
    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()
[/code]

#  3. 收益率

##  3.1 一期收益率

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

```code
    #將索引值變換成日期型數據(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()  #每天的收益率
[/code]

##  3.2 二期收益率

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

##  3.3 單期收益率曲線圖

```code
    plt.figure(figsize=(10, 6))
    simpleret.plot()
[/code]

作圖的結果如下:

![](https://img-blog.csdnimg.cn/20200604222419539.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1NTY5Mzcz,size_16,color_FFFFFF,t_70)

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

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

```code
    plt.figure(figsize=(10, 6))
    ((1 + simpleret).cumprod() - 1).plot()  #累乘cumprod並繪圖
[/code]

![](https://img-blog.csdnimg.cn/20200604223034537.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1NTY5Mzcz,size_16,color_FFFFFF,t_70)

#  4 年化收益

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

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

#  5 風險度量

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

方差度量風險,相當於是數據的穩定性,這里轉化為收益的穩定性。

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

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

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

```code
    #下行偏差風險函數,返回值越大則對應的風險越大
    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)))
[/code]


![在這里插入圖片描述](https://img-blog.csdnimg.cn/20210608151750993.gif)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM