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 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
風險指標
風險指標主要包括標準差和最大回撤。在計算標準差時,註意需要修改默認參數,打開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
結語
pyfinance主要為證券投資管理和績效評價指標而設計的python包,對於考CFA和FRM的讀者相當實用。實際上,pyfinance的returns模塊是對pandas的Series類進行瞭擴展,從而支持證券投資收益分析和績效評價。Python是建立在各種輪子上(module)的“膠水”語言,因此善於借用已有的包進行計算和編程,可以提高效率,減少自己“造輪子”的時間和精力。本文主要介紹瞭pyfinance中returns模塊的應用,其他模塊的應用將在後續推文中進行介紹。
技術交流
歡迎轉載、收藏、有所收獲點贊支持一下!
到此這篇關於Python使用pyfinance包進行證券收益分析的文章就介紹到這瞭,更多相關Python pyfinance包內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- python機器學習邏輯回歸隨機梯度下降法
- 超詳細註釋之OpenCV構建透明的疊加層
- 利用Python分析一下最近的股票市場
- pandas數據的合並與拼接的實現
- 詳解K8S apiVersion對照表