数据表,数据集,实体框架,LINQ&;金融技术分析的Lambda表达式C#

本文关键字:技术 Lambda 表达式 金融 实体 数据集 框架 LINQ amp 数据表 | 更新日期: 2023-09-27 17:58:15

这更像是一个架构问题,而不是一个特定的代码问题,因为我在如何进行这个项目时遇到了一个主要障碍。

例如,我正在构建一个财务扫描软件,根据特定的标准筛选股票。例如,如果8000只股票中,其今天的收盘价高于SMA 100,而10天前的收盘价低于SMA 100,则将此股票符号返回给我。

然而,请注意,在上例中,SMA(简单移动平均线)是用最后100天的数据计算的,但我们可以更改100天,比如说另一个值,105或56,可以是任何值。

在我的数据库中,我有一个名为EODData的表定义,它有几列,下面是定义;

EODData
sSymbol nvarchar(6)
mOpen money
mClose money
mHigh money
mLow money
Date datetime

该表将保存美国证券交易所3年的日终数据,因此大约有6264000行,对于MS SQL 2008 R2来说没有问题。

现在,我目前正在使用实体框架从我的数据库中检索数据,然而,运行或创建过滤器的最佳方式是什么,因为每次扫描时都必须为每个符号或基础股票交易工具计算SMA,因为100天变量可能会更改。

我应该从实体对象转换为用于内存过滤等的数据集吗???

我不怎么使用DataSets或DataTables,所以我在寻找指针。

请注意,SMA只是其中一个滤波器,我有另一个算法来计算EMA(指数移动平均,这是一个复杂得多的公式)和MACD(移动平均收敛发散)。

有什么意见吗?

数据表,数据集,实体框架,LINQ&;金融技术分析的Lambda表达式C#

把计算放在数据库里怎么样?你有你的EODData表,这很好。创建另一个表作为SummaryData,类似于:

SummaryData
stockSymbol varchar(6) -- don't need nvarchar, since AMSE doesn't have characters outside of normal English alphabet.
SMA decimal
MCDA decimal
EMA decimal

然后,您可以编写一些在当天结束时运行的存储过程,并根据EODData表中的数据更新此表。或者,您可以编写一个触发器,以便每次插入EODData表都会更新数据库中的摘要数据。

这样做的一个缺点是,您在数据库中放入了一些业务逻辑。另一个缺点是,你将更新股票符号的统计数据,而你可能不需要这样做。例如,如果没有人想看看XYZZ做了什么,那么对它的计算是毫无意义的。

然而,第二个问题由于1。您正在MSSQL可以优化的服务器上运行SP和2。当每个人都在家的时候,你可以在下班后运行这些程序,所以如果需要一点时间,你就不会受到影响。(老实说,我认为如果它们是滚动平均值、最小值/最大值等计算,SQL不会那么慢。)

一个好处是你的查询应该非常快,因为你可以写

select stockSymbol from SummaryData where SMA > 10您已经进行了计算。

另一个好处是,数据每天只会更改一次(在工作日结束时),但您可能会在一天中查询多次。例如,您希望今天对截至昨天(包括昨天)的所有数据运行几个不同的查询。如果你运行了10个查询,而你的合作伙伴运行了同样的10个查询。(本质上,写一次,读多次。)