1

好吧,假设我有一个来自交易账户的简单表格,其中包含所有典型的交易信息:

Account     ID  Type OrderID    Points  NetPL   Balance
13543564678 16  BUY  389745683  4.55    100.00  1,000,000.00
13543564678 16  BUY  389745684  4.55    100.00  1,000,100.00
13543564678 16  BUY  389745685  4.55    100.00  1,000,200.00
13543564678 16  SELL 389745686  4.55    100.00  1,000,300.00
13543564678 16  BUY  389745687  4.55    100.00  1,000,400.00
13543564678 16  SELL 389745688  4.55    100.00  1,000,500.00
13543564678 16  SELL 389745689  4.55    100.00  1,000,600.00
13543564678 16  SELL 389745690  4.55    -100.00 1,000,700.00
13543564678 16  SELL 389745691  4.55    -100.00 1,000,600.00
13543564678 16  SELL 389745692  4.55    -100.00 1,000,500.00
13543564678 16  SELL 389745693  4.55    -100.00 1,000,400.00
13543564678 16  SELL 389745694  4.55    100.00  1,000,300.00
13543564678 16  SELL 389745695  4.55    100.00  1,000,400.00
13543564678 16  BUY  389745696  4.55    100.00  1,000,500.00
13543564678 16  BUY  389745697  4.55    100.00  1,000,600.00
13543564678 16  BUY  389745698  4.55    100.00  1,000,700.00
13543564678 16  BUY  389745699  4.55    100.00  1,000,800.00
13543564678 16  BUY  389745700  4.55    100.00  1,000,900.00
13543564678 16  BUY  389745701  4.55    100.00  1,001,000.00
13543564678 16  BUY  389745702  4.55    100.00  1,001,100.00
13543564678 16  BUY  389745703  4.55    100.00  1,001,200.00
13543564678 16  BUY  389745704  4.55    -100.00 1,001,300.00
13543564678 16  BUY  389745705  4.55    -100.00 1,001,200.00
13543564678 16  BUY  389745706  4.55    -100.00 1,001,100.00
13543564678 21  BUY  389745707  4.55    -100.00 1,001,000.00
13543564678 21  SELL 389745708  4.55    -100.00 1,000,900.00
13543564678 21  SELL 389745709  4.55    -100.00 1,000,800.00
13543564678 21  SELL 389745710  4.55    -100.00 1,000,700.00
13543564678 21  BUY  389745711  4.55    -100.00 1,000,600.00
13543564678 21  SELL 389745712  4.55    -100.00 1,000,500.00
13543564678 21  BUY  389745713  4.55    -100.00 1,000,400.00
13543564678 21  SELL 389745714  4.55    -100.00 1,000,300.00
13543564678 21  SELL 389745715  4.55    100.00  1,000,200.00
13543564678 21  BUY  389745716  4.55    100.00  1,000,300.00

我在这里需要的是仅使用 sql 计算最大回撤。我可以在 java 上轻松地做到这一点(运行一个循环),但这应该是一个大查询的一部分,计算不同的 acc 参数。

所以让我解释一下公式:对于数据库中所有可用的 acc 记录,最大回撤是一个显示最大余额下降到负数的值。看看上面的 ex,第一个回撤是 400 美元(第一个负 100 美元部分),第二个更大,它是 1200 美元(第二个)。如您所知,这些回撤经常发生,因此 acc 历史应该有很多,而不仅仅是此处显示的 2 次。通常它会在一个巨大的数据集上计算这种数据,从 100,000 条记录开始。

env 是 oracle 11gr2,只读访问。任何聪明的想法将不胜感激!

好的,看起来系统会覆盖编辑,所以我必须将其放入 1 个合并中。我尝试添加一个 artif 列,其中映射负数交易为“Y”,并试图找到一种方法如何在它之后对它们执行 sum()。这里的问题是任何单个记录都可以超过任何结果记录的 sum()。

4

1 回答 1

1

您想首先列举下降。我通过使用带有累积和的滞后函数来做到这一点。通过查看先前的 PL 为正数和当前的负数,滞后找到了下跌的开始。累积和分配一个值。

其余的来自识别这些时期。

select Account, MAX(DrawDownAmount)
from (select Account, DrawDownNum, SUM(-NetPl) as DrawDownAmount
      from (select t.*,
                   sum(BeginDrawDown) over (partition by Account order by orderid) as DrawDownNum
            from (select t.*,
                         (case when NetPL < 0 then 1 else 0 end) as isdrawdown,
                         (case when coalesce(lag(NetPl, 1) over (partition by Account order by orderid), 1) >= 0 and
                                    NetPl < 0
                               then 1
                               else 0
                    end) as BeginDrawDown
                  from t
                 ) t
           ) t
      where isdrawdown = 1
      group by Account, DrawDownNum
     ) t
 group by Account
于 2012-07-16T15:34:38.753 回答