Python使用pyfinance包進(jìn)行證券收益分析
pyfinance簡(jiǎn)介
datasets.py :金融數(shù)據(jù)下載(基于request進(jìn)行數(shù)據(jù)爬蟲(chóng),有些數(shù)據(jù)由于外網(wǎng)受限已經(jīng)無(wú)法下載);
general.py:通用財(cái)務(wù)計(jì)算,例如主動(dòng)份額計(jì)算,收益分配近似值和跟蹤誤差優(yōu)化;
ols.py:回歸分析,支持pandas滾動(dòng)窗口回歸;
options.py:期權(quán)衍生品計(jì)算和策略分析;
returns.py:通過(guò)CAPM框架對(duì)財(cái)務(wù)時(shí)間序列進(jìn)行統(tǒng)計(jì)分析,旨在模擬FactSet Research Systems和Zephyr等軟件的功能,并提高了速度和靈活性;
utils.py:基礎(chǔ)架構(gòu)。
本文主要圍繞returns模塊,介紹pyfinance在證券投資分析中的應(yīng)用,后續(xù)將逐步介紹datasets、options、ols等模塊。
returns模塊應(yīng)用實(shí)例
pyfinance的安裝比較簡(jiǎn)單,直接在cmd(或anaconda prompt)上輸入"pip install pyfinance"即可。returns模塊主要以TSeries類(lèi)為主體(暫不支持dataframe),相當(dāng)于對(duì)pandas的Series進(jìn)行類(lèi)擴(kuò)展,使其實(shí)現(xiàn)更多功能,支持證券投資分析中基于CAMP(資本資產(chǎn)定價(jià)模型)框架的業(yè)績(jī)?cè)u(píng)價(jià)指標(biāo)計(jì)算。引用returns模塊時(shí),直接使用"from pyfinance import TSeries"即可。
下面以tushare為數(shù)據(jù)接口,先定義一個(gè)數(shù)據(jù)獲取函數(shù),在函數(shù)里對(duì)收益率數(shù)據(jù)使用TSeries進(jìn)行轉(zhuǎn)換,之后便可以直接使用TSeries類(lèi)的相關(guān)函數(shù)。
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()) #獲取中國(guó)平安數(shù)據(jù) tss=get_data('601318') #tss.head()
收益率計(jì)算
pyfinance的returns提供了年化收益率(anlzd_ret)、累計(jì)收益率(cuml_ret)和周期收益率(rollup)等,下面以平安銀行股票為例,計(jì)算收益率指標(biāo)。
#年化收益率 anl_ret=tss.anlzd_ret() #累計(jì)收益率 cum_ret=tss.cuml_ret() #計(jì)算周期收益率 q_ret=tss.rollup('Q') a_ret=tss.rollup('A') print(f'年化收益率:{anl_ret*100:.2f}%') print(f'累計(jì)收益率:{cum_ret*100:.2f}%') #print(f'季度收益率:{q_ret.tail().round(4)}') #print(f'歷年收益率:{a_ret.round(4)}')
輸出結(jié)果:
累計(jì)收益率:205.79%
年化收益率:12.24%
#可視化每個(gè)季度(年)收益率 from pyecharts import Bar attr=q_ret.index.strftime('%Y%m') v1=(q_ret*100).round(2).values bar=Bar('中國(guó)平安各季度收益率%')bar.add('',attr,v1,) bar
from pyecharts import Bar attr=a_ret.index.strftime('%Y') v1=(a_ret*100).round(2).values bar=Bar('中國(guó)平安歷年收益率%') bar.add('',attr,v1,is_label_show=True, is_splitline_show=False) bar
CAPM模型相關(guān)指標(biāo)
基于CAPM模型計(jì)算alpha、beta、回歸決定系數(shù)R2、t統(tǒng)計(jì)量和殘差項(xiàng)等。實(shí)際上主要使用了ols回歸,因此如果要獲得這些動(dòng)態(tài)的alpha和beta值,可以進(jìn)一步借助ols模塊的滾動(dòng)回歸函數(shù)(PandasRollingOLS)了,這將在后續(xù)推文介紹其應(yīng)用。
#以滬深300指數(shù)為基準(zhǔn) #為保證二者長(zhǎng)度一致,以中國(guó)平安的索引為準(zhǔn) 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統(tǒng)計(jì)量:{tstat_a:.2f}') print(f'beta :{beta:.4f},t統(tǒng)計(jì)量:{tstat_b:.2f}') print(f'回歸決定系數(shù)R2:{tss.rsq(benchmark):.3f}')
alpha:0.0004,t統(tǒng)計(jì)量:1.55
beta :1.0634,t統(tǒng)計(jì)量:60.09
回歸決定系數(shù)R2:0.606
風(fēng)險(xiǎn)指標(biāo)
風(fēng)險(xiǎn)指標(biāo)主要包括標(biāo)準(zhǔn)差和最大回撤。在計(jì)算標(biāo)準(zhǔn)差時(shí),注意需要修改默認(rèn)參數(shù),打開(kāi)pyfinance安裝包所在路徑,如果是安裝了Anaconda,進(jìn)入以下路徑:
c:\Anaconda3\Lib\site-packages\pyfinance,打開(kāi)returns源文件,找到anlzd_stdev和semi_stdev函數(shù),將freq默認(rèn)None改成250(一年的交易天數(shù))。
#年化標(biāo)準(zhǔn)差 a_std=tss.anlzd_stdev() #下行標(biāo)準(zhǔn)差 s_std=tss.semi_stdev() #最大回撤 md=tss.max_drawdown() print(f'年化標(biāo)準(zhǔn)差:{a_std*100:.2f}%') print(f'下偏標(biāo)準(zhǔn)差:{s_std*100:.2f}%') print(f'最大回撤差:{md*100:.2f}%')
年化標(biāo)準(zhǔn)差:31.37%
下偏標(biāo)準(zhǔn)差:0.43%
最大回撤差:-45.76%
下偏標(biāo)準(zhǔn)差主要是為解決收益率分布的不對(duì)稱(chēng)問(wèn)題,當(dāng)收益率函數(shù)分布左偏的情況下,使用正態(tài)分布會(huì)低估風(fēng)險(xiǎn),因此使用傳統(tǒng)夏普比率分母使用全樣本標(biāo)準(zhǔn)差進(jìn)行估計(jì)不太合適,應(yīng)使用收益對(duì)無(wú)風(fēng)險(xiǎn)投資收益的偏離。
基準(zhǔn)比較指標(biāo)
基準(zhǔn)比較指標(biāo)是需要指定一個(gè)基準(zhǔn)(benchmark),如將滬深300指數(shù)作為中國(guó)平安個(gè)股的基準(zhǔn)進(jìn)行比較分析。
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'比基準(zhǔn)收益高的時(shí)間占比:{bat*100:.2f}%') print(f'上行期與基準(zhǔn)收益比:{uc*100:.2f}%') print(f'下行期與基準(zhǔn)收益比:{dc*100:.2f}%') print(f'上行期與下行期比:{tc*100:.2f}%') print(f'個(gè)股下行(收益負(fù))時(shí)間占比:{pct_neg*100:.2f}%') print(f'個(gè)股上行(收益正)時(shí)間占比:{pct_pos*100:.2f}%')
比基準(zhǔn)收益高的時(shí)間占比:47.83%
上行期與基準(zhǔn)收益比:111.70%
下行期與基準(zhǔn)收益比:105.32%
上行期與下行期比:106.06%
個(gè)股下行(收益負(fù))時(shí)間占比:48.94%
個(gè)股上行(收益正)時(shí)間占比:50.00%
此外,信息比率和特雷諾指數(shù)是兩個(gè)常用的基準(zhǔn)比較評(píng)價(jià)指標(biāo),特別是用于對(duì)基金產(chǎn)品或投資組合的業(yè)績(jī)進(jìn)行量化評(píng)價(jià)。
信息比率(information ratio):以馬克維茨的均值方差模型為基礎(chǔ),衡量超額風(fēng)險(xiǎn)所帶來(lái)的超額收益,表示單位主動(dòng)風(fēng)險(xiǎn)所帶來(lái)的超額收益。IR=α ∕ ω (α為組合的超額收益,ω為主動(dòng)風(fēng)險(xiǎn)),分子α為真實(shí)預(yù)期收益率與定價(jià)模型所計(jì)算出的收益率的差,分母為殘差風(fēng)險(xiǎn)即殘差項(xiàng)的標(biāo)準(zhǔn)差。
特雷諾指數(shù)(Treynor ratio):衡量單位風(fēng)險(xiǎn)的超額收益,計(jì)算公式為:TR=(Rp―Rf)/βp,其中:TR表示特雷諾業(yè)績(jī)指數(shù),Rp表示某投資組合平均收益率,Rf為平均無(wú)風(fēng)險(xiǎn)利率,βp表示某投資組合的系統(tǒng)風(fēng)險(xiǎn)。
ir=tss.info_ratio(benchmark) tr=tss.treynor_ratio(benchmark) print(f'信息比率:{ir:.3f}') print(f'特雷諾指數(shù):{tr:.3f}')
信息比率:0.433
特雷諾指數(shù):0.096
風(fēng)險(xiǎn)調(diào)整收益指標(biāo)
風(fēng)險(xiǎn)調(diào)整收益率指標(biāo)比較常用的有夏普比率(sharpe ratio)、索提諾比率(sortino ratio)和卡瑪比率(calmar ratio),這三個(gè)指標(biāo)都是風(fēng)險(xiǎn)調(diào)整后收益比率,因此分子都是收益指標(biāo),分母都是風(fēng)險(xiǎn)指標(biāo)。
- 夏普比率(Sharpe Ratio):風(fēng)險(xiǎn)調(diào)整后的收益率,計(jì)算公式:=[E(Rp)-Rf]/σp,其中E(Rp):投資組合預(yù)期報(bào)酬率,Rf:無(wú)風(fēng)險(xiǎn)利率,σp:投資組合的標(biāo)準(zhǔn)差。計(jì)算投資組合每承受一單位總風(fēng)險(xiǎn),會(huì)產(chǎn)生多少的超額報(bào)酬。
- 索提諾比率(Sortino Ratio):與夏普比率思路一致,核心在于分母應(yīng)用了下行波動(dòng)率概念(Downside Risk),計(jì)算標(biāo)準(zhǔn)差的時(shí)候,不采用均值,而是一個(gè)設(shè)定的可接受最小收益率(r_min),收益率序列中,超出這個(gè)最小收益率的收益距離按照0計(jì)算,低于這個(gè)收益率的平方距離累積,這樣標(biāo)準(zhǔn)差就變成了半個(gè)下行標(biāo)準(zhǔn)差。對(duì)應(yīng)的,索提諾比率的分子也采用策略收益超出最低收益的部分。與夏普比率相比,索提諾比率更看重對(duì)(左)尾部的預(yù)期損失分析,而夏普比率則是對(duì)全體樣本進(jìn)行分析。
- Calmar比率(Calmar Ratio) :描述收益和最大回撤之間的關(guān)系,計(jì)算方式為年化收益率與歷史最大回撤之間的比率。Calmar比率數(shù)值越大,投資組合業(yè)績(jī)表現(xiàn)越好。
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
綜合業(yè)績(jī)?cè)u(píng)價(jià)指標(biāo)分析實(shí)例
下面將上述常用指標(biāo)進(jìn)行綜合,并獲取多只個(gè)股進(jìn)行比較分析。
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['累計(jì)收益率']=tss.cuml_ret() #alpha和beta dd['alpha']=tss.alpha(benchmark) dd['beta']=tss.beta(benchmark) #風(fēng)險(xiǎn)指標(biāo) #年化標(biāo)準(zhǔn)差 dd['年化標(biāo)準(zhǔn)差']=tss.anlzd_stdev() #下行標(biāo)準(zhǔn)差 dd['下行標(biāo)準(zhǔn)差']=tss.semi_stdev() #最大回撤 dd['最大回撤']=tss.max_drawdown() #信息比率和特雷諾指數(shù) dd['信息比率']=tss.info_ratio(benchmark) dd['特雷納指數(shù)']=tss.treynor_ratio(benchmark) #風(fēng)險(xiǎn)調(diào)整收益率 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
獲取多只個(gè)股(也構(gòu)建投資組合)數(shù)據(jù),對(duì)比評(píng)估業(yè)績(jī)?cè)u(píng)價(jià)指標(biāo):
#獲取多只股票數(shù)據(jù) df=pd.DataFrame(index=performance('601318').index) stocks={'中國(guó)平安':'601318','貴州茅臺(tái)':'600519',\ '海天味業(yè)':'603288','格力電器':'000651',\ '萬(wàn)科A':'00002','比亞迪':'002594',\ '云南白藥':'000538','雙匯發(fā)展':'000895',\ '海爾智家':'600690','青島啤酒':'600600'} for name,code in stocks.items(): try: df[name]=performance(code).values except: continue d
結(jié)語(yǔ)
pyfinance主要為證券投資管理和績(jī)效評(píng)價(jià)指標(biāo)而設(shè)計(jì)的python包,對(duì)于考CFA和FRM的讀者相當(dāng)實(shí)用。實(shí)際上,pyfinance的returns模塊是對(duì)pandas的Series類(lèi)進(jìn)行了擴(kuò)展,從而支持證券投資收益分析和績(jī)效評(píng)價(jià)。Python是建立在各種輪子上(module)的“膠水”語(yǔ)言,因此善于借用已有的包進(jìn)行計(jì)算和編程,可以提高效率,減少自己“造輪子”的時(shí)間和精力。本文主要介紹了pyfinance中returns模塊的應(yīng)用,其他模塊的應(yīng)用將在后續(xù)推文中進(jìn)行介紹。
技術(shù)交流
歡迎轉(zhuǎn)載、收藏、有所收獲點(diǎn)贊支持一下!
到此這篇關(guān)于Python使用pyfinance包進(jìn)行證券收益分析的文章就介紹到這了,更多相關(guān)Python pyfinance包內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Pandas數(shù)據(jù)連接pd.concat的實(shí)現(xiàn)
本文主要介紹了Pandas數(shù)據(jù)連接pd.concat的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07python機(jī)器學(xué)習(xí)案例教程——K最近鄰算法的實(shí)現(xiàn)
本篇文章主要介紹了python機(jī)器學(xué)習(xí)案例教程——K最近鄰算法的實(shí)現(xiàn),詳細(xì)的介紹了K最近鄰算法的概念和示例,具有一定的參考價(jià)值,有興趣的可以了解一下2017-12-12python中的psutil模塊詳解(cpu、內(nèi)存、磁盤(pán)情況、結(jié)束指定進(jìn)程)
這篇文章主要介紹了python中的psutil(cpu、內(nèi)存、磁盤(pán)情況、結(jié)束指定進(jìn)程),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04python讀取word 中指定位置的表格及表格數(shù)據(jù)
這篇文章主要介紹了python讀取word 中指定位置的表格及表格數(shù)據(jù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2019-10-10Python OpenCV實(shí)現(xiàn)攝像頭人臉識(shí)別功能
這篇文章主要介紹了Python OpenCV實(shí)現(xiàn)攝像頭人臉識(shí)別,使用Python 3和OpenCV進(jìn)行攝像頭人臉識(shí)別的基本步驟,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07Django 過(guò)濾器匯總及自定義過(guò)濾器使用詳解
這篇文章主要介紹了Django 過(guò)濾器匯總及自定義過(guò)濾器使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07pytorch的梯度計(jì)算以及backward方法詳解
今天小編就為大家分享一篇pytorch的梯度計(jì)算以及backward方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01簡(jiǎn)單談?wù)刾ython中的語(yǔ)句和語(yǔ)法
下面小編就為大家?guī)?lái)一篇簡(jiǎn)單談?wù)刾ython中的語(yǔ)句和語(yǔ)法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08