2012-07-16 52 views
1

確定可以說我有從交易賬戶中一個簡單的表與所有典型的交易信息:最大損失計算在SQL

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參數。

因此,讓我解釋一下公式:max drawdown是一個數值,表示對數據庫中可用的所有acc記錄,最大的平衡值趨於負值。看上面的第一個縮編是400美元(第一個負面$ 100部分),第二個是更大,其1200美元(第二個)。正如你所理解的那樣,這些失敗經常發生,因此歷史記錄應該有很多,而不僅僅是這裏顯示的2。通常它會從100,000個記錄開始計算這種大數據集上的數據。

env是oracle 11gr2,只讀訪問。 任何聰明的想法將非常感激!

好吧,看起來像系統覆蓋編輯,所以我必須把它合併到1合併。 我試圖添加一個artif列,其中地圖負向交易爲'Y',並試圖找到一個方法如何在它們之後對它們進行sum()。這裏的問題是任何單個記錄都可能超過結果記錄的總和()。

+2

使用超前或滯後計算每一行的提款 - 然後換行查詢,找到最大 – Randy 2012-07-16 14:41:13

+0

那是什麼我試過了。最後,我將簡單地獲取NETPL中的列,並在後面排一行。這裏的東西是我必須做sum()不知何故coz必須從多個(或單個,總之是更大的)行獲得累積值,而不僅僅是單個行。最後它應該返回我只有1個值--1200。 – user1324100 2012-07-16 14:54:30

+0

發表你試圖完善。它應該仍然有效。 (另外,買入和賣出訂單是否會影響到縮減? – Randy 2012-07-16 14:58:46

回答

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 
+0

謝謝讓我試試 – user1324100 2012-07-16 15:36:58

+0

@ user1324100:如果你無法做到這一點,缺少GROUP BY項。您可以再次嘗試此解決方案,如果您願意,現在[似乎可以運行](http://sqlfiddle.com/#!4/c725c/3)。 – 2012-07-17 13:23:35

+0

謝謝@AndriyM。 – 2012-07-17 13:25:14