Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

calcul de Max Draw Down en SQL

La version brutalement inefficace, mais très simple utilisant une vue est ci-dessous :

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

Comme d'habitude vous effectueriez l'analyse sur une période de temps spécifique, il serait logique d'envelopper la requête dans une procédure stockée avec les paramètres @StartDate, @EndDate et éventuellement @StockID . Encore une fois, c'est assez inefficace de par sa conception - O(N^2), mais si vous avez de bons index et pas une énorme quantité de données, SQL Server le gérera assez bien.