按时间同步来自多个来源的不规则时间序列-CEP

时间:2018-07-19 07:38:38

标签: c# algorithm complex-event-processing

我想构建一种回测软件,该软件可以读取不同来源的报价和报价。应该有两种模式。

  • 历史
  • 实时

例如,一个数据来自Yahoo,另一数据源是CSV文件。实时明确实施。先进先出,从源#1滴答,从源#2滴答,依此类推。历史模式有点棘手。看起来这是使用复杂事件处理按时间同步时间序列的好地方。

来源

var T1 = [ 1, 2, 3, 4, 15, 20, 21, 22 ];
var T2 = [ 3, 4, 5, 6, 10, 13, 50, 51 ];

期望

不应一次性读取和排序系列,因为它们可能很大,不利于存储。它应该逐步发生,从T1读取值,从T2读取值,等等。

Print 1  (T1)
Print 2  (T1)
Print 3  (T1)
Print 3  (T2)
Print 4  (T1)
Print 4  (T2)
Print 5  (T2)
Print 6  (T2)
Print 10 (T2)
Print 13 (T2)
Print 15 (T1)
Print 20 (T1)
Print 21 (T1)
Print 22 (T1)
Print 50 (T2)
Print 51 (T2)

问题

  • 来源1的提示开始于2015-01-01 09:30:00
  • 来源2的提示开始于2016-10-05 13:00:30

因此,我们需要在来源#2的第一个日期之前显示来源#1的价格变动。另外,某些时间序列中可能会缺少一些值。目前,我正在考虑这种实现方式,但是看起来都太复杂了。

Accounts = new Dictionary<string, IAccount>();
var queue = new ConcurrentDictionary<string, List<ITick>>();

// Get first tick for each timeseries as a start point

Parallel.ForEach(Accounts, (account) =>
{
  queue[account.Key] = new List<ITick> { account.Value.GetFirstTick() };
});

Parallel.ForEach(Accounts, (account) =>
{
  // Sibscribe to each source and start receiving ticks simultaneously

  account.Value.EventProcessTick += (ITick item) =>
  {
    // Save incoming tick to the queue for the future analysis

    queue[account.Key].Add(item);

    // Find the latest time among all ticks in the queue

    var stepTime = queue.Values.Max(o => o.LastOrDefault()).Time;

    Parallel.ForEach(queue.Values, (queueItems) =>
    {
      queueItems.ForEach((v) =>
      {
        // If any tick in the queue crossed time check point, output it and remove from the queue

        if (v.Time <= stepTime)
        {
          OnTickProcessed(v);
          queue[account.Key].Remove(item);
        }
      });
    });
  };

  account.Value.Run();
});

问题

有没有用于这种任务的算法,是否有可能使它更简单或更可靠?

0 个答案:

没有答案