使用 Python 将 Tick 数据转换为 OHLC(无外部库)[关闭]

Posted

技术标签:

【中文标题】使用 Python 将 Tick 数据转换为 OHLC(无外部库)[关闭]【英文标题】:Convert Tick data to OHLC with Python (No External Libraries) [closed] 【发布时间】:2022-01-24 04:15:39 【问题描述】:

假设我有这样的数据:

[
 'time': 1626459705; 'price': 278.989978, 
 'time': 1626459695; 'price': 279.437975
]

注意:这只是我自己创建的示例数据。实际上,每分钟可能有任意数量的事务。因此,数据每分钟会有所不同。

如何使用 Python 而不使用 Pandas 等任何外部库 将其转换为 OHLC 烛台数据,例如 1 或 3 或 5 分钟?是否可以通过简单的方式进行?

提前致谢

【问题讨论】:

“OHLC”图表通常是一天一天的。否则,您实际上没有“打开”和“关闭”。这看起来像 10 秒的间隔,所以你当然可以收集“开始”、“最大”、“最小”和“结束”的间隔,间隔是 10 秒的倍数。当然,绘制它需要一个外部库。 我刚刚包含了一个数据样本。实际上,没有什么像 10 秒或 3 秒的间隔。 1 分钟内可能有 3 次或 4 次或超过该数量的交易。 为什么我们不能使用 Pure Python? 因为没有意义。算术很容易。图形很难——真的很难。浪费时间为每个项目编写新的图形库是愚蠢的。其他人已经完成了艰苦的工作。代码在那里,经过测试和工作,可供您使用。用它。你应该专注于你的问题,而不是解决已经解决的问题。 【参考方案1】:

这是生成随机数据并创建 OHLC 表的代码。

import random
import pprint

# Generate random walk data..

base = 1626459705
price = 278.989978
data = []
for i in range(600):
    data.append( 'time':base+10*i, 'price':price )
    price += random.random() * 3 - 1.5
print(data)

# Produce 3 minute intervals.

ohlc = []
interval = 180

base = 0
# start time, open, high, low, close
rec = [ 0, 0, 0, 99999, 0 ]
ohlc = []
for row in data:
    rec[2] = max(rec[2],row['price'])
    rec[3] = min(rec[3],row['price'])
    if row['time'] >= base+interval:
        if rec[0]:
            rec[4] = row['price']
            ohlc.append( dict(zip(('time','open','high','low','close'),rec)) )
        base = rec[0] = row['time']
        rec[1] = rec[2] = rec[3] = row['price']

pprint.pprint(ohlc)

跟进

好的,这是一个适用于您的数据的方法。我刚刚将该文件复制到“mydata.json”(并删除了第一个“data =”)。请注意,这会以实际的 3 分钟间隔打印输出,而不是基于输入的每一行。

import pprint
import json
import time

# Produce 3 minute intervals.

data = json.load(open('mydata.json'))
data.reverse()

interval = 180
base = data[0]['time'] // interval * interval

# start time, open, high, low, close
rec = [ base, data[0]['price'], data[0]['price'], data[0]['price'], 0 ]

ohlc = []

i = 0
while i < len(data):
    row = data[i]

    # If this sample is beyond the 3 minutes:
    if row['time'] > rec[0]+interval:
        ohlc.append( dict(zip(('time','open','high','low','close'),rec)) )
        rec[0] += interval
        rec[1] = rec[2] = rec[3] = rec[4]
    else:
        rec[2] = max(rec[2],row['price'])
        rec[3] = min(rec[3],row['price'])
        rec[4] = row['price']
        i += 1

for row in ohlc:
    row['ctime'] = time.ctime(row['time'])
    print( "%(ctime)s: %(open)12f %(high)12f %(low)12f %(close)12f" % row )

样本输出:

Wed Dec 22 22:27:00 2021:   454.427421   454.427421   454.427421   454.427421
Wed Dec 22 22:30:00 2021:   454.427421   454.427421   454.427421   454.427421
Wed Dec 22 22:33:00 2021:   454.427421   454.427421   454.427421   454.427421
Wed Dec 22 22:36:00 2021:   454.427421   457.058452   453.411757   453.411757
Wed Dec 22 22:39:00 2021:   453.411757   455.199204   452.589304   455.199204
Wed Dec 22 22:42:00 2021:   455.199204   455.199204   455.199204   455.199204
Wed Dec 22 22:45:00 2021:   455.199204   455.199204   455.199204   455.199204
Wed Dec 22 22:48:00 2021:   455.199204   455.768577   455.199204   455.768577
Wed Dec 22 22:51:00 2021:   455.768577   455.768577   455.768577   455.768577
Wed Dec 22 22:54:00 2021:   455.768577   455.768577   452.348469   454.374116

【讨论】:

谢谢,我马上去看看 :) 嘿.. 它不适用于我的数据。在此处查看数据:pastebin.com/mk7LyLi8 在有时 3 或 4 分钟或更长时间的交易之间的间隔中,它没有正确显示 OHLC 数据。对于这些间隔,它应该显示一条虚线,表示 O = H = L = C。目前,它正在合并数据。 您好,抱歉,我之前无法查看后续跟进。堆栈溢出没有通知我。我今天才看到它,它工作得很好。非常感谢:) 只有一个问题。你为什么在这里将基数除以 180*180 base = data[0]['time'] // interval * interval

以上是关于使用 Python 将 Tick 数据转换为 OHLC(无外部库)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何将字典转换为 Pandas df?

c++中如何将unix时间戳转换为标准时间,有函数吗

在JS中将Tick转换为Date

从接收tick数据到生成1分钟K线的实时处理

python 使用eval() 可以将json格式的数据,转换为原始数据

React/Reflux:使用装饰器将带有 mixin 的类转换为 ES6