在 C# 中过滤掉延长交易时间的数据

Posted

技术标签:

【中文标题】在 C# 中过滤掉延长交易时间的数据【英文标题】:Filtering out the data for Extended Trading Hours in C# 【发布时间】:2022-01-02 09:43:19 【问题描述】:

我从股票提供商处获取数据,其中包含延长交易时间的数据。 数据是我从 JSON 转换为 List<Aggregate> 的聚合 1 分钟数据点,其中聚合包含高、低、打开、关闭和聚合 1 分钟窗口开始的时间。 我的查询包含多个交易日——可能是数百个,也可能是数千个。而且我对指标的计算必须排除盘后数据。 所以我有一个包含数百个对象的列表:

public class Aggregate

    public decimal Close  get; set; 
    public decimal UnixTimestamp  get; set;  // milliseconds
    ...

还有跨越数百天的DateTime FromDateDateTime ToDate。 现在,过滤盘后数据的一种可靠方法是将每个项目的UnixTimestamp 与太平洋标准时间上午 9:30 至下午 16:00 的常规交易时间窗口进行比较。这需要将每个UnixTimestamp 转换为DateTime。这是很多比较...直观地说,最好将FromDateToDate 转换为UnixTimestamp 并使用Linq 过滤掉项目。

long unixTimeMsecToDate = new DateTimeOffset(aggrParams.ToDate).ToUnixTimeMilliseconds();
long unixTimeMsecFromDate = new DateTimeOffset(aggrParams.FromDate).ToUnixTimeMilliseconds();

但是,我无法确定确切的代码...循环查看日期?怎么样?

【问题讨论】:

如果您有List<Aggregate,那么您只需使用LINQ Where 方法过滤:listAggregate.Where(a => unixTimeMsecFromDate <= a.UnixTimestamp && a.UnixTimestamp <= unixTimeMsecToDate)。您可以选择在末尾执行ToList() 来记忆过滤。 问题是 Aggregate FromDate 和 ToDate 是 DateTime 格式,我有多个日期,我已经聚合了 1 分钟的数据......所以,unixTimeMsecFromDate 和 unixTimeMsecToDate 需要以某种方式计算每个日期... “聚合 FromDate 和 ToDate”指的是什么?您有一个从日期到日期的范围,您可以将其转换为 Unix 时间戳格式,然后直接使用Where 进行过滤。那是两次转换。你的public class Aggregatepublic decimal UnixTimestamp => 在Aggregate 中没有DateTime 【参考方案1】:

我设法摆脱了 Aggregate 对象并将其替换为来自不同库的 Quote 对象,时间表示为 C# Date Time 并以如下直接方式解决问题,有效地过滤掉了非工作时间数据点:

        private void FilterExtendedTradingHours(List<Quote> quoteList, AggrParams aggrParams)
    
        using (Log.VerboseCall())
        
            if (aggrParams.Interval == "minute" || aggrParams.Interval == "hour")
            
                Log.VerboseFormat("Initial 0 count: 1", aggrParams.Interval, quoteList.Count);

                for(int i = quoteList.Count - 1; i >= 0; i--)
                
                    if ( quoteList[i].Date.TimeOfDay > new TimeSpan(16,  0,  0) || quoteList[i].Date.TimeOfDay < new TimeSpan(9, 30, 0) )
                    
                        quoteList.RemoveAt(i);
                    
                

                Log.VerboseFormat("Post-filtering 0 count: 1", aggrParams.Interval, quoteList.Count);
            
        
    

【讨论】:

以上是关于在 C# 中过滤掉延长交易时间的数据的主要内容,如果未能解决你的问题,请参考以下文章

C# 实体类转json数据过滤掉字段为null的字段

使用 C# 使用正则表达式过滤掉字母 [重复]

在 R 中使用 dplyr 进行过滤时,为啥过滤掉的变量级别会保留在过滤后的数据中? [复制]

前置净水器有用吗?

前置过滤器有用吗

核心数据 - NSPredicate 过滤掉工作不正确的空字符串