从值表计算算术回报

Chr*_*ris 5 sql sql-server

我创建了一个指数价格水平表(例如,标准普尔 500 指数),我想计算每日回报。表结构如下所示:

Date        Value
2009-07-02  880.167341
2009-07-03  882.235134
2009-07-06  881.338052
2009-07-07  863.731494
2009-07-08  862.458985
Run Code Online (Sandbox Code Playgroud)

我想计算指数的每日算术回报(即百分比回报),定义为:

Daily Return = P(2)/P(1) - 1
Run Code Online (Sandbox Code Playgroud)

其中 P 表示这种情况下的索引值。鉴于上面提供的输入表,所需的输出将如下所示:

    Date        Return
    2009-07-03  0.002349318
    2009-07-06  -0.001016829
    2009-07-07  -0.019977077
    2009-07-08  -0.001473269
Run Code Online (Sandbox Code Playgroud)

我突然想到自连接会起作用,但我不确定增加第二个表上的日期以考虑周末的最佳方法。

关于解决此问题的最佳方法有什么想法吗?

gbn*_*gbn 2

一个简单的交叉应用

SELECT
  Tlater.Date, (Tlater.Value / TPrev2.Value) - 1
FROM
   MyTable Tlater
   CROSS APPLY
   (
    SELECT TOP 1 TPrev.Value 
    FROM MyTable TPrev
    WHERE TPrev.Date < Tlater.Date
    ORDER BY TPrev.Date
   ) TPrev2
Run Code Online (Sandbox Code Playgroud)

注意:这在带有 LAG 的 Denali (SQL Server 2012) 中变得微不足道(未经测试,可能需要 CTE)

SELECT 
    OrderDate, 
    (Value / (LAG(Value) OVER (ORDER BY Date))) -1
FROM
    MyTable
Run Code Online (Sandbox Code Playgroud)

或者

;WITH cPairs AS
(
   SELECT 
      Date, 
      Value AS Curr,
      LAG(Value) OVER (ORDER BY Date) AS Prev
   FROM
    MyTable
)
SELECT 
    Date, 
    (Curr / Prev) -1
FROM
    cPairs
Run Code Online (Sandbox Code Playgroud)