Cálculo de RSI para múltiples fechas y tickers en SQL Server 2012

Cálculo de RSI para múltiples fechas y tickers en SQL Server 2012

Puedo calcular el RSI para una fecha de finalización específica:

DECLARE @StartingDate smalldatetime
    DECLARE @EndingDate smalldatetime
    DECLARE @StockID char(15)
    DECLARE @DAYS INT
    DECLARE @AG FLOAT
    DECLARE @AL FLOAT
    DECLARE @RS FLOAT

    SET @StartingDate = '20180301'
    SET @EndingDate = '20180403'
    SET @StockID = 'ACE'
    SET @DAYS = 14

    SET @AG =(
                SELECT SUM([px_close]-[px_open]) 
                FROM [dbo].[daily_data]
                WHERE [Ticker] = @STOCKID
                AND ([Date] BETWEEN @StartingDate AND @EndingDate) 
                AND ([px_close]-[px_open])>0)/@DAYS

    SET @AL =(
                SELECT SUM([px_close]-[px_open])
                FROM [dbo].[daily_data]
                WHERE [Ticker] = @STOCKID 
                AND ([Date] BETWEEN @StartingDate AND @EndingDate) 
                AND ([px_close]-[px_open])<0)/@DAYS
    SET @RS = @AG/ABS(@AL)
    SELECT @StockID AS Ticker, @EndingDate AS Date, 100 - (100/(1+@RS)) RSI

Aquí está mi resultado:

Ticker  Date        RSI
ACE    2018-04-03   48.7307

¿Cómo puedo calcular el RSI para múltiples fechas y múltiples tickers?

Mostrar la mejor respuesta
Avatar S3S
Respuesta aceptada

No es necesario configurar todo esto en variables. Simplemente puede agregar la fecha y el teletipo al grupo por y evitar las subconsultas redundantes... algo como:

SELECT 
    [Ticker]
    ,[Date]
    ,AG = SUM(case when (isnull([px_close],0)-isnull([px_open],0))>0 then (isnull([px_close],0)-isnull([px_open],0)) end) / @days
    ,AL = SUM(case when (isnull([px_close],0)-isnull([px_open],0))<0 then (isnull([px_close],0)-isnull([px_open],0)) end) / @days
    ,RS = (SUM(case when (isnull([px_close],0)-isnull([px_open],0))>0 then (isnull([px_close],0)-isnull([px_open],0)) end) / @days) /  ABS(SUM(case when (isnull([px_close],0)-isnull([px_open],0))<0 then (isnull([px_close],0)-isnull([px_open],0)) end) / @days)
    ,RSI = 100 - (100/(1+(SUM(case when (isnull([px_close],0)-isnull([px_open],0))>0 then (isnull([px_close],0)-isnull([px_open],0)) end) / @days) /  ABS(SUM( case when (isnull([px_close],0)-isnull([px_open],0))<0 then (isnull([px_close],0)-isnull([px_open],0)) end) / @days)))
FROM 
    [dbo].[daily_data]
WHERE 
    [Ticker] = @STOCKID
    AND ([Date] BETWEEN @StartingDate AND @EndingDate) 
group by
    [Ticker],[Date]

Elimine [Ticker] = @STOCKID de la cláusula where para devolver todos los Tickers

Mensaje 102, nivel 15, estado 1, línea 20 Sintaxis incorrecta cerca de ')'.

,AG = SUMA (caso cuando ([px_close]-[px_open])>0) luego [px_close]-[px_open] end) / @days

¿Me falta un paréntesis izquierdo?

Ahora obtengo NULLS para RS y RSI

Avatar S3S

Eso es porque hay valores nulos en [px_close] o [px_open]. Hice un cambio. Lo siento, es un poco difícil de seguir sin datos de muestra y resultados esperados.

Gracias. Trabajando a través de algunos problemas. Me acabo de dar cuenta de que el código original no se limitaba a la retrospectiva de 14 días

Avatar S3S

¿Problemas con tus datos o me duelen las manos? ¿Funcionó como querías?

Todavía obtengo NULLS para RS y RSI. Pero primero quiero recorrer mi código original y luego publicaré datos de muestra y el resultado esperado

Avatar S3S

Eso es justo. Cerraría este y abriría uno nuevo o es posible que no obtenga muchas vistas