Python量化投资:技术、模型与策略
上QQ阅读APP看书,第一时间看更新

7.2 数据周期变换

在进行数据分析的时候,我们经常需要选取不同时间周期的数据。比如,假设我们现在有1分钟周期的数据,需要合成15分钟,或者日线数据,那么这种情况可以使用Pandas自带的resample功能进行处理。

在TuShare上可以下载到5分钟数据。下面我们列举个示例,将5分钟数据转化为1小时数据。

首先是获取数据,示例代码如下:


df=ts.get_k_data('399300',ktype='5')
df.head()

得到的结果如图7-7所示。

图 7-7

Pandas提供了resample方法,可用于变换时间序列的周期。要想使用resample方法,首先必须要有datetime类型的index。这里date是字符串,我们需要将date转化为datetime类型,而且还要将其设为index,示例代码如下:


# 将字符串转化为datetime
df['date']=pd.to_datetime(df['date'])

# 设置date为index
df=df.set_index('date')

现在,我们要调用resample方法了。这里是将5分钟数据转为15分钟数据,相当于每三个数据点合并为一个。需要注意的时候,不同的数据,合并的方式是不一样的。比如,对于最高价high,我们要选择三个数据中的最大值作为新的最高价high。对于成交量volume,我们要将三个值加总,作为新的成交量volume。以下是转换代码:


df_new=pd.DataFrame()

# 将5分钟转化为15分钟数据,相当于将3个数据点合并为1个数据点
# 3个数据点中,取最前面的作为open
df_new['open']=df['open'].resample('15T').first()

# 3个数据点中,取最大的作为high
df_new['high']=df['high'].resample('15T').max()

# 3个数据点中,取最小的作为low
df_new['low']=df['low'].resample('15T').min()

# 3个数据点中,取最后的作为close
df_new['close']=df['close'].resample('15T').last()

# 3个数据点加总
df_new['volume']=df['volume'].resample('15T').sum()

在我们调用resample方法之后,会出现很多NaN值,如图7-8所示。

图 7-8

原因是resample是对所有的时间段都进行的,包括没有交易的时间段,当然,这个时间段是没有相应的数值的。

所以我们还需要删除NaN值,操作代码如下:


df_new=df_new.dropna()

这个时候,就完成了时间周期的转换。可通过如下代码得到最终结果:


df_new.head()

最终的结果如图7-9所示。

图 7-9