8

我想在 InfluxDB 中存储交易以及最佳询价/出价数据,后者的更新速度比前者快得多。

如果可能的话,我想使用一个允许我查询的模式:“对于市场 X 上的每笔交易,找到时间戳为 <= 交易时间戳的市场 Y 上的最佳卖价/买价”。

(我会使用任何版本的 Influx。)

例如,交易可能如下所示:

   Time      Price     Volume   Direction   Market
00:01.000     100        5          1       foo-bar
00:03.000     99         50         0       bar-baz       
00:03.050     99         25         0       foo-bar
00:04.000     101        15         1       bar-baz

报价数据可能看起来更像这样:

   Time       Ask        Bid     Market
00:00.763     100         99    bar-baz
00:01.010     101         99    foo-bar
00:01.012     101         98    bar-baz
00:01.012     101         99    foo-bar
00:01:238     100         99    bar-baz
...
00:03:021     101         98    bar-baz

我希望能够以某种方式加入某个市场的每笔交易,例如foo-bar,只有其他市场上的最新询价/出价数据点,例如bar-baz,并得到如下结果:

   Time      Trade Price    Ask     Bid
00:01.000        100        100      99
00:03.050        99         101      98

这样我就可以计算市场foo-bar上的交易价格与市场bar-baz上最近报价的询价或出价之间的差异。

现在,我将交易存储在一个时间序列中,并在另一个时间序列中存储要价/投标数据点,然后在客户端将它们合并,逻辑如下:

function merge(trades, quotes, data_points)
  next_trade, more_trades = first(trades), rest(trades)

  quotes = drop-while (quote.timestamp < next_trade.timestamp) quotes
  data_point = join(next_trade, first(quotes))

  if more_trades
    return merge(more_trades, quotes, data_points + data_point)
    return data_points + data_point

问题是客户不得不丢弃大量的买/卖数据点,因为它们更新如此频繁,并且只有交易前的最新更新是相关的。

有几十个市场,我可能想比较交易的最新询价/出价,否则我只需将最新的询价/出价存储在与交易相同的系列中。

是否可以用 Influx 或其他时间序列数据库做我想做的事情?产生较低质量结果的另一种解决方案是按某个时间间隔(例如 250 毫秒)对要价/投标数据进行分组,并从每个间隔中取最后一个,以至少对客户之前必须放弃的报价数量施加上限找到最接近下一笔交易的交易。

4

1 回答 1

5

注意。只是对 InfluxDB 术语的澄清。您可能正在以不同的测量方式存储交易和分时数据(类似于表格)。系列是基于标签值进行测量的细分。例如

   Time       Ask        Bid     Market
00:00.763     100         99    bar-baz

是一个系列

   Time       Ask        Bid     Market
00:01.010     101         99    foo-bar

是另一个系列(假设您将市场名称/ID 存储为标签而不是字段)

回答

  1. InfluxQL https://docs.influxdata.com/influxdb/v1.7/query_language/spec/ - 我想不出用 InfluxQL(Influx 查询语言)实现您需要的方法,因为它不支持连接。也许您可以在客户端做的不是请求一段时间内的所有分时数据并丢弃大部分数据,而是针对每个交易和市场发出请求以准确获取(与交易相关的最新)询价/出价数据点你需要的。就像是:
function merge(trades, market)
  points = <empty list>
  for next_trade in trades
    quote = db.query("select last(ask), last(bid) from tick_data where time<=next_trade.timestamp and Market=market and time>next_trade.timestamp - 1m")
    // or to get a list per market with one query
    // quote_per_market = db.query("select last(ask), last(bid) from tick_data where time<=next_trade.timestamp group by Market")
    points = points + join(next_trade, quote)
  return points

当然,您会有更频繁地查询数据库的开销,但根据交易数量和您的资源限制,它可能会更有效。注意。这里的一个潜在缺陷是,以ask这种bid方式检索的不是成对检索,而是独立检索,当它们成对返回时,它们可能具有不同的时间戳。如果由于某种原因您只有一个ask或一个bid价格,您可能会遇到这个问题。但是,只要您成对编写它们并且没有丢失数据就可以了。

  1. Flux https://www.influxdata.com/products/flux/ - Flux 是一种更复杂的查询语言,它是 Influxdb 1.7 和 2 的一部分,允许您跨不同的测量值进行连接和操作。我还不能给你任何例子,但值得一看。

  2. 您可以查看的其他(关系)时间序列数据库也允许您进行连接是 CrateDB https://crate.io/或 Postgres + TimescaleDB https://www.timescale.com/products

于 2019-11-19T14:38:40.347 回答