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 レコードについて、マイナス方向への最大の残高低下を示す値です。上記の例を見ると、最初のドローダウンは $400 (最初のマイナスの $100 セクション) で、2 番目のドローダウンはより大きく、1200 ドル (2 番目のセクション) です。ご存知のように、これらのドローダウンは定期的に発生するため、ac の履歴には、ここに示すように 2 つだけではなく、多くのドローダウンが含まれているはずです。通常、100,000 レコード以上の巨大なデータセットでこの種のデータを計算します。

env は oracle 11gr2、読み取りアクセスのみです。どんな賢いアイデアでも大歓迎です!

わかりました。システムが編集内容を上書きしているように見えるので、それを 1 つに統合する必要があります。負の取引を 'Y' としてマップする artif 列を追加しようとし、その後それらに対して sum() を実行する方法を見つけようとしました。ここでの問題は、任意の 1 つのレコードが結果レコードの 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 に答える