首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用LINQ对时间序列按区间(OHLC条)进行分组

如何用LINQ对时间序列按区间(OHLC条)进行分组
EN

Stack Overflow用户
提问于 2011-04-28 14:42:25
回答 1查看 4.2K关注 0票数 1

我以前见过这个问题的变化,但没有一个确切的答案。

我有一个带有时间戳的对象列表(股票交易数据,或“ticks”):

代码语言:javascript
复制
Class Tick
{
  Datetime Timestamp;
  double Price;
}

  1. I希望根据这些值生成另一个列表,这些值按一定的间隔分组,以便创建一个OHLC条(打开、高、低、关闭)。这些条子可以是指定的任何间隔(1分钟、5分钟、10小时甚至1小时)。
  2. i还需要找到一种有效的方法将新的“滴答”排序到列表中,因为它们可能以较高的速率(每秒3-5滴答)到达。

非常感谢你对此的任何想法,谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-28 15:16:17

I希望根据这些值生成另一个列表,这些值按一定的间隔分组,以便创建一个OHLC栏(打开、高、低、关闭)。这些酒吧可以是任何指定的间隔(1分钟、5分钟、10小时甚至1小时)。

不幸的是,您没有指定:

  1. 酒吧系列的阶段是什么。
  2. 酒吧的开始/结束时间是否纯粹基于“自然时间”(完全取决于固定的时间表,而不是第一次和最后一次计时的时间戳)。

假设自然时间的日内酒吧,阶段通常是夹紧到午夜。所以每小时的酒吧是00:00 - 01:00,01:00 - 02:00等等。在这种情况下,酒吧的开始/结束时间可以作为它的唯一键。

那么问题就变成了:滴答的时间戳属于什么条形开始/结束时间?如果我们假设我上面假设的一切,这可以很容易地用一些简单的整数数学来解决。然后,查询可以类似于(未经测试的,只有algo ):

代码语言:javascript
复制
var bars = from tick in ticks

           // Calculate the chronological, natural-time, intra-day index 
           // of the bar associated with a tick.
           let barIndexForDay = tick.Timestamp.TimeOfDay.Ticks / barSizeInTicks

           // Calculate the begin-time of the bar associated with a tick.
           // For example, turn 2011/04/28 14:23.45 
           // into 2011/04/28 14:20.00, assuming 5 min bars.
           let barBeginDateTime = tick.Timestamp.Date.AddTicks
                              (barIndexForDay * barSizeInTicks)

           // Produce raw tick-data for each bar by grouping.
           group tick by barBeginDateTime into tickGroup

           // Order prices for a group chronologically.
           let orderedPrices = tickGroup.OrderBy(t => t.Timestamp)
                                        .Select(t => t.Price)

           select new Bar
           {
                Open = orderedPrices.First(),
                Close = orderedPrices.Last(),
                High = orderedPrices.Max(),
                Low = orderedPrices.Min(),
                BeginTime = tickGroup.Key,
                EndTime = tickGroup.Key.AddTicks(barSizeInTicks)
           };

通常需要按索引/日期时间来定位条形图,并按时间顺序枚举所有条形图。在这种情况下,您可能需要考虑将条形图存储在一个集合中,比如一个SortedList<DateTime, Bar> (其中键是bar的开始或结束时间),它将很好地填充所有这些角色。

I还需要找到一种有效的方法来将新的“滴答”排序到列表中,因为它们可能会达到高速率(每秒3到5次滴答)。

这取决于你的意思。

如果这些蜱是从一个实时的价格-饲料(按时间顺序),你根本不需要查找-只是存储当前的,不完整的,“部分”栏。当一个新的滴答到达时,检查它的时间戳。如果它仍然是当前“部分”栏的一部分,只需使用新信息(即Close = tick.Price,High = Max(oldHigh,tick.Price)等)更新条形。否则,“部分”栏就完成了--把它推到你的酒吧集合中。请注意,如果您使用的是“自然时间”栏,那么一条条的结束也可能是由时间的推移而不是由价格事件(例如小时栏在小时内完成)带来的。

编辑:

否则,您将需要进行查找。如果您存储在一个排序列表中(按开始时间/结束时间键),那么您只需要计算与滴答相关的开始时间/结束时间。这应该很简单;我已经在上面的LINQ查询中给出了一个示例,说明如何做到这一点。

例如:

代码语言:javascript
复制
myBars[GetBeginTime(tick.Timestamp)].Update(tick);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5820397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档