合并influxdb中的不同粒度时间序列

时间:2019-11-08 00:37:08

标签: database influxdb influxql influxdb-2

我想存储交易以及最佳要价/出价数据,后者在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或其他时间序列数据库执行我想做的事情?产生较低质量结果的另一种解决方案是按某个时间间隔(例如250ms)对询问/出价数据进行分组,并从每个间隔中获取最后一个,以至少对客户端必须放弃的报价量施加上限找到最接近下一笔交易的交易。

1 个答案:

答案 0 :(得分:3)

NB。只是澄清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

当然,您会更频繁地查询数据库,但取决于交易数量和您的资源限制,它可能会更有效率。注意这里的一个潜在陷阱是,以这种方式检索的askbid并不是成对检索而是独立检索,并且当它们成对返回时,可能会出现不同的时间戳。如果出于某种原因出于某种时间戳记而只有askbid的价格,则可能会遇到此问题。但是,只要成对写入并且没有丢失数据,就可以了。

  1. Flux https://www.influxdata.com/products/flux/-Flux是Influxdb 1.7和2的一部分,它是一种更复杂的查询语言,它使您可以进行跨不同度量的联接和运算。我还无法提供任何示例,但值得一看。

  2. 您可以查看的其他(关系)Times Series数据库也可以让您进行联接,例如CrateDB https://crate.io/或Postgres + TimescaleDB https://www.timescale.com/products