2016-08-20 81 views
3

我正在計算股票系列的下跌時間和恢復時間。我可以計算跌幅,但我正在努力達到每個跌幅的持續時間和恢復時間。到目前爲止,我有這樣的代碼:大熊貓的持續時間縮短

import pandas as pd 
import pickle 
import xlrd 
import numpy as np 

np.random.seed(0) 
df = pd.Series(np.random.randn(2500)*0.7+0.05, index=pd.date_range('1/1/2000', periods=2500, freq='D')) 
df= 100*(1+df/100).cumprod() 
df=pd.DataFrame(df) 
df.columns = ['close'] 
df['ret'] = df.close/df.close[0] 
df['modMax'] = df.ret.cummax() 
df['modDD'] = 1-df.ret.div(df['modMax']) 
groups = df.groupby(df['modMax']) 
dd = groups['modMax','modDD'].apply(lambda g: g[g['modDD'] == g['modDD'].max()]) 
top10dd = dd.sort_values('modDD', ascending=False).head(10) 
top10dd 

這使該系列的10次最高提款,但我也希望縮編和恢復時間的持續時間。

+0

我不知道你的代碼是如何計算消落 - 也許我們有不同的定義。對於任何系列「ser」,我的最大回撤(實際價格點)爲(ser-ser.expanding().max())。min() – alex314159

+0

dd以百分比計算。 – pdoak

+2

看到這個問題和鏈接的問題http://stackoverflow.com/a/36848867/2336654。這個帖子是關於主動下降的,但是可以通過假設基準收益爲零來應用於絕對下降。 – piRSquared

回答

1

我解決了這個問題,如下所示:

def drawdown_group(df,index_list): 
    group_max,dd_date = index_list 
    ddGroup = df[df['modMax'] == group_max] 
    group_length = len(ddGroup) 
    group_dd = ddGroup['dd'].max() 
    group_dd_length = len(ddGroup[ddGroup.index <= dd_date]) 
    group_start = ddGroup[0:1].index[0] 
    group_end = ddGroup.tail(1).index[0] 
    group_rec = group_length - group_dd_length 
    #print (group_start,group_end,group_dd,dd_date,group_dd_length,group_rec,group_length) 
    return group_start,group_end,group_max,group_dd,dd_date,group_dd_length,group_rec,group_length 

dd_col = ('start','end','peak', 'dd','dd_date','dd_length','dd_rec','tot_length') 
df_dd = pd.DataFrame(columns = dd_col) 
for i in range(1,10): 
    index_list = top10dd[i-1:i].index.tolist()[0] 
    #print(index_list) 
    start,end,peak,dd,dd_date,dd_length,dd_rec,tot_length = drawdown_group(df,index_list) 
    #print(start,end,dd,dd_date,dd_length,dd_rec,tot_length) 
    df_dd.loc[i-1] = drawdown_group(df,index_list) 

產生以下表格: enter image description here