从tick数据中提取周期K线数据 —- 1)尝试与问题

本文原创,如果转载请注明来源

该问题最终分成三篇文章予以最终解决,相关文章链接如下:
从tick数据中提取周期K线数据 —- 1)尝试与问题
从tick数据中提取周期k线数据 — 2)继续改进
从tick数据中提取周期k线数据 — 3)终极解决

原本从tick数据中提取k线数据,笔者认为不应该是什么问题。

结果实际编程的时候发现问题还挺多。

首先使用的参考代码如下:

def generate_kline_data(stockDF, zhouqi, output_file):
    # print(stockDF)
    #sys.exit(0)
    # stockDF.set_index('time',inplace=True)
    stockDF.index = pd.to_datetime(stockDF.index)
    stockDF['amount'] = stockDF['price'] * stockDF['volume']
    stockDF['amount'] = stockDF['amount'].apply(lambda x: round(x, 3))
    df = stockDF.resample(zhouqi).last()
    # period_stock_data['change'] = stockData['change'].resample(zhouqi).sum()
    # period_stock_data['pct_chg'] = stockData['pct_chg'].resample(zhouqi).apply(lambda x: (x / 100 + 1.0).prod() - 1.0) * 100
    df['open'] = stockDF['price'].resample(zhouqi).first()
    df['close'] = stockDF['price'].resample(zhouqi).last()
    df['high'] = stockDF['price'].resample(zhouqi).max()
    df['low'] = stockDF['price'].resample(zhouqi).min()
    df['vol'] = stockDF['volume'].resample(zhouqi).sum()
    df['amount'] = stockDF['amount'].resample(zhouqi).sum()
    df['time'] = df['time'].shift(-1)

    df = df[df['high'].notnull()]
    df.reset_index(inplace=True)
    # 去掉 volume, price, type 列
    df.drop(columns=['volume', 'price', 'type'], inplace=True)

    # 保存结果到CSV文件
    df.to_csv(output_file, index=False)

结果发现上述代码有问题,即生成的结果中例如对于1分钟线数据。包括9:25和9:30以及9:31……,示例如下所示:
time amount open close high low vol
0 2024-12-31 09:25:00 6890768.00 11.93 11.93 11.93 11.93 577600
1 2024-12-31 09:30:00 35015196.00 11.94 11.92 11.94 11.89 2939200
2 2024-12-31 09:31:00 11513837.00 11.93 11.97 11.97 11.93 963700
3 2024-12-31 09:32:00 11631159.00 11.97 11.95 11.97 11.95 972600
4 2024-12-31 09:33:00 11870436.00 11.94 11.95 11.95 11.94 993700

而对比通达信软件,实际上是从9:31开始的。对应上述所做的修改主要是两条:
1)将9:25的数据整合到9:30
2)将时间后移动一个周期,也就是9:30变成了9:31,其他类似后移,

3)最后一条数据,时间是15:00:00,应该保持不变,不必后移动一个周期。

此条目发表在量化交易分类目录,贴了标签。将固定链接加入收藏夹。

发表回复