手记

如何利用Pandas对交易所行情数据进行周期的转换

如何利用Pandas对交易所行情数据进行周期的转换

交易所行情数据主要是开盘时间、开盘价、最高价、最低价、收盘价以及成交量。我们往往从交易所获取的数据时分钟的数据,这样我们可以把分钟的数据根据需求转换成不同周期的数据。

比如我们在数字货币量化策略中,我们可能根据15分钟的周期产生的信号进行买卖,那么我们可以可以把分钟级别的数据转换成15分钟的数据。如果你是做中长期的策略分析,那么你的策略入场或者出场的信号,你可以设定为4小时的交易新号,那么你可以根据1分钟的数据转换成4小时的数据,或者通过1小时周期的数据转换成4小时周期的数据。但是周期转换我们只能把较小周期的数据转换成大的时间周期的数据,例如从分钟的数据转成小时的数据时没有问题的,但是你不能把小时的数据转换成分钟的数据。

那么我们如何进行周期的转换呢? 主要有两种方法,一种是通过对Series数据进行转换,另外一种是通过DataFrame直接进行数据转换。

我们先看第一种:基于Series进行转换

import pandas as pd  # 导入pandas处理库
pd.set_option('expand_frame_repr', False)

df = pd.read_csv('binance_btc_1min.csv')   # 读取文件
# print(df)
# print(df.dtypes)

df['open_time'] = pd.to_datetime(df['open_time'])   # 把open_time列数据换成datatime数据
# print(df.dtypes)
# print(df)

# df['open_time'] >= pd.to_datetime('2019-06-07 15:00:00')
df = df[df['open_time'] >= pd.to_datetime('2019-06-07 15:00:00')]  # 筛选时间周期的 df['open_time'] >= pd.to_datetime('2019-06-07 15:00:00')
# print(df)
#
# exit()

# 第一种方法,通过Series进行转换.
# 将时间周期相关的列设置为索引index
df.set_index('open_time', inplace=True)
# 周期转换方法:resample
rule_cycle = '5T'  # rule_cycle='5T':意思是5分钟,意味着转变为5分钟数据  # 15T  1H  1D 一天

cycle_df = pd.DataFrame()  # 初始化一个空的DataFrame,用户接收新的数据.
cycle_df['close'] = df['close'].resample(rule=rule_cycle).last()  # last:取这5分钟的最后一行数据
# # 开、高、低的价格,成交量
cycle_df['open'] = df['open'].resample(rule=rule_cycle).first()  # 五分钟内的第一个值就是开盘价
cycle_df['high'] = df['high'].resample(rule=rule_cycle).max()  # 五分钟内的最高价就是High
cycle_df['low'] = df['low'].resample(rule=rule_cycle).min()  # 五分钟内的最低价就是low
cycle_df['volume'] = df['volume'].resample(rule=rule_cycle).sum()  # 五分钟内的成交量的综合就是成交量
print(cycle_df)

以上是第一种方式,可以看到,第一种方式比较麻烦,需要对每一列进行操作,我们可以通过DataFrame整体转换,这样可以减少代码量

基于DataFrame进行快速转换

rule_cycle = '5T'
df.set_index('open_time', inplace=True)
cycle_df1 = df.resample(rule=rule_cycle).agg(
    {'open': 'first',
     'high': 'max',
     'low': 'min',
     'close': 'last',
     'volume': 'sum',
     })

print(cycle_df1)

如果你没有设置index索引为open_time的话,你可以在resample函数里面指定on的参数,表示是基于什么方式进行转换的,代码如下:

rule_cycle = '5T'
cycle_df1 = df.resample(rule=rule_cycle, on='open_time').agg(
    {'open': 'first',
     'high': 'max',
     'low': 'min',
     'close': 'last',
     'volume': 'sum',
     })

print(cycle_df1)

以上是分钟的转换,实际上rule还可以是时间,天、周、甚至更长的年月。rule的取值可以有如下:

"""
    B       business day frequency
    C       custom business day frequency (experimental)
    D       calendar day frequency
    W       weekly frequency
    M       month end frequency
    SM      semi-month end frequency (15th and end of month)
    BM      business month end frequency
    CBM     custom business month end frequency
    MS      month start frequency
    SMS     semi-month start frequency (1st and 15th)
    BMS     business month start frequency
    CBMS    custom business month start frequency
    Q       quarter end frequency
    BQ      business quarter endfrequency
    QS      quarter start frequency
    BQS     business quarter start frequency
    A       year end frequency
    BA      business year end frequency
    AS      year start frequency
    BAS     business year start frequency
    BH      business hour frequency
    H       hourly frequency
    T       minutely frequency
    S       secondly frequency
    L       milliseonds
    U       microseconds
    N       nanoseconds
"""

如果你想转成四个小时的,那么rule_cycle='4H’就可以了。

以上就是对交易所行情数据的周期转换的列子。如果你看完博客还有疑问,你可以去观看下视频。https://www.bilibili.com/video/av57116065/

如果你是在学习python或者在学习量化交易的,可以记得关注我,或者添加我的微信:

0人推荐
随时随地看视频
慕课网APP