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中的localtime()方法使用详解
May 22 Python
python实现汉诺塔递归算法经典案例
Mar 01 Python
使用python将mysql数据库的数据转换为json数据的方法
Jul 01 Python
python点击鼠标获取坐标(Graphics)
Aug 10 Python
pytorch 获取层权重,对特定层注入hook, 提取中间层输出的方法
Aug 17 Python
python使用if语句实现一个猜拳游戏详解
Aug 27 Python
基于Pycharm加载多个项目过程图解
Jan 19 Python
Python 安装 virturalenv 虚拟环境的教程详解
Feb 21 Python
python matplotlib 绘图 和 dpi对应关系详解
Mar 14 Python
无惧面试,带你搞懂python 装饰器
Aug 17 Python
Python爬虫抓取论坛关键字过程解析
Oct 19 Python
浅谈Python数学建模之固定费用问题
Jun 23 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 3行代码的分页算法(求起始页和结束页)
2009/10/21 PHP
PHP加密扩展库Mcrypt安装和实例
2013/11/10 PHP
使用php测试硬盘写入速度示例
2014/01/27 PHP
php中$美元符号与Zen Coding冲突问题解决方法分享
2014/05/28 PHP
Javascript 跨域访问解决方案
2009/02/14 Javascript
jquery select选中的一个小问题
2009/10/11 Javascript
浏览器常用高宽的jquery插件
2011/02/24 Javascript
潜说js对象和数组
2011/05/25 Javascript
浅析jQuery中常用的元素查找方法总结
2013/07/04 Javascript
单击复制文字兼容各浏览器的完美解决方案
2013/07/04 Javascript
jquery实现平滑的二级下拉菜单效果
2015/08/26 Javascript
jQuery实现ajax调用WCF服务的方法(附带demo下载)
2015/12/04 Javascript
jquery中ajax跨域方法实例分析
2015/12/18 Javascript
Angular1.x复杂指令实例详解
2017/03/01 Javascript
javascript  删除select中的所有option的实例
2017/09/17 Javascript
webgl实现物体描边效果的方法介绍
2019/11/27 Javascript
Vue.directive 实现元素scroll逻辑复用
2019/11/29 Javascript
基于vue hash模式微信分享#号的解决
2020/09/07 Javascript
js实现简易计算器小功能
2020/11/18 Javascript
[02:35]DOTA2英雄基础教程 狙击手
2014/01/14 DOTA
[35:27]完美世界DOTA2联赛循环赛 GXR vs FTD BO2第二场 10.29
2020/10/29 DOTA
浅谈Python中copy()方法的使用
2015/05/21 Python
Python中的下划线详解
2015/06/24 Python
python 读写中文json的实例详解
2017/10/29 Python
python爬虫框架scrapy实现模拟登录操作示例
2018/08/02 Python
python笔记之mean()函数实现求取均值的功能代码
2019/07/05 Python
Django实现发送邮件找回密码功能
2019/08/12 Python
Python连接Impala实现步骤解析
2020/08/04 Python
DVF官方网站:美国时装界尊尚品牌
2017/08/29 全球购物
来自南加州灵感的工作和娱乐服装:TravisMathew
2019/05/01 全球购物
Sisley法国希思黎中国官网:享誉全球的奢华植物美容品牌
2019/06/30 全球购物
党员批评与自我批评(5篇)
2014/09/23 职场文书
2015年保管员工作总结
2015/04/30 职场文书
教师培训简讯
2015/07/20 职场文书
体育部部长竞选稿
2015/11/21 职场文书
Django中的JWT身份验证的实现
2021/05/07 Python