【时间序列分析】S04E05金融量化分析(中篇):年化收益率和波动率的计算

在上一节里,我们得到了清洗整理后的股债指数时间序列数据,接下来进行一些核心指标的计算,这里我们重点讨论年化收益率和波动率的计算。

1.年化收益率的计算

我们最关注的当然是一个标的的投资价值如何,能赚多少钱?因此,年化收益率是我们第一个关注的重要指标,在金融投资领域,复利是一个非常非常重要的核心概念,先看下面这个表达式:

$(1+年化收益率)^{年份}=最终价值/初始价值 $

但是这里请大家注意了,一般情况下我们获取的并不是整年的数据,因此年份需要进一步精确的表示为:

$年份=\frac{总交易日}{年交易日}$ ,年交易日数,我们取平均值244天。

因此,上面的复利公式就转化为了:

$(1+年化收益率)^{\frac{总交易日}{244}}=最终价值/初始价值$

稍稍对式子做一些变形,就能得到年化收益率的表达式:

$年化收益率=(最终价值/初始价值)^{\frac{244}{总交易日}}-1$

那么,我们通过这个计算公式,来计算一下沪深300指数和国债指数,近5年来各自的年化收益率,我们先看看几个关键的参数:

代码片段:

import pandas as pd
import matplotlib.pyplot as plt
import seaborn
seaborn.set()

def get_data_ser(index_code, begin_date, end_date):
    csv_name = index_code+'.csv'
    df = pd.read_csv(csv_name,encoding='gbk')
    df = df.reindex(index=df.index[::-1])
    df.set_index('date', inplace=True)
    date_index = pd.DatetimeIndex(df.index)
    ser = df.reindex(index=date_index)['close']

    select_date = pd.date_range(begin_date, end_date)
    select_ser = ser[ser.index.isin(select_date)]

    return select_ser


hs_300 = get_data_ser('399300','2014-5-13','2019-5-13')
total_trading_day = len(hs_300.index)
annual_trading_day = 244
final_net_worth = hs_300.iloc[total_trading_day-1]
initial_net_worth = hs_300.iloc[0]

print('初始价值:{}'.format(initial_net_worth))
print('最终价值:{}'.format(final_net_worth))
print('年交易日:{}'.format(annual_trading_day))
print('总交易日:{}'.format(total_trading_day))

运行结果:

初始价值:2174.8520
最终价值:3668.7255
年交易日:244
总交易日:1220

在获取这些参数的过程中,我们运用了一些series对象的数据索引方法,这些方法非常基础,我们在前面的内容中也都提到过,这里就不再赘述了。

接下来,我们按照年化收益率的公式来进行指标的计算:

代码片段:

annual_ret_rate = pow((final_net_worth/initial_net_worth),(annual_trading_day/total_trading_day))-1

print(final_net_worth/initial_net_worth)
print(annual_ret_rate)

运行结果:

1.68688513057
0.110240592747

从运行结果中我们发现,目前沪深300指数的净值是5年前的1.687倍,近五年的年化收益率为11.02%。

当然,我们把这段计算年化收益率的代码封装成一个函数,就可以复用了,我们分别计算一下沪深300指数和国债指数,近3年、5年、10年和15年的年化收益率。

代码片段:

def get_annual_ret_rate(index_code, begin_date, end_date):
    ser = get_data_ser(index_code, begin_date, end_date)
    total_trading_day = len(ser.index)
    annual_trading_day = 244
    final_net_worth = ser.iloc[total_trading_day - 1]
    initial_net_worth = ser.iloc[0]

    annual_ret_rate = pow((final_net_worth / initial_net_worth), (annual_trading_day / total_trading_day)) - 1
    return annual_ret_rate

print('沪深300指数年化收益率:')
print('近3年:{}'.format(get_annual_ret_rate('399300', '2016-5-13', '2019-5-13')))
print('近5年:{}'.format(get_annual_ret_rate('399300', '2014-5-13', '2019-5-13')))
print('近10年:{}'.format(get_annual_ret_rate('399300', '2009-5-13', '2019-5-13')))
print('近15年:{}'.format(get_annual_ret_rate('399300', '2004-5-13', '2019-5-13')))
print('国债指数年化收益率:')
print('近3年:{}'.format(get_annual_ret_rate('000012', '2016-5-13', '2019-5-13')))
print('近5年:{}'.format(get_annual_ret_rate('000012', '2014-5-13', '2019-5-13')))
print('近10年:{}'.format(get_annual_ret_rate('000012', '2009-5-13', '2019-5-13')))
print('近15年:{}'.format(get_annual_ret_rate('000012', '2004-5-13', '2019-5-13')))

运行结果:

top Created with Sketch.