我有一个SQL server2008 R2数据库,里面有几个股票期权的交易记录,每个期权间隔一分钟,每分钟包含几个到期的记录。例如,
Symbol, TradeDate, Expiry, Open, High, Low, Close
AMZN, 4/01/2009 9:31:00, 4/17/2009, 8, 10, 9, 8.5
AMZN, 4/01/2009 9:31:00, 5/17/2009, 10, 11, 10, 11
AMZN, 4/01/2009 9:31:00, 6/18/2009, 12,13,12,12
GOOG, 4/01/2009 9:31:00, 4/17/2009, 8, 9, 7, 7.5
AMZN, 4/01/2009 9:32:00, 4/17/2009, 8.2, 8.9, 8.3, 8.5
AMZN, 4/01/2009 9:32:00, 5/16/2009, 3, 4, 4, 4
...
AMZN, 4/20/2009 9:31:00, 5/16/2009, 8.5, 9, 8.75, 8.75
AMZN, 4/20/2009 9:31:00, 6/18/2009, 9, 10, 9, 9.2在期权中,总是有一个前月合约的概念。对于此问题,请将前一个月合约定义为:如果有TradeDate条目小于该合约的到期日,则为前一个月。否则,前一个月就是下个月的合约。例如,在上面的数据中,在2009年4月1日,AMZN前一个月是在2009年4月17日到期的合约。然而,当我们移动到TradeDate 4/20/2009时,前一个月是5/16/2009合约,因为4/17/2007合约在周末到期。
根据TradeDate是什么,哪条SQL语句总是返回所有正确的行,并给出“前一个月合约”?
发布于 2011-09-12 04:40:33
从你所描述的。下面的查询应该可以做到这一点。自连接:
SELECT T1.Symbol, T1.TradeDate, T1.Expiry, MIN(T2.expiry) AS FrontMonrhContract, T1.Open, T1.High, T1.Low, T1.Close FROM <TABLE> T1, <TABLE> T2 WHERE T1.TradeDate <= T2.Expiry GROUP BY T1.Symbol , T1.TradeDate, T1.Expiry但如果没有FrontMonth合约的交易条目,它将不起作用。
我感觉更好的是,你要么手动输入一个Expiries列表,要么根据一些规则来计算它们,比如这个月的上周五或类似的东西(如果有规则的话)。这样,如果frontMonth合约没有交易,您就不会冒着错误计算前一个月的风险。
最好还是在您的应用程序中而不是SQL中执行此操作,因为SQL不适用于此类工作。在您的应用程序中,这将是一个与过期列表的简单比较。
通过在应用程序本身而不是SQL中执行图表计算,我已经将图表函数的执行时间减少了90%以上。
更新:
尝试执行以下查询。它假定表名为TRADES。
SELECT
T1.Symbol,
T1.TradeDate,
T1.Expiry,
MIN(T2.expiry) AS 'FrontMonrhContract' ,
MIN(T1.[Open]) AS 'Open',
MIN(T1.[High]) AS 'High',
MIN(T1.[Low]) AS 'Low',
MIN(T1.[Close]) AS 'Close'
FROM
TRADES T1, TRADES T2
WHERE T1.TradeDate <= T2.Expiry AND T1.Symbol = T2.Symbol
GROUP BY T1.Symbol , T1.TradeDate, T1.Expiry我刚刚使用您在问题中提供的数据构建了一个示例表,该查询在该数据集上按预期工作。请注意,我使用的是SQL Server 2005
更新2:
要优化查询的执行,请尝试按该顺序添加具有三个GROUP BY列Symbol, TradeDate, Expiry的索引。
我创建了一个查询执行计划,超过60%的时间用于解析GROUP BY,在我的示例数据库中添加此索引后,它完全消失了。
https://stackoverflow.com/questions/7380874
复制相似问题