我创建了一个指数价格水平表(例如,标准普尔 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)
我突然想到自连接会起作用,但我不确定增加第二个表上的日期以考虑周末的最佳方法。
关于解决此问题的最佳方法有什么想法吗?
一个简单的交叉应用
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)
| 归档时间: |
|
| 查看次数: |
3875 次 |
| 最近记录: |