【量化分析】Resample

一些量化分析中遇到的一些实际问题与处理方法,而工具则主围绕着pandas这个金融数据处理利器package,这次我想先说说resample的功效。

首先让我们来看一个dataframe,这个dataframe很简单,index是时间,columns是price和volume:

 

 

可以看到该dataframe的时间分布式不均匀的,然而很多统计分析建模都是需要时间均匀间隔的数据的,好在pandas为我们提供了resample这一函数可以解决这一问题。比如如果我们想要洗成1min频率的数据我们就可以这样做:

df = df.resample('60S').last()

 

可以看到经过resample函数的重新抽样,新的dataframe已经变成了等间距的分钟级别数据。其中last()表示使用每个分钟段区间内的最后一个数据作为该分钟最终显示的数据,如果该分钟内没有任何数据则会显示NaN,比如2014-12-07 00:02:00。除了last之外,还有first,mean,sum等等。

但是,从新的dataframe中我们还是可以观察出两个问题,第一,原dataframe的第一个记录是00:00:07,然而这个数据却被自动附到了新dataframe中00:00:00的index上。而事实上在00:00:00时刻,我们并不知道00:00:07发生了什么。第二,对于volume而言一般不应该使用last而应该是用sum函数,代表了这个时间段内的总的交易量,会更有意义。

所以我们可以重新写我们的resample函数如下:

price = df['price].resample('60S', label = 'right').

last()volume = df['price].resample('60S', label = 'right').sum()

df = pd.concat([price, volume], axis = 1)

在这段代码里,首先我们通过设置label的参数去解决第一个问题。在resample函数里,label默认值是left,也就是把一个区间内的数据的计算结果都附到区间左侧端点上,而我们想要的则是相反的情况,也就是label = right。其次,我们通过将price和volume分开处理,price使用last,volume则使用sum函数,达到了更合理的处理效果。最后,我们用concat函数将两个Series合并,就得到了如下结果:

这次看起来就合理多了。

最后,我们还可以利用apply和lambda函数计算每一分钟的VWAP,也就是每分钟交易量加权的价格,代码如下:

df.resample('60S', label = 'right').apply(lambda x:np.average(x['price'] ,weights = x['volume']) if sum(x['volume']) != 0 else np.average(x['price']))[['price']]

可以看到,我们用到了numpy里的average函数帮我们计算weighted average,其中weights就是每个时间区段内的所有volume数据。后面我们为了避免错误加了一个判读:如果这个区间内volume加和等于0,也即没有数据我们就直接返回价格平均值(实际上也只会返回NaN)。最后由于resample函数返回的dataframe中price和volume都被附上了新的VWAP值,所以我们通过下标只选择price这一列数据,多用一个中括号是为了索引后得到的仍旧是一个dataframe,打印比较美观。

 

 

你可能感兴趣的:(【量化分析】Resample)