这篇教程Python使用pyfinance包进行证券收益分析写得很实用,希望能帮到您。
pyfinance简介datasets.py :金融数据下载(基于request进行数据爬虫,有些数据由于外网受限已经无法下载); general.py:通用财务计算,例如主动份额计算,收益分配近似值和跟踪误差优化; ols.py:回归分析,支持pandas滚动窗口回归; options.py:期权衍生品计算和策略分析; returns.py:通过CAPM框架对财务时间序列进行统计分析,旨在模拟FactSet Research Systems和Zephyr等软件的功能,并提高了速度和灵活性; utils.py:基础架构。 
本文主要围绕returns模块,介绍pyfinance在证券投资分析中的应用,后续将逐步介绍datasets、options、ols等模块。
returns模块应用实例pyfinance的安装比较简单,直接在cmd(或anaconda prompt)上输入"pip install pyfinance"即可。returns模块主要以TSeries类为主体(暂不支持dataframe),相当于对pandas的Series进行类扩展,使其实现更多功能,支持证券投资分析中基于CAMP(资本资产定价模型)框架的业绩评价指标计算。引用returns模块时,直接使用"from pyfinance import TSeries"即可。 
下面以tushare为数据接口,先定义一个数据获取函数,在函数里对收益率数据使用TSeries进行转换,之后便可以直接使用TSeries类的相关函数。 import pandas as pd import numpy as npfrom pyfinance import TSeriesimport tushare as tsdef 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 Barattr=q_ret.index.strftime('%Y%m')v1=(q_ret*100).round(2).valuesbar=Bar('中国平安各季度收益率%')bar.add('',attr,v1,)bar 
from pyecharts import Barattr=a_ret.index.strftime('%Y')v1=(a_ret*100).round(2).valuesbar=Bar('中国平安历年收益率%')bar.add('',attr,v1,is_label_show=True, is_splitline_show=False)bar
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/dcpct_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=α Python性能调优的十个小技巧总结 Python面向对象三大特征 封装、继承、多态 |