京公网安备 11010802034615号
经营许可证编号:京B2-20210330
利用Python进行量化投资分析-利率及风险资产的超额收益
本文是利用 Python 进行量化投资分析系列的第一篇文章,这个系列主要以 Python 作为工具,结果国内金融市场情况,及使用真实历史数据来实践一些基础的金融投资概念。
这篇文章主要讲述了真实利率及名义利率的区别,运用 Python 以及 Tushare 库来获取存款利率及 CPI
数据用来计算真实利率。同时,结合当前投资的实际情况,详细阐述了如何获取余额宝历史收益数据以及利用余额宝收益计算真实利率。接着,我们还探讨了利用近一年来沪深300指数与余额宝匹配,计算近一年来的沪深300超额收益率。
通过本文,你将能了解一下概念:
真实利率
名义利率
无风险收益率
超额收益
同时,你将能掌握以下使用Python进行量化投资分析的技巧:
通过 Tushre 库获取 CPI、存款利率数据
计算近似真实利率及准确的真实利率
通过编写爬虫程序,获取余额宝历史数据
计算资产持有期收益率 HPR
计算风险资产与无风险资产的超额收益率
真实利率与名义利率
假设一年前在银行存了 10,000 元人民币,期限一年,那么按一年定期利率 1.50% 计算,现在可以得到 10,150 元。而实际上,我们真实的收益取决于现在的 10,150元可以买多少东西以及一年前 10,000元可以买多少东西,针对这一问题,我们通常使用消费者物价指数(CPI)来代表通胀率,来分析我们的实际收益。
首先,我们先要得到历史的 CPI 数据,才能进行下一步分析。CPI 可以通过国家统计局公布的CPI数据查询,然而,我们在实际中,可以通过实用Tushare库中所封装好的方法获取实用。
# 获取近一年的 CPI 数据
import tushare as ts
cpi = ts.get_cpi()
cpi[:12]
>>>>> 输出结果 >>>>>
month cpi
0 2017.8 101.77
1 2017.7 101.40
2 2017.6 101.64
3 2017.5 101.04
4 2017.4 101.26
5 2017.3 99.98
6 2017.2 102.39
7 2017.1 101.99
8 2016.12 103.04
9 2016.11 102.25
10 2016.10 102.10
11 2016.9 101.90
接下来,我们计算一下年均 CPI 涨幅:
yearly_cpi = sum(cpi['cpi'][:12]) / 12
yearly_cpi
>>>>> 输出结果 >>>>>
101.73
这里我们就得到加权年均 CPI 为 101.73,即我们认为这一年的通胀率为 1.73%。这意味着我们手中的货币购买力在过去一年贬值
1.73%,那么我们的利益收益计算用于弥补通胀,那么最终实际增加的购买力是
-0.23%,也就是说,假如我们这一年把钱存银行定期,那么一年过去了,我们实际亏损 0.23%。
我们刚刚是通过名义利率减去通胀率来获得真实利率,这是一种近似的计算方法,我们舍名义利率为R,真实利率为r, 通胀率为i,计算公式如下:
严格意义上,名义利率和真实利率之间的关系,是购买力增长值等于货币增长值除以新的价格水平,即:
因此,我们可以编写一个函数,来计算精确的真实利率:
def accurate_real_interest_rate(nir, ir):
return (nir - ir) / (1 + ir)
arir = accurate_real_interest_rate(0.015, 0.0173)
arir
>>>>> 输出结果 >>>>>
-0.002260886660768701
更符合真实情况的利率
伴随现在各种互联网金融工具的兴起,我们通常情况下不会将钱放到银行存定期,我们往往会购买各种短期、中长期的理财产品。然而, 由于不同的理财产品有着不同其期限以及其特殊的申购赎回方式,这里为了方便分析,我们选取了存取条件较为简单的余额宝作为新的工具用来分析。
获取余额宝历史数据的方法可以参考 《利用 Python 获取余额宝历史收益数据》一文,具体代码入下:
# 获取余额宝历史数据
import requests
import bs4
import pandas as pd
SYMBOL_YEBAO = '000198'
def obtain_info_of_data(symbol):
response = requests.get('http://fund.eastmoney.com/f10/F10DataApi.aspx?type=lsjz&code=' + str(symbol))
# return format: var apidata={...};
# filter the tag
content = str(response.text.encode('utf8')[13:-2])
content_split = content.split(',')
# obtain the info of data, curpage, pages, records
curpage = content_split[-1].split(':')[-1]
pages = content_split[-2].split(':')[-1]
records = content_split[-3].split(':')[-1]
return {'curpage': curpage, 'pages': pages, 'records': records}
def obtain_data(symbol):
dict_data_info = obtain_info_of_data(symbol)
cur_pages = int(dict_data_info['pages'])
pages = dict_data_info['pages']
records = dict_data_info['records']
data_return = []
url = 'http://fund.eastmoney.com/f10/F10DataApi.aspx?type=lsjz&code=%s&page=%s'
for cp in range(int(pages), 0, -1):
response = requests.get(url % (symbol, str(cp)))
content = response.text[13:-2]
data = content.split(',')[0][10:-1]
data_soup = bs4.BeautifulSoup(data, 'lxml')
line_of_data = len(data_soup.select('table > tbody > tr'))
for i in range(line_of_data, 0, -1):
row_of_data = []
date = data_soup.select('table > tbody > tr:nth-of-type(%i) > td:nth-of-type(1)' % i)[0].text
earning_per_10k = float(data_soup.select('table > tbody
> tr:nth-of-type(%i) > td:nth-of-type(2)' % i)[0].text) / 10000.0
annualized_return = float(data_soup.select('table >
tbody > tr:nth-of-type(%i) > td:nth-of-type(3)' % i)[0].text[:-1])
/ 100.0
row_of_data.append(date)
row_of_data.append(earning_per_10k)
row_of_data.append(annualized_return)
data_return.append(row_of_data)
print('Finished %i' % cp)
cur_pages -= 1
if cur_pages == 1 and len(data_return) != int(records):
print('Data Missing..')
return pd.DataFrame(data_return, columns=["date", "rate10k", "rate7d"])
# data_info = obtain_info_of_data(SYMBOL_YEBAO)
rs = obtain_data(SYMBOL_YEBAO)
接下来,我们将计算最近一年的余额宝收益:
yeb_yearly_rate = sum(rs[-360:]["rate7d"]) / 360 # rs 为上文 rs = obtain_data(SYMBOL_YEBAO) 获得
yeb_yearly_rate
>>>>> 输出结果 >>>>>
0.035411472222222247
我们这里得到余额宝近一年的收益为 3.54%,比上文获取到的一年期银行利率高,我们再次用上面的真实利率函数计算一下余额宝的真实收益率:
# 余额宝真实收益率
yeb_arir = accurate_real_interest_rate(yeb_yearly_rate, 0.0173)
yeb_arir
>>>>> 输出结果 >>>>>
0.01780347215395876
我们可以看到,最近一年,将钱用于购买余额宝,真实的收益率是可以达到正数的。
无风险利率与风险资产的超额收益
在分析风险之前,我们先了解一个概念 ——持有期收益率 HPR,所谓持有期收益率,就是资产期末价格与期初价格之差除以期初价格。用公式表示如下:
如果是股票类资产,还需要考虑现金红利以及除权等问题。
接下来,我们以沪深300指数为例,计算持有一年收益率:
# 获取沪深300历史数据
hs300 = ts.get_k_data("hs300")
# 计算 HPR 函数
def hpr(endPrice, periodPrice):
endPrice = float(endPrice)
periodPrice = float(periodPrice)
return (endPrice - periodPrice) / periodPrice
hpr_yearly = hpr(hs300[hs300["date"] == "2017-09-25"]["close"], hs300[hs300["date"] == "2017-01-03"]["close"])
hpr_yearly
>>>>> 输出结果 >>>>>
0.14228823270690524
我们从上面程序运行结果可以得出,最近一年,沪深300指数的年均收益率为14.22%。
接下来,我们继续探讨另外一个概念 ——超额收益 excess return,所谓超额收益,就是指特定时期风险资产同无风险资产之间的差,用公式表示:
我们同样编写一个计算超额收益的函数,用来计算近一年来 余额宝-沪深300指数 之间的超额收益。
# 计算超额收益函数
def excess_return(rp, rfr):
return rp - rfr
yeb_hs300_er = excess_return(hpr_yearly, yeb_yearly_rate)
yeb_hs300_er
>>>>> 输出结果 >>>>>
0.106876760484683
通过运行上面的程序,我们可以计算出,近一年来,投资沪深300指数的超额收益为 10.69%。
小结
通过这篇文章,我们了解了什么是名义利率、真实利率,以及如何计算近似和准确的真实利率,同时,我们还知道了什么是无风险资产和风险资产的超额收益。此外,我们还掌握了如何借助
Tushare 库来获取历史存款利率数据以及 CPI 历史数据,还了解了如何使用爬虫程序来获取余额宝历史数据。
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
金融行业的运营风险贯穿业务全流程,涵盖交易欺诈、操作违规、流程漏洞、合规偏差、客户信用异常等多元场景,是银行、保险、证券 ...
2026-07-17财产保险作为金融行业的核心板块,涵盖车险、家财险、责任险、企财险等多元品类,是个人与企业抵御财产风险、经营风险的重要保障 ...
2026-07-17 很多数据分析师能熟练写SQL、做透视表,但当被问到“数据是从哪里来的?经过哪些加工才进入数据仓库?ETL具体做了什么?”时 ...
2026-07-17【核心关键词】模块、餐饮、客户、门店、企业、订单、供应链、多样化、产品、生产计划、数据分析、生产管理、物料管理、业务分 ...
2026-07-16在数字化分析时代,原始数据本身不具备业务价值,只有通过科学的统计学方法加工、拆解、验证与解读,才能挖掘数据背后的规律、差 ...
2026-07-16 很多数据分析师能熟练地写SQL、做透视表、算描述性统计,但当被问到“如何预测用户流失概率”“如何归因销量下滑的关键因素 ...
2026-07-16在描述性统计分析、数据预处理、异常值排查与多组数据分布对比工作中,箱线图(Box Plot)是应用最广泛的可视化与统计工具之一。 ...
2026-07-15在企业数据存储、业务统计与数据分析工作中,绝大多数业务数据都带有时间维度属性,例如订单创建时间、用户注册时间、支付完成时 ...
2026-07-15 很多数据分析师拿到数据就开始清洗、建模,但当被问到“这批数据属于什么类型——结构化还是非结构化?分类变量还是数值变量 ...
2026-07-15【核心关键词】产品、经营、客户、调研、销售额、宏观、会计行业、客户满意度、发展趋势、经营状况、数据分析、竞争对手、数据 ...
2026-07-14问卷调查是市场调研、用户研究、社会调研与产品分析的核心数据采集方式。问卷数据大多以分类数据为主,例如用户性别、年龄分层、 ...
2026-07-14 很多数据分析师画过趋势图、做过业绩预测,但当被问到“这个月销售额增长20%,到底是长期趋势自然增长,还是促销活动的短期 ...
2026-07-14在数据分析、业务效果验证、AB实验扩展、行业对比等场景中,我们经常需要对比三组及以上样本的均值差异,例如不同区域的客单价对 ...
2026-07-13在互联网产品运营、用户生命周期管理与商业化数据分析中,留存指标是判断产品价值、用户满意度与商业模式健康度的核心基准。常规 ...
2026-07-13 很多数据分析师做过按月份的销售额趋势图,画过按天的流量折线图,但当被问到“时间序列和普通数据有什么本质区别”“季节性 ...
2026-07-13【核心关键词】统计学、互联网、知识、课程、学生、数学、软件、招聘、数据分析、实习经历、机器学习、理论基础、业务思维、统 ...
2026-07-10在互联网运营、产品设计、市场营销与商业数据分析领域,所有转化、成交、复购行为的底层逻辑,都依托于用户决策流程。用户从产生 ...
2026-07-10 很多数据分析师能熟练地计算指标、搭建标签体系,但当被问到“画像到底在解决什么问题”“画像和标签是什么关系”“画像如何 ...
2026-07-10数据透视表是数据分析中最常用、最高效的汇总分析工具,具备快速分组、聚合计算、维度拆解、数据可视化等优势,能够轻松完成求和 ...
2026-07-09在统计学、CDA数据分析、机器学习与商业数据研究中,正态分布是最基础、最重要的数据分布形态。绝大多数参数检验、数据建模、指 ...
2026-07-09