日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

python获取时间周数_【手把手教你】Python量化策略风险指标

發(fā)布時間:2025/3/20 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python获取时间周数_【手把手教你】Python量化策略风险指标 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

如何衡量一個量化策略的好壞?一是比較穩(wěn)定的收益,二是有嚴謹?shù)幕販y,三是有清晰的邏輯。——劉富兵

引言

引言盡管過去不能代表未來,通過歷史回測來評估量化策略仍然是量化投資非常重要的一環(huán)。量化回測過程中常用到的指標有年化收益率、最大回撤、beta、alpha、夏普比率、信息比率等(見下圖)。目前很多量化網(wǎng)站都能提供Python的量化回測框架,如聚寬 、優(yōu)礦、萬礦、Zipline 、vnpy 和pyalgotrade等,為我們評估量化策略提供了很好的交互平臺。畢竟平臺的使用有其局限性,如果不借助平臺, 如何使用python寫一個簡單的量化回測框架呢?本文將一步一步為你展示如何使用python計算量化策略風險指標。文中提及股票僅供學習示例,不構成投資建議。

(數(shù)據(jù)來源:優(yōu)礦·通聯(lián)實驗室)

01指標含義及公式

01累計收益率與年化收益率

年化收益率是把當前收益率(日收益率、周收益率、月收益率)換算成年收益率來計算的,是一種理論收益率,并不是真正的已取得的收益率。因為年化收益率是變動的,所以年收益率不一定和年化收益率相同。

累計收益率:

其中,PT是期末賣出時的價格,Pt是期初買入時的價格。

年化收益率:

其中,R是期間總收益率,m是與n(可以是天數(shù)、周數(shù)、月數(shù))相對應的計算周期,根據(jù)計算慣例,m=250、52、12分別指代日、周、月向年化的轉(zhuǎn)換。

02最大回撤

在選定周期內(nèi)任一歷史時點往后推,于最低點時的收益率回撤幅度的最大值。最大回撤用來描述可能出現(xiàn)的最糟糕的情況。最大回撤是一個重要的風險指標,對于量化策略交易,該指標比波動率還重要。
P為某一天的凈值,i為某一天,j為i后的某一天,Pi為第i天的產(chǎn)品凈值,Pj則是Pi后面某一天的凈值
則該基金的最大回撤計算如下:

即通過對每一個凈值進行回撤率求值,然后找出最大的。

03Beta和Alpha

Beta:相當于業(yè)績評價基準收益的總體波動性,計算如下:

Pi和Pm分別指代個股(組合)、市場(如上證綜指)的收益率序列,beta值也常被用來衡量某一策略的系統(tǒng)性風險。

其含義可以簡單理解為:如果Beta為1,策略和市場(如滬深300指數(shù))波動相同;如果Beta大于1,策略波動大于市場,如2,則市場上漲10%時,策略上漲20%;反之亦然。如果Beta小于1,則策略波動小于市場,如為0.8,市場上漲10%時,策略上漲8%;反之亦然。

Beta值如何看呢?這得具體問題具體分析,如果是牛市,個股、大盤狂漲,Beta值大的策略占優(yōu);如果是熊市,Beta值小的策略占優(yōu)。

Alpha:實際收益和按照Beta系數(shù)計算的期望收益之間的差額。代表策略多大程度上跑贏了預期的收益率。

可以使用資本資產(chǎn)定價模型(CAPM)來估計策略的beta和alpha的值:

E(ri)是股票i的預期收益率,rf是無風險利率,rm是市場指數(shù)收益率;beta系數(shù)在評估股市波動風險與投資機會的方法中,常用來衡量結(jié)構性與系統(tǒng)性風險,可以簡單理解為個股波動相對大盤波動的偏離程度。CAPM的計量模型可以表示為:

alpha可以理解為超額收益率,最后一項是隨機擾動,可以理解為個體風險。

04夏普比率和信息比率

夏普比率代表每多承擔一份風險,可以獲得幾份回報,即單位風險所獲得的超額回報,該比率越高,策略承擔單位風險得到的超額回報越高,所以夏普比率越高越好。

其中,Rp為策略年化收益率,Rf是無風險收益率,

為年化標準差。

信息比率:含義與夏普比率類似,只不過其參照基準不是無風險收益率,而是策略的市場基準收益率。

其中,Rp為策略年化收益率,Rm為基準年化收益率(如滬深300指數(shù)),

為策略與基準每日收益率差值的年化標準差。

02Python計算量化指標

使用tushare獲取交易數(shù)據(jù),考慮最簡單的策略:買入持有!分別計算期間總收益率,年化收益率,最大回撤,beta、alpha系數(shù),夏普比率和信息比率。

#先引入后面可能用到的包(package) import pandas as pd import numpy as np import matplotlib.pyplot as plt %matplotlib inline #正常顯示畫圖時出現(xiàn)的中文和負號 from pylab import mpl mpl.rcParams['font.sans-serif']=['SimHei'] mpl.rcParams['axes.unicode_minus']=False### 獲取數(shù)據(jù):tushare開源庫(確認已安裝好:pip install tushare) import tushare as ts #起始和結(jié)束日期可以自行輸入,否則使用默認 def get_data(code,start_date="2009-01-01", end_date="2019-01-18"):df = ts.get_k_data(code, start=start_date, end=end_date)df.index=pd.to_datetime(df.date)return df.close #返回收盤價#以上證綜指、貴州茅臺、工商銀行、中國平安為例 stocks={'sh':'上證綜指','600519':'貴州茅臺','601398':'工商銀行','601318':'中國平安'} #獲取上述股票(指數(shù))的每日前復權收盤價 df=pd.DataFrame() for code,name in stocks.items():df[name]=get_data(code)#以第一交易日2009年1月5日收盤價為基點,計算凈值df_new=df/df.iloc[0] #將上述股票在回測期間內(nèi)的凈值可視化 df_new.plot(figsize=(16,7)) #圖標題 plt.title('股價凈值走勢',fontsize=15) #設置x軸坐標 my_ticks = pd.date_range('2008-01-01','2019-01-18',freq='Y') plt.xticks(my_ticks,fontsize=12) #去掉上、右圖的線 ax=plt.gca() ax.spines['right'].set_color('none') ax.spines['top'].set_color('none') plt.show()

1累計收益率和年化收益率

收益率可以根據(jù)上面公式計算,或使用對數(shù)收益率,下面直接根據(jù)上面的累計凈值來推出累計收益率(累計凈值-1)。

### 區(qū)間累計收益率(絕對收益率) total_ret=df_new.iloc[-1]-1 TR=pd.DataFrame(total_ret.values,columns=['累計收益率'],index=total_ret.index) TR#定義成函數(shù),減少重復工作 def max_drawdown(df):md=((df.cummax()-df)/df.cummax()).max()return round(md,4) md={} for code,name in stocks.items():md[name]=max_drawdown(df[name]) #最大回撤率結(jié)果: MD=pd.DataFrame(md,index=['最大回撤']).T MD

3alpha和beta

#計算每日收益率 #收盤價缺失值(停牌),使用前值代替 rets=(df.fillna(method='pad')).apply(lambda x:x/x.shift(1)-1)[1:] rets.head()#市場指數(shù)為x,個股收益率為y from scipy import stats x=rets.iloc[:,0].values y=rets.iloc[:,1:].values AB=pd.DataFrame() alpha=[] beta=[] for i in range(3): #使用scipy庫中的stats.linregress線性回歸 #python回歸有多種實現(xiàn)方式, #如statsmodels.api的OLS,sklearn庫等等b,a,r_value,p_value,std_err=stats.linregress(x,y[:,i])#alpha轉(zhuǎn)化為年化alpha.append(round(a*250,3))beta.append(round(b,3)) AB['alpha']=alpha AB['beta']=beta AB.index=rets.columns[1:] #輸出結(jié)果: AB

#使用公式法直接計算beta值(見前文公式): beta1=rets[['上證綜指','貴州茅臺']].cov().iat[0,1]/rets['上證綜指'].var() beta2=rets[['上證綜指','工商銀行']].cov().iat[0,1]/rets['上證綜指'].var() beta3=rets[['上證綜指','中國平安']].cov().iat[0,1]/rets['上證綜指'].var() print(f'貴州茅臺beta:{round(beta1,3)}') print(f'工商銀行beta:{round(beta2,3)}') print(f'中國平安beta:{round(beta3,3)}')#輸出結(jié)果:貴州茅臺beta:0.637 工商銀行beta:0.614 中國平安beta:1.071#使用公式法直接計算beta值(見前文公式): #annual_ret是前文計算出來的年化收益率 alpha1=(annual_ret[1]-annual_ret[0]*beta1) alpha2=(annual_ret[2]-annual_ret[0]*beta2) alpha3=(annual_ret[3]-annual_ret[0]*beta3) print(f'貴州茅臺alpha:{round(alpha1,3)}') print(f'工商銀行alpha:{round(alpha2,3)}') print(f'中國平安alpha:{round(alpha3,3)}')#輸出結(jié)果:貴州茅臺alpha:0.244 工商銀行alpha:0.077 中國平安alpha:0.138

4夏普比率和信息比率

#超額收益率以無風險收益率為基準 #假設無風險收益率為年化3% exReturn=rets-0.03/250 #計算夏普比率 sharperatio=np.sqrt(len(exReturn))*exReturn.mean()/exReturn.std() #夏普比率的輸出結(jié)果 SHR=pd.DataFrame(sharperatio,columns=['夏普比率']) SHR

###信息比率 #超額收益率以指數(shù)收益率或其他為基準 #這里以上證綜指為基準 ex_return=pd.DataFrame() ex_return['貴州茅臺']=rets.iloc[:,1]-rets.iloc[:,0] ex_return['工商銀行']=rets.iloc[:,2]-rets.iloc[:,0] ex_return['中國平安']=rets.iloc[:,3]-rets.iloc[:,0]a#計算信息比率 information=np.sqrt(len(ex_return))*ex_return.mean()/ex_return.std() #信息比率的輸出結(jié)果 INR=pd.DataFrame(information,columns=['信息比率']) INR

將上述指標合并成一張表,不難看出,在回測期間內(nèi)(2009年01月01日至2019月01月18日期間),貴州茅臺各項指標表現(xiàn)非常出色,其實貴州茅臺近幾年業(yè)績表現(xiàn)非常優(yōu)秀,每股收益在整個A股中是最高的。但是,其最大回撤卻高達53.3%,意味著如果是在這期間的高點買入的,中間可能出現(xiàn)浮虧53.3%,要上漲114%才能回本,長期投資還真不是普通人心理能承受的。indicators=pd.concat([TR,AR,MD,AB,SHR,INR],axis=1,join='outer',sort='False') #結(jié)果保留三位小數(shù) indicators.round(3)

定義一個函數(shù)plot_max_drawdown(),對上述歷史回撤的收益和風險指標進行可視化,函數(shù)代碼相當于整合了上述計算過程,由于篇幅所限,此處省略。#貴州茅臺買入持有策略回測可視化 plot_max_drawdown(df,'貴州茅臺')

#工商銀行買入持有策略回測可視化 plot_max_drawdown(df,'工商銀行')

#中國平安買入持有策略回測可視化 plot_max_drawdown(df,'中國平安')

總結(jié)

以上是生活随笔為你收集整理的python获取时间周数_【手把手教你】Python量化策略风险指标的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。