Python量化分析实战:使用pyfinance进行证券收益与绩效评估

Ryan
Ryan
发布时间:2026-10-15| 2人浏览过
原创

本文详细介绍Python量化金融包pyfinance的核心功能,重点解析returns模块在证券收益分析中的应用。通过实战案例演示如何计算年化与累计收益率、基于CAPM模型评估Alpha/Beta值,以及利用夏普、索提诺等比率进行风险调整后收益分析,为CFA/FRM考生及量化投资者提供高效工具。

pyfinance简介

在探索Python实现滚动回归的方法时,发现了一款极具价值的量化金融工具——pyfinance。正如其名,pyfinance是专为投资管理与证券收益分析设计的Python库,旨在补充现有的定量金融生态,如pyfolio和pandas等主流库。

pyfinance包含六个模块

datasets.py:负责金融数据下载,基于requests库进行爬虫操作(注:部分因外网限制的数据源可能已无法访问);

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功能,增加了更多针对证券投资分析的特性,特别是基于CAPM框架的业绩评价指标计算。使用时,直接导入“from pyfinance import TSeries”即可调用。

下文以tushare为数据接口,首先定义一个数据获取函数。在该函数内部,将收益率数据转换为TSSeries对象,随后即可直接利用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


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

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

风险指标

风险指标主要涵盖标准差和最大回撤。在计算标准差时,需注意修改默认参数。若使用Anaconda环境,需进入pyfinance安装包路径:

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

结语

pyfinance是专为证券投资管理和绩效评价指标设计的Python库,对于备考CFA和FRM的读者尤为实用。实际上,pyfinance的returns模块扩展了pandas的Series类,从而支持证券投资收益分析和绩效评价。Python作为建立在各种模块(module)之上的“胶水”语言,善于借用现有包进行计算和编程,能显著提高效率,减少“造轮子”的时间和精力。

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

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。