python数据可视化使用pyfinance分析证券收益示例详解


Posted in Python onNovember 20, 2021

pyfinance简介

在查找如何使用Python实现滚动回归时,发现一个很有用的量化金融包——pyfinance。顾名思义,pyfinance是为投资管理和证券收益分析而构建的Python分析包,主要是对面向定量金融的现有包进行补充,如pyfolio和pandas等。

pyfinance包含六个模块

datasets.py :金融数据下载(基于request进行数据爬虫,有些数据由于外网受限已经无法下载);

general.py:通用财务计算,例如主动份额计算,收益分配近似值和跟踪误差优化;

ols.py:回归分析,支持pandas滚动窗口回归;

options.py:期权衍生品计算和策略分析;

returns.py:通过CAPM框架对财务时间序列进行统计分析,旨在模拟FactSet Research Systems和Zephyr等软件的功能,并提高了速度和灵活性;

utils.py:基础架构。

python数据可视化使用pyfinance分析证券收益示例详解

本文主要围绕returns模块,介绍pyfinance在证券投资分析中的应用,后续将逐步介绍datasets、options、ols等模块。

returns模块应用实例

pyfinance的安装比较简单,直接在cmd(或anaconda prompt)上输入"pip install pyfinance"即可。returns模块主要以TSeries类为主体(暂不支持dataframe),相当于对pandas的Series进行类扩展,使其实现更多功能,支持证券投资分析中基于CAMP(资本资产定价模型)框架的业绩评价指标计算。引用returns模块时,直接使用"from pyfinance import TSeries"即可。

python数据可视化使用pyfinance分析证券收益示例详解

下面以tushare为数据接口,先定义一个数据获取函数,在函数里对收益率数据使用TSeries进行转换,之后便可以直接使用TSeries类的相关函数。

import pandas as pd  
import numpy as np
from pyfinance import TSeries
import tushare as ts
def get_data(code,start='2011-01-01',end=''):
    df=ts.get_k_data(code,start,end)
    df.index=pd.to_datetime(df.date)
    ret=df.close/df.close.shift(1)-1
    #返回TSeries序列
    return TSeries(ret.dropna())
#获取中国平安数据
tss=get_data('601318')
#tss.head()

收益率计算

pyfinance的returns提供了年化收益率(anlzd_ret)、累计收益率(cuml_ret)和周期收益率(rollup)等,下面以平安银行股票为例,计算收益率指标。

#年化收益率
anl_ret=tss.anlzd_ret()
#累计收益率
cum_ret=tss.cuml_ret()
#计算周期收益率
q_ret=tss.rollup('Q')
a_ret=tss.rollup('A')
print(f'年化收益率:{anl_ret*100:.2f}%')
print(f'累计收益率:{cum_ret*100:.2f}%')
#print(f'季度收益率:{q_ret.tail().round(4)}')
#print(f'历年收益率:{a_ret.round(4)}')

输出结果:

累计收益率:205.79%

年化收益率:12.24%

可视化每个季度(年)收益率

from pyecharts import Bar
attr=q_ret.index.strftime('%Y%m')
v1=(q_ret*100).round(2).values
bar=Bar('中国平安各季度收益率%')bar.add('',attr,v1,)
bar

python数据可视化使用pyfinance分析证券收益示例详解

from pyecharts import Bar
attr=a_ret.index.strftime('%Y')
v1=(a_ret*100).round(2).values
bar=Bar('中国平安历年收益率%')
bar.add('',attr,v1,is_label_show=True,
       is_splitline_show=False)
bar

python数据可视化使用pyfinance分析证券收益示例详解

CAPM模型相关指标

基于CAPM模型计算alpha、beta、回归决定系数R2、t统计量和残差项等。实际上主要使用了ols回归,因此如果要获得这些动态的alpha和beta值,可以进一步借助ols模块的滚动回归函数(PandasRollingOLS)了,这将在后续推文介绍其应用。

#以沪深300指数为基准
#为保证二者长度一致,以中国平安的索引为准
benchmark=get_data('hs300')
benchmark=benchmark.loc[tss.index]
alpha,beta,rsq=tss.alpha(benchmark),tss.beta(benchmark),tss.rsq(benchmark)
tstat_a,tstat_b=tss.tstat_alpha(benchmark),tss.tstat_beta(benchmark)
print(f'alpha:{alpha:.4f},t统计量:{tstat_a:.2f}')
print(f'beta :{beta:.4f},t统计量:{tstat_b:.2f}')
print(f'回归决定系数R2:{tss.rsq(benchmark):.3f}')

alpha:0.0004,t统计量:1.55
beta :1.0634,t统计量:60.09
回归决定系数R2:0.606

风险指标

风险指标主要包括标准差和最大回撤。在计算标准差时,注意需要修改默认参数,打开pyfinance安装包所在路径,如果是安装了Anaconda,进入以下路径:

c:\Anaconda3\Lib\site-packages\pyfinance,打开returns源文件,找到anlzd_stdev和semi_stdev函数,将freq默认None改成250(一年的交易天数)。

#年化标准差
a_std=tss.anlzd_stdev()
#下行标准差
s_std=tss.semi_stdev()
#最大回撤
md=tss.max_drawdown()
print(f'年化标准差:{a_std*100:.2f}%')
print(f'下偏标准差:{s_std*100:.2f}%')
print(f'最大回撤差:{md*100:.2f}%')

年化标准差:31.37%
下偏标准差:0.43%
最大回撤差:-45.76%

下偏标准差主要是为解决收益率分布的不对称问题,当收益率函数分布左偏的情况下,使用正态分布会低估风险,因此使用传统夏普比率分母使用全样本标准差进行估计不太合适,应使用收益对无风险投资收益的偏离。

基准比较指标

基准比较指标是需要指定一个基准(benchmark),如将沪深300指数作为中国平安个股的基准进行比较分析。

bat=tss.batting_avg(benchmark)
uc=tss.up_capture(benchmark)
dc=tss.down_capture(benchmark)
tc=uc/dc
pct_neg=tss.pct_negative()
pct_pos=tss.pct_positive()
print(f'比基准收益高的时间占比:{bat*100:.2f}%')
print(f'上行期与基准收益比:{uc*100:.2f}%')
print(f'下行期与基准收益比:{dc*100:.2f}%')
print(f'上行期与下行期比:{tc*100:.2f}%')
print(f'个股下行(收益负)时间占比:{pct_neg*100:.2f}%')
print(f'个股上行(收益正)时间占比:{pct_pos*100:.2f}%')

比基准收益高的时间占比:47.83%
上行期与基准收益比:111.70%
下行期与基准收益比:105.32%
上行期与下行期比:106.06%
个股下行(收益负)时间占比:48.94%
个股上行(收益正)时间占比:50.00%

此外,信息比率和特雷诺指数是两个常用的基准比较评价指标,特别是用于对基金产品或投资组合的业绩进行量化评价。

信息比率(information ratio):以马克维茨的均值方差模型为基础,衡量超额风险所带来的超额收益,表示单位主动风险所带来的超额收益。IR=α ? ω (α为组合的超额收益,ω为主动风险),分子α为真实预期收益率与定价模型所计算出的收益率的差,分母为残差风险即残差项的标准差。

特雷诺指数(Treynor ratio):衡量单位风险的超额收益,计算公式为:TR=(Rp?Rf)/βp,其中:TR表示特雷诺业绩指数,Rp表示某投资组合平均收益率,Rf为平均无风险利率,βp表示某投资组合的系统风险。

ir=tss.info_ratio(benchmark)
tr=tss.treynor_ratio(benchmark)
print(f'信息比率:{ir:.3f}')
print(f'特雷诺指数:{tr:.3f}')
信息比率:0.433
特雷诺指数:0.096

风险调整收益指标

风险调整收益率指标比较常用的有夏普比率(sharpe ratio)、索提诺比率(sortino ratio)和卡玛比率(calmar ratio),这三个指标都是风险调整后收益比率,因此分子都是收益指标,分母都是风险指标。

  • 夏普比率(Sharpe Ratio):风险调整后的收益率,计算公式:=[E(Rp)-Rf]/σp,其中E(Rp):投资组合预期报酬率,Rf:无风险利率,σp:投资组合的标准差。计算投资组合每承受一单位总风险,会产生多少的超额报酬。
  • 索提诺比率(Sortino Ratio):与夏普比率思路一致,核心在于分母应用了下行波动率概念(Downside Risk),计算标准差的时候,不采用均值,而是一个设定的可接受最小收益率(r_min),收益率序列中,超出这个最小收益率的收益距离按照0计算,低于这个收益率的平方距离累积,这样标准差就变成了半个下行标准差。对应的,索提诺比率的分子也采用策略收益超出最低收益的部分。与夏普比率相比,索提诺比率更看重对(左)尾部的预期损失分析,而夏普比率则是对全体样本进行分析。
  • Calmar比率(Calmar Ratio) :描述收益和最大回撤之间的关系,计算方式为年化收益率与历史最大回撤之间的比率。Calmar比率数值越大,投资组合业绩表现越好。
sr=tss.sharpe_ratio()
sor=tss.sortino_ratio(freq=250)
cr=tss.calmar_ratio()
print(f'夏普比率:{sr:.2f}')
print(f'索提诺比率:{sor:.2f}')
print(f'卡玛比率:{cr:.2f}')

夏普比率:0.33
索提诺比率:28.35
卡玛比率:0.27

综合业绩评价指标分析实例

下面将上述常用指标进行综合,并获取多只个股进行比较分析。

def performance(code,start='2011-01-01',end=''):
    tss=get_data(code,start,end)
    benchmark=get_data('hs300',start,end).loc[tss.index]
    dd={}
    #收益率
    #年化收益率
    dd['年化收益率']=tss.anlzd_ret()
    #累积收益率
    dd['累计收益率']=tss.cuml_ret()
    #alpha和beta
    dd['alpha']=tss.alpha(benchmark)
    dd['beta']=tss.beta(benchmark)
    #风险指标
    #年化标准差
    dd['年化标准差']=tss.anlzd_stdev()
    #下行标准差
    dd['下行标准差']=tss.semi_stdev()
    #最大回撤
    dd['最大回撤']=tss.max_drawdown()
    #信息比率和特雷诺指数
    dd['信息比率']=tss.info_ratio(benchmark)
    dd['特雷纳指数']=tss.treynor_ratio(benchmark)
    #风险调整收益率
    dd['夏普比率']=tss.sharpe_ratio()
    dd['索提诺比率']=tss.sortino_ratio(freq=250)
    dd['calmar比率']=tss.calmar_ratio()
    df=pd.DataFrame(dd.values(),index=dd.keys()).round(4)
    return df

获取多只个股(也构建投资组合)数据,对比评估业绩评价指标:

#获取多只股票数据
df=pd.DataFrame(index=performance('601318').index)
stocks={'中国平安':'601318','贵州茅台':'600519',\
        '海天味业':'603288','格力电器':'000651',\
        '万科A':'00002','比亚迪':'002594',\
        '云南白药':'000538','双汇发展':'000895',\
        '海尔智家':'600690','青岛啤酒':'600600'}
for name,code in stocks.items():
    try:
        df[name]=performance(code).values
    except:
        continue

d

python数据可视化使用pyfinance分析证券收益示例详解

结语

pyfinance主要为证券投资管理和绩效评价指标而设计的python包,对于考CFA和FRM的读者相当实用。实际上,pyfinance的returns模块是对pandas的Series类进行了扩展,从而支持证券投资收益分析和绩效评价。Python是建立在各种轮子上(module)的“胶水”语言,因此善于借用已有的包进行计算和编程,可以提高效率,减少自己“造轮子”的时间和精力。

以上就是python数据可视化使用pyfinance分析证券收益示例详解的详细内容,更多关于pyfinance分析证券收益的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python连接mysql实例分享
Oct 09 Python
利用python实现微信头像加红色数字功能
Mar 26 Python
python梯度下降法的简单示例
Aug 31 Python
Python设计模式之备忘录模式原理与用法详解
Jan 15 Python
python3模拟实现xshell远程执行liunx命令的方法
Jul 12 Python
Python图像处理PIL各模块详细介绍(推荐)
Jul 17 Python
Python使用Selenium实现淘宝抢单的流程分析
Jun 23 Python
Pytorch 解决自定义子Module .cuda() tensor失败的问题
Jun 23 Python
python爬虫分布式获取数据的实例方法
Nov 26 Python
python复合条件下的字典排序
Dec 18 Python
Django解决frame拒绝问题的方法
Dec 18 Python
python Tkinter的简单入门教程
Apr 11 Python
python编程学习使用管道Pipe编写优化代码
Nov 20 #Python
python自动化测试通过日志3分钟定位bug
Nov 20 #Python
Python实现位图分割的效果
python脚本框架webpy模板赋值实现
python脚本框架webpy模板控制结构
Nov 20 #Python
python脚本框架webpy的url映射详解
Nov 20 #Python
Pygame Time时间控制的具体使用详解
Nov 17 #Python
You might like
PHP分多步骤填写发布信息的简单方法实例代码
2012/09/23 PHP
zend framework框架中url大小写问题解决方法
2014/08/19 PHP
Yii视图CGridView实现操作按钮定义地址示例
2016/07/14 PHP
PHP递归实现快速排序的方法示例
2017/12/18 PHP
thinkPHP5框架路由常用知识点汇总
2019/09/15 PHP
jquery tab标签页的制作
2010/05/10 Javascript
NodeJs中的非阻塞方法介绍
2012/06/05 NodeJs
jquery获取特定name所有选中的checkbox,支持IE9标准模式
2013/03/18 Javascript
jquery 操作两个select实现值之间的互相传递
2014/03/07 Javascript
详解jquery easyui之datagrid使用参考
2016/12/05 Javascript
JavaScript限定范围拖拽及自定义滚动条应用(3)
2017/05/17 Javascript
NodeJs使用Mysql模块实现事务处理实例
2017/05/31 NodeJs
vue.js实现单选框、复选框和下拉框示例
2017/07/18 Javascript
JavaScript中运算符规则和隐式类型转换示例详解
2017/09/06 Javascript
JavaScript函数绑定用法实例分析
2017/11/14 Javascript
vue的列表交错过渡实现代码示例
2019/05/05 Javascript
微信小程序地图实现展示线路
2020/07/29 Javascript
微信小程序实现打卡签到页面
2020/09/21 Javascript
微信小程序input抖动问题的修复方法
2021/03/03 Javascript
python字典键值对的添加和遍历方法
2016/09/11 Python
Python自动发邮件脚本
2017/03/31 Python
pytorch神经网络之卷积层与全连接层参数的设置方法
2019/08/18 Python
sklearn-SVC实现与类参数详解
2019/12/10 Python
雅诗兰黛(Estee Lauder)英国官方网站:世界顶级化妆品牌
2016/12/29 全球购物
德国机场停车位比较和预订网站:Ich-parke-billiger
2018/01/08 全球购物
中国领先的汽车保养服务平台:途虎养车
2019/10/18 全球购物
在C中是否有模拟继承等面向对象程序设计特性的好方法
2012/05/22 面试题
传统软件工程与面向对象的软件工程有什么区别
2012/05/31 面试题
机电专业个人自荐信格式模板
2013/09/23 职场文书
文案策划求职信
2014/04/14 职场文书
结婚保证书范文
2014/04/29 职场文书
公司爱心捐款倡议书
2014/05/14 职场文书
社区工作者个人总结
2015/02/28 职场文书
2015年医德医风工作总结
2015/04/02 职场文书
药品开票员岗位职责
2015/04/15 职场文书
介绍一下28个JS常用数组方法
2022/05/06 Javascript