【问题标题】:Pandas Dataframe Resample OHLC has wrong open pricePandas Dataframe Resample OHLC 的开盘价错误
【发布时间】:2016-08-03 15:08:42
【问题描述】:

我无法使用 pandas DataFrame.resample() 0.18 版从刻度数据生成“准确”的 OHLC 数据。 具体来说,当价格在某个区间内持续时,我会在这些柱的开盘价处得到“未来泄漏”。

可重现的例子:

import pandas as pd
import numpy as np

np.random.seed(1234)
size=1000
df = pd.DataFrame(1.26 + np.random.rand(size)/100.0,index=pd.date_range('20160101 09:00:00',periods=size,freq='7s'),columns=['price'])
dfohlc = df.price.resample('1min').ohlc().ffill()

这是一系列随机生成的价格变动:

2016-01-01 09:00:00  1.261915
2016-01-01 09:00:07  1.266221
2016-01-01 09:00:14  1.264377
2016-01-01 09:00:21  1.267854
2016-01-01 09:00:28  1.267800
2016-01-01 09:00:35  1.262726
2016-01-01 09:00:42  1.262765
2016-01-01 09:00:49  1.268019
2016-01-01 09:00:56  1.269581   << this is the market price until 09.01:03
2016-01-01 09:01:03  1.268759   << this price should not be the open price at 09:01
...

resample() 生成这些条:

2016-01-01 09:00:00  1.261915  1.269581  1.261915  1.269581
2016-01-01 09:01:00  1.268759  1.268759  1.260138  1.260138
...

第一个 OHLC 柱在 09:00 的开盘价和收盘价是正确的。

但是,09:01:00 的第 2 个 OHLC 柱的开盘价“错误”为 1.268759。此价格要到 09:01:03 才能看到。开盘时的“正确”价格仍然是 1.269581。

有没有办法让 resample() 函数生成“正确”的开盘价?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    有趣...

    似乎行为是按时分组,并将该分组期间的第一个值作为开盘价。

    我认为使用之前的收盘价作为开盘价是有意义的,除了可能是市场开盘价。

    df['open'] = df['close'].shift().

    如果您有一个标志来指示市场的开盘价,并且您希望使用第一个观察到的价格作为开盘价,那么这将起作用:

    df.loc[df['market_open_flag'] == False, 'open'] = df['close'].shift()
    

    如果没有观察到的交易,我不确定默认行为是什么,例如流动性不足的股票。

    【讨论】:

    • 感谢您的解释;我的想法与简单修复相同,但需要确认。
    • 同意这个解决方案是有意义的,除非有市场开放,例如股票。对于期货和外汇市场(几乎)是连续的周日至周五。我猜 ohlc() 的默认行为实际上应该是在时间间隔之前或之后立即取值,并且绝对不是在时间间隔过去之后出现的下一个值,因为这将是未来泄漏的来源.. ..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 2020-02-23
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多