Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Berechnen von Max Draw Down in SQL

Brutal ineffiziente, aber sehr einfache Version, die eine Ansicht verwendet, ist unten:

WITH DDView
AS (SELECT      pd_curr.StockID,
                pd_curr.Date,
                pd_curr.Low_Price  AS CurrPrice,
                pd_prev.High_Price AS PrevPrice,
                pd_curr.Low_Price / pd_prev.High_Price - 1.0 AS DD

    FROM        PriceData pd_curr
    INNER JOIN  PriceData pd_prev
            ON  pd_curr.StockID = pd_prev.StockID
            AND pd_curr.Date >= pd_prev.Date
            AND pd_curr.Low_Price <= pd_prev.High_Price
            AND pd_prev.Date >= '2001-12-31' -- @param: min_date of analyzed period
    WHERE       pd_curr.Date <= '2010-09-31' -- @param: max_date of analyzed period
)
SELECT      dd.StockID,
            MIN(COALESCE(dd.DD, 0)) AS MaxDrawDown
FROM        DDView dd
GROUP BY    dd.StockID

Da Sie die Analyse normalerweise für einen bestimmten Zeitraum durchführen würden, wäre es sinnvoll, die Abfrage in eine gespeicherte Prozedur mit den Parametern @StartDate, @EndDate einzuschließen und eventuell @StockID . Auch dies ist vom Design her ziemlich ineffizient - O(N^2), aber wenn Sie gute Indizes und keine große Datenmenge haben, wird SQL Server damit ziemlich gut umgehen.