使用SQL计算累积回报

时间:2017-08-14 19:00:08

标签: sql postgresql

我目前使用以下代码在两个月内生成用户的“monthly_return”。如何将“monthly_return”转换为类似于下面链接的StackOverflow问题的累积“链接”返回?

类似的问题:Running cumulative return in sql

我试过了:

exp(sum(log(1 + cumulative_return) over (order by date)) - 1)

但是得到错误:

PG :: WrongObjectType:ERROR:OVER指定,但是log不是窗口函数,也不是聚合函数LINE 3:exp(sum(log(1 + cumulative_return)over(order by date)) - 1 ... ^ :SELECT portfolio_id,exp(sum(log(1 + cumulative_return)over(按日期排序)) - 1)FROM(SELECT date,portfolio_id,(value_cents * 0.01 - cash_flow_cents * 0.01)/(lag(value_cents * 0.01,1)) over(ORDER BY portfolio_id,date)) - 1 AS cumulative_return FROM portfolio_balances WHERE portfolio_id = 16 ORDER BY portfolio_id,date)as return_data;

输入数据为:

1/1/2017: $100 value, $100 cash flow
1/2/2017: $100 value, $0 cash flow
1/3/2017: $100 value, $0 cash flow
1/4/2017: $200 value, $100 cash flow

输出结果为:

1/1/2017: 0% cumulative return
1/2/2017: 0% cumulative return
1/3/2017: 0% cumulative return
1/4/2017: 0% cumulative return

我当前的代码显示未链接(累计)的月度回报。

SELECT 
date,
portfolio_id,
(value_cents * 0.01 - cash_flow_cents * 0.01) / (lag(value_cents * 0.01, 1) over ( ORDER BY portfolio_id, date)) - 1 AS monthly_return
FROM portfolio_balances
WHERE portfolio_id = 16
ORDER BY portfolio_id, date;

1 个答案:

答案 0 :(得分:0)

如果您想要累积总和:

SELECT p.*,
       SUM(monthly_return) OVER (PARTITION BY portfolio_id ORDER BY date) as running_monthly_return
FROM (SELECT  date, portfolio_id,
              (value_cents * 0.01 - cash_flow_cents * 0.01) / (lag(value_cents * 0.01, 1) over ( ORDER BY portfolio_id, date)) - 1 AS monthly_return
      FROM portfolio_balances
      WHERE portfolio_id = 16
     ) p
ORDER BY portfolio_id, date;

我没有看到这很有意义,因为你有一个比例的累积总和,但这似乎是你所要求的。