Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Calculando retornos vinculados geometricamente no SQL SERVER 2008


Você tem duas opções para obter um produto no SQL Server.

1. Simule usando logs e expoentes:

SQL Fiddle
create table returns
(
  returnDate date,
  returnValue float
)

insert into returns values('05/31/06', -0.002271835)
insert into returns values('06/30/06', -0.001095986)
insert into returns values('07/31/06', 0.006984908)
insert into returns values('08/31/06', 0.014865360)
insert into returns values('09/30/06', 0.008938896)

select totalReturn = power
  (
    cast(10.0 as float)
    , sum(log10(returnValue + 1.0))
  ) - 1
from returns;

with tr as
(
  select totalReturn = power
  (
    cast(10.0 as float)
    , sum(log10(returnValue + 1.0))
  ) - 1
  , months = cast(count(1) as float)
  from returns
)
select annualized = power(totalReturn + 1, (1.0 / (months / 12.0))) - 1
from tr;

Isso aproveita logs e expoentes para simular um cálculo de produto. Mais informações:Funções definidas pelo usuário .

O único problema aqui é que ele falhará para retorno <-100%. Se você não espera isso, tudo bem, caso contrário, você precisará definir quaisquer valores <100% a -100%.

Você pode usar esse retorno real para obter um retorno anualizado conforme necessário.

2. Defina um agregado personalizado com CLR:

Consulte Manuais Online .

Você pode criar uma função personalizada CLR e vinculá-la a um agregado para uso em suas consultas. Isso é mais trabalhoso e você terá que habilitar CLRs em seu servidor, mas uma vez feito isso, você poderá usá-lo o quanto for necessário.