【金融数据分析】基于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