Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

calcolo Max Draw Down in SQL

Di seguito è riportata una versione brutalmente inefficiente, ma molto semplice che utilizza una vista:

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

Poiché di solito eseguiresti l'analisi in un periodo di tempo specifico, avrebbe senso racchiudere la query in una procedura memorizzata con i parametri @StartDate, @EndDate ed eventualmente @StockID . Ancora una volta, questo è abbastanza inefficiente in base alla progettazione - O(N^2), ma se hai buoni indici e non un'enorme quantità di dati, SQL Server lo gestirà abbastanza bene.