使用 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*180base = data[0]['time'] // interval * interval
?以上是关于使用 Python 将 Tick 数据转换为 OHLC(无外部库)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章