Cálculos financeiros, consultas SQL e o mercado de ações – Parte II

Bom Dia Pessoal,

Continuando a série de artigos sobre cálculos financeiros, consultas SQL e o mercado de ações, hoje serão trabalhados dados reais relacionados aos pápeis que são negociados no Ibovespa. A parte I foi apenas uma introdução para exercitar cálculos comuns exigidos em aplicações financeiras. Dessa vez iremos aprofundar mais em alguns conceitos bem como nos códigos utilizados para recuperar informações.

A rentabilidade acumulada

No último artigo, expliquei o conceito de rentabilidade e que ele sempre irá comparar uma situação passada com uma situação atual para mensurar o tamanho do ganho (ou da perda). Podemos também comparar uma situação atual com uma situação futura para fins de estimativa e projeções da rentabilidade. De fato ela sempre irá envolver situações em momentos diferentes. É possível fazer um investimento no início do ano e auferir a rentabilidade ao término de seis meses, ou ainda no fim do ano ou quem sabe após três anos. É nessas horas que a pergunta muito comum vem à tona: "Mas juntando tudo quanto que você já ganhou ?" Se formos pensar em termos de lucro, a resposta seria uma quantidade em reais, dólares ou alguma unidade contábil. Esse é o ponto negativo de mensurações absolutas. Não é muito significativo dizer "Desde o ínicio consegui R$ 10 mil reais". Como se não bastasse a ausência de uma unidade de tempo, R$ 10 mil reais é um ótimo lucro para alguém que começou com R$ 5 mil, mas pode ser desprezível para quem tem um montante de R$ 1 milhão. Um termo mais relativo como 50%, 100%, etc talvez forneça uma resposta mais significativa (descartando-se a variável tempo que faz completa diferença).

Na verdade, a pergunta poderia ser melhor formulada para: "Quanto em termos percentuais você conseguiu e desde quando você investe ?". As variáveis rentabilidade e tempo estão presentes e fornecem condições muito melhores para avaliar a qualidade do investimento (além de não constranger quem vai responder, pois, como a rentabilidade é relativa, em princípio não faz diferença desconhecer o montante inicial). Respostas como 30% em um ano ou 3% em um mês são excelentes formas de comparação. Podemos de forma bem rudimentar afirmar que o investimento que renda 3% ao mês é mais interessante, pois, em um ano ele renderá nominalmente 36% que é uma situação melhor do que 30% ao ano. Os cálculos não são exatamente dessa maneira, mas mostra que termos relativos tendem a ser melhor comparados que termos absolutos.

Normalmente em diversos investimentos, mostra-se a série histórica de rentabilidade em uma unidade temporal conhecida (tipicamente meses ou anos) e uma rentabilidade que acumule os valores anteriores. A tabela abaixo mostra os valores das ações ordinárias do Banco do Brasil (BBAS3):

Trimestre

Valor

Rent.

Cálculo Rentabilidade

R.A.

Cálculo R.A.

01/2006

R$ 27,75

0,00%

(27,75 – 27,75) / 27,75

0,00%

((1 + 0,00%) * (1 + 0,00%)) – 1

02/2006

R$ 24,99

-9,95%

(24,99 – 27,75) / 27,75

-9,95%

((1 + 0,00%) * (1 – 9,95%)) – 1

03/2006

R$ 23,75

-4,96%

(23,75 – 24,99) / 24,99

-14,41%

((1 – 9,95%) * (1 – 4,96%)) – 1

04/2006

R$ 32,00

34,74%

(32,00 – 23,75) / 23,75

15,32%

((1 – 14,41%) * (1 + 34,74%)) – 1

01/2007

R$ 33,35

4,22%

(33,35 – 32,00) / 32,00

20,18%

((1 + 15,32%) * (1 + 4,22%)) – 1

02/2007

R$ 27,89

-16,37%

(27,89 – 33,35) / 33,35

0,50%

((1 + 20,18%) * (1 – 16,37%)) – 1

03/2007

R$ 30,89

10,76%

(30,89 – 27,89) / 27,89

11,32%

((1 + 0,50%) * (1 + 10,76%)) – 1

04/2007

R$ 30,40

-1,59%

(30,40 – 30,89) / 30,89

9,55%

((1 + 11,32%) * (1 – 1,59%)) – 1

01/2008

R$ 23,11

-23,98%

(23,11 – 30,40) / 30,40

-16,72%

((1 + 9,55%) * (1 – 23,98%)) – 1

02/2008

R$ 26,15

13,15%

(26,15 – 23,11) / 23,11

-5,77%

((1 – 16,72%) * (1 + 13,15%)) – 1

03/2008

R$ 22,75

-13,00%

(22,75 – 26,15) / 22,75

-18,01%

((1 – 5,77%) * (1 – 13,00%)) – 1

A tabela pode parecer confusa. Não sei se as fórmulas facilitam ou dificultam a compreensão, mas antes do primeiro comando TSQL, vamos ao reforço dos conceitos e entendimento das fórmulas. Não se preocupe se você não entender a demonstração de algumas fórmulas. Se isso acontecer é porque provavelmente o perfil é de um desenvolvedor, DBA ou algum outro profissional de TI e não de um matemático, economista, contador, administrador, estatístico ou algo do tipo. Se apenas a primeira parte ficar clara e as demonstrações ainda ficarem confusas, sugiro partir para o TSQL.

Como a análise da situação do papel BBAS3 é a partir do 1º trimestre de 2006, esse é o ponto de partida. Comparar o quanto o papel BBAS3 melhorou do 1º trimestre de 2006 em relação ao 1º trimestre de 2006 é muito simples. Não há nenhuma melhora, pois, esse é o ponto de partida. A rentabilidade naturalmente será igual a zero. Idem para a rentabilidade acumulada.

Já no 2º trimestre de 2006 houve uma queda no valor desse papel. Anteriormente ele valia R$ 27,75 e declinou para R$ 24,99. Não é preciso muitas contas para descobrir que a rentabilidade foi negativa, pois, o papel diminuiu o seu valor. Como a rentabilidade é melhor expressa em termos relativos, precisamos avaliar o tamanho dessa queda. Se dividirmos 24,99 por 27,75 obteremos o valor de 90,05% (ou 0,9005). Isso significa que no 2º trimestre de 2006, o papel manteve 90,05% do valor original. Se considerarmos o valor original como 100% e o valor atual como 90,05% do valor original, podemos calcular que a perda foi de 9,95%. Em outras palavras, bastaria utilizar a seguinte fórmula: (Valor Atual – Valor Anterior) / Valor Anterior. Como foi apurado apenas 1 período, a rentabilidade acumulada também será de -9,95%.

No 3º trimestre de 2006 houve uma outra queda no valor do papel. Anteriormente ele estava cotado em R$ 24,99 e posteriormente caiu para R$ 23,75. Utilizando a fórmula anterior, obtem-se a rentabilidade de -4,96% através do cálculo (23,75 – 24,99) / 24,99. Essa rentabilidade é referente ao período entre o 2º trimestre e o 3º trimestre de 2006. Ela não deixa de ser um dado útil, mas o ponto de partida é o 1º trimestre de 2006 e não o 2º trimestre. É possível calcular a rentabilidade com uma simples conta. Ao invés de referenciar a cotação do 2º trimestre (R$ 24,99) como valor anterior pode-se referenciar a cotação do 1º trimestre de 2006. Se fizermos o cálculo (23,75 / 27,75) / 27,75 obtem-se -14,41% que significa que entre o 1º trimestre de 2006 e o 3º trimestre o papel declinou 14,41%.

A fórmula que está sendo exibida na tabela para o cálculo da rentabilidade acumulada é uma fórmula alternativa cujo funcionamento é um pouco mais complexo. O valor do papel no 1º trimestre de 2006 é de R$ 27,75 e de R$ 24,99 no 2º trimestre de 2006. A rentabilidade calculada foi de -9,95%. Com base nessa rentabilidade, podemos fazer a prova real. Se multiplicarmos o valor do ativo no 1º trimestre de 2006 (R$ 27,75) pela rentabilidade de 9,95% teremos o valor da queda, ou seja, 2,76. Subtraindo 2,76 de 27,75 obtem-se o valor de 24,99. Pela prova real podemos afirmar que o valor atual é igual ao valor passado somado à multiplicação do valor passado pela rentabilidade. Ex: 24,99 = (27,75 + (27,55 * -9,95%)). Se colocarmos o valor passado em evidência, obtemos que o valor atual é igual ao valor passado multiplicado pela soma de uma unidade mais a rentabilidade. Ex: 24,99 = 27,75 * (1 – 9,95%). Se chamarmos o valor atual de VF, o valor passado de VP e o rentabilidade de R poderíamos dizer que VF = VP * (1 + R). Isso também nos permite afimar que R = (VF / VP) – 1.

Utilizando o raciocínio anterior é possível calcular a rentabilidade acumulada do 3º trimestre de 2006. Serão adotadas as seguintes variáveis

  • Valor do papel no papel no 1º trimestre de 2006 (V1)
  • Valor do papel no papel no 2º trimestre de 2006 (V2)
  • Valor do papel no papel no 3º trimestre de 2006 (V3)
  • Rentabilidade do papel no 2º trimestre de 2006 (R2)
  • Rentabilidade do papel no 3º trimestre de 2006 (R3)
  • Rentabilidade acumulada do papel no 3º trimestre de 2006 (R1-3)

Algumas conclusões matemáticas podem ser deduzidas

  • Se V2 = V1 * (1 + R2) e V3 = V2 * (1 + R3) então  V3 = (V1 * (1 + R2)) * (1 + R3)
  • Se R1-3 = (V3 – V1) / V1 então (V3 – V1) = R1-3 * V1 e R1-3 = (V3 / V1) – 1
  • Se R1-3 = (V3 / V1) – 1 então R1-3 + 1 = (V3 / V1)
  • Se R1-3 + 1 = (V3 / V1) e V3 = (V1 * (1 + R2)) * (1 + R3) então R1-3 + 1 = (V1 * (1 + R2)) * (1 + R3) / V1
  • Se R1-3 + 1 = (V1 * (1 + R2)) * (1 + R3) / V1 então R1-3 + 1 = (1 + R2) * (1 + R3)
  • Se R1-3 + 1 = (1 + R2) * (1 + R3) então R1-3 = ((1 + R2) * (1 + R3)) – 1

Essa demonstração matemática nos diz que a rentabilidade acumulada de um período pode ser calculada multiplicando-se (1 + R) de todos os períodos anteriores. Da mesma forma que foi possível obter a rentabilidade acumulada do 3º trimestre de 2006 de -14,41% subtraindo 27,75 de 23,75 e dividindo-se o resultado por 27,75 é possível demonstrar que essa rentabilidade acumulada poderia ser calculada com as demais rentabilidades. Ex: -14,41% = ((1 – 9,95%) * (1 – 4,96%)) – 1. A tabela abaixo mostra os cálculos das rentabilidades acumuladas seguindo esse raciocínio (apenas os quatro primeiros trimestres):

Trimestre

Valor

Rent.

Cálculo R.A. (Modo I)

R.A.

Cálculo R.A. (Modo II)

01/2006

R$ 27,75

0,00%

(27,75 – 27,75) / 27,75

0,00%

((1 + 0,00%) * (1 + 0,00%)) – 1

02/2006

R$ 24,99

-9,95%

(24,99 – 27,75) / 27,75

-9,95%

((1 + 0,00%) * (1 – 9,95%)) – 1

03/2006

R$ 23,75

-4,96%

(23,75 – 27,75) / 27,75

-14,41%

((1 – 9,95%) * (1 – 4,96%)) – 1

04/2006

R$ 32,00

34,74%

(32,00 – 27,75) / 27,75

15,32%

((1 – 9,95%) * (1 – 4,96%) * (1 + 34,74%)) – 1

Os mais incrédulos podem fazer a conta para ver que o resultado fecha. A coluna que mostra a segunda forma de realizar o cálculo está um pouco diferente da tabela anterior. O cálculo da rentabilidade acumulada do 4º trimestre de 2006 é "((1 – 9,95%) * (1 – 4,96%) * (1 + 34,74%)) – 1" enquanto que na primeira tabela é "((1 – 14,41%) * (1 + 34,74%)) – 1". Bem, aqui podemos fazer mais algumas conclusões:

  • Se ((1 – 9,95%) * (1 – 4,96%)) – 1 = -14,41% então ((1 – 9,95%) * (1 – 4,96%)) = 1 – 14,41%
  • Se ((1 – 9,95%) * (1 – 4,96%)) = 1 – 14,41% então ((1 – 9,95%) * (1 – 4,96%) * (1 + 34,74%)) – 1 = ((1 – 14,41%) * (1 + 34,74%)) – 1

O que fiz foi uma mera substuição, mas revela uma demonstração de outro raciocínio.

  1. R1-3 = ((1 – 9,95%) * (1 – 4,96%)) – 1
  2. R1-3 + 1 = ((1 – 9,95%) * (1 – 4,96%))
  3. R1-4 = ((1 – 9,95%) * (1 – 4,96%) * (1 + 34,74%)) – 1
  4. R1-4 = ((R1-3 + 1) * (1 + 34,74%)) – 1

Sempre que desejarmos obter a rentabilidade acumulada de um período, basta multiplicar a soma da rentabilidade atual mais uma unidade pelo produto da rentabilidade acumulada do período anterior e desse resultado subtrair uma unidade. Agora que as explicações financeiras e matemáticas foram expostas, vejamos como realizar uma consulta para retornar os cálculos de rentabilidade. Naturalmente um script é necessário. Irei utilizar o mesmo papel demonstrado. Como a apuração foi trimestral, irei utilizar o último dia de cada trimestre como referência.

— Cria a tabela BBAS3
CREATE TABLE BBAS3 (Data SMALLDATETIME, Valor DECIMAL (4,2))

— Insere as cotações
INSERT INTO BBAS3 (Data, Valor) VALUES (‘20060331’,27.75)
INSERT INTO BBAS3 (Data, Valor) VALUES (‘20060630’,24.99)
INSERT INTO BBAS3 (Data, Valor) VALUES (‘20060930’,23.75)
INSERT INTO BBAS3 (Data, Valor) VALUES (‘20061231’,32.00)
INSERT INTO BBAS3 (Data, Valor) VALUES (‘20070331’,33.35)
INSERT INTO BBAS3 (Data, Valor) VALUES (‘20070630’,27.89)
INSERT INTO BBAS3 (Data, Valor) VALUES (‘20070930’,30.89)
INSERT INTO BBAS3 (Data, Valor) VALUES (‘20071231’,30.40)
INSERT INTO BBAS3 (Data, Valor) VALUES (‘20080331’,23.11)
INSERT INTO BBAS3 (Data, Valor) VALUES (‘20080630’,26.15)
INSERT INTO BBAS3 (Data, Valor) VALUES (‘20080930’,22.75)

O primeiro passo seria obter a relação dos valores atuais e seus anteriores para poder calcular a rentabilidade, as consultas abaixo mostram algumas dessas possibilidades.

— Subqueries
SELECT Data, Valor As ValorAtual,
    ISNULL((SELECT TOP 1 Valor FROM BBAS3 As TInt
    WHERE TInt.Data < TOut.Data
    ORDER BY TInt.Data DESC),Valor) As ValorAnterior
FROM BBAS3 As TOut

— Outer Apply
SELECT
    TOut.Data, TOut.Valor As ValorAtual,
    ISNULL(TInt.Valor,TOut.Valor) As ValorAnterior
FROM
    BBAS3 As TOut
    OUTER APPLY (
                SELECT TOP 1 Valor
                FROM BBAS3 As TInt
                WHERE TInt.Data < TOut.Data
                ORDER BY TInt.Data DESC) As TInt

O uso do ISNULL faz-se necessário, pois, no ponto de partida (o 1º trimestre de 2006) não há referência anterior e nesse caso o valor é repetido. Agora que o valor anterior é conhecido é possível calcular a rentabilidade.

;WITH Resultados As (
SELECT Data, Valor As ValorAtual,
    ISNULL((SELECT TOP 1 Valor FROM BBAS3 As TInt
    WHERE TInt.Data < TOut.Data
    ORDER BY TInt.Data DESC),Valor) As ValorAnterior
FROM BBAS3 As TOut)

SELECT
    Data, ValorAtual, ValorAnterior,
    ((ValorAtual – ValorAnterior) / ValorAnterior) As Rent
FROM Resultados

Os cálculos da rentabilidade são expressos conforme a tabela do ínicio do artigo. Uma vez que o período de referência seja o referente a primeira cotação é possível fazer o cálculo da rentabilidade acumulada pela primeira fórmula, ou seja, dividindo-se o valor atual pelo valor do ponto de partida e subtraindo uma unidade desse resultado.

DECLARE @ValorInicial DECIMAL(4,2)
SET @ValorInicial = (SELECT TOP 1 Valor FROM BBAS3 ORDER BY Data ASC)

;WITH Resultados As (
SELECT Data, Valor As ValorAtual,
    ISNULL((SELECT TOP 1 Valor FROM BBAS3 As TInt
    WHERE TInt.Data < TOut.Data
    ORDER BY TInt.Data DESC),Valor) As ValorAnterior
FROM BBAS3 As TOut)

SELECT
    Data, ValorAtual, ValorAnterior,
    ((ValorAtual – ValorAnterior) / ValorAnterior) As Rent,
    (ValorAtual / @ValorInicial) – 1 As RA
FROM Resultados

É visível que o resultado final se assemelha muito a tabela no início do artigo. Se forem desconsideradas as casas decimais e uma aproximação for feita bem como uma conversão para o trimestre e a formatação em percentual, os mesmos resultados sãoobtidos. Em todo caso, isso seria perfeito para a camada de apresentação e não para o banco de dados.

Data

ValorAtual

Rentabilidade

R.A.

31/03/2006

R$ 27,75

0.0000000

0.0000000

30/06/2006

R$ 24,99

-0.0994594

-0.0994595

30/09/2006

R$ 23,75

-0.0496198

-0.1441442

31/12/2006

R$ 32,00

0.3473684

0.1531531

31/03/2007

R$ 33,35

0.0421875

0.2018018

30/06/2007

R$ 27,89

-0.1637181

0.0050450

30/09/2007

R$ 30,89

0.1075654

0.1131531

31/12/2007

R$ 30,40

-0.0158627

0.0954954

31/03/2008

R$ 23,11

-0.2398026

-0.1672073

30/06/2008

R$ 26,15

0.1315447

-0.0576577

30/09/2008

R$ 22,75

-0.1300191

-0.1801802

Os cálculos estão corretos. São simples e refletem as rentabilidades por período e rentabilidades acumuladas das ações ordinárias do Banco do Brasil entre o 1º trimestre de 2006 e o 3º trimestre de 2008 (ocasião em que a bolha imobiliária dos EUA já estava bem acentuada). Para que a rentabilidade acumulada do papel pudesse ser calculada foi necessário as cotações prévias dos períodos de interesse. De fato conhecer essas cotações torna os cálculos mais simples e certamente bem mais performáticos. Mas e quando os valores dos papéis não forem conhecidos ? Como calcular a rentabilidade acumulada apenas em função das rentabilidades de cada período ?

— Cria uma tabela com as rentabilidades e os períodos
CREATE TABLE BBAS3_Rent (Data SMALLDATETIME, Rent DECIMAL(6,4))

;WITH Resultados As (
SELECT Data, Valor As ValorAtual,
    ISNULL((SELECT TOP 1 Valor FROM BBAS3 As TInt
    WHERE TInt.Data < TOut.Data
    ORDER BY TInt.Data DESC),Valor) As ValorAnterior
FROM BBAS3 As TOut)

— Insere os registros na tabela de rentabilidade
INSERT INTO BBAS3_Rent (Data, Rent)
SELECT
    Data, CAST(((ValorAtual – ValorAnterior) / ValorAnterior) As DECIMAL(6,4))
FROM Resultados

— Exibe os resultados
SELECT Data, Rent FROM BBAS3_Rent

As informações de rentabilidade agora são consolidadas e exibidas conforme o quadro abaixo:

Data

Rentabilidade

31/03/2006

0.0000

30/06/2006

-0.0995

30/09/2006

-0.0496

31/12/2006

0.3474

31/03/2007

0.0422

30/06/2007

-0.1637

30/09/2007

0.1076

31/12/2007

-0.0159

31/03/2008

-0.2398

30/06/2008

0.1315

30/09/2008

-0.1300

Muitas vezes, os dados disponíveis dizem respeito apenas as rentabilidades do papel. No quadro acima não temos qualquer informação sobre o valor do papel nos períodos informados. Se as cotações do papel não estão disponíveis, como obter a rentabilidade acumulada ? E se o gestor desejar saber quanto o papel subiu ou declinou em termos percentuais em um dado período ? Essa pergunta faz todo o sentido, pois, se um investidor faz um aporte de R$ 1 milhão ou de R$ 1000,00 a taxa de 5% de rentabilidade acumulada será sempre 5% independente se o investidor fez o aporte de R$ 1 milhão ou de R$ 1000,00 uma vez que a valorização ou desvalorização do papel irá ocorrer independente disso.

Nas deduções anteriores, foi demonstrado que podemos obter a rentabilidade acumulada através da multiplicação das rentabilidades acrescidas de uma unidade. Essa mesma explicação está na tabela no início do artigo. De fato a rentabilidade acumulada em 31/12/2006 poderia ser obtida através da multiplicação abaixo:

RA (31/12/2006) = ((1 + 0.0000) * (1 – 0,0995) * (1 – 0,0496) * (1 + 0,3474)) – 1

O raciocínio matemático é factível de entender, mas o grande problema é a limitação da SQL. A função SUM é capaz de somar os valores, mas a SQL não possui uma função MULTIPLY ou PRODUCT disponível. Assim sendo como efetuar esse cálculo ? Existem alternativas, mas para não aumentar ainda mais a dose de complexidade do artigo, farei de uma maneira um pouco mais trivial. Uma function pode ser muito bem vinda.

— Cria uma função de multiplicação
CREATE FUNCTION dbo.Multiplica (@Data SMALLDATETIME)
RETURNS DECIMAL(6,4)
AS
BEGIN

— Declara a variável para cálculo da rentabilidade acumulada
DECLARE @RA DECIMAL(6,4)
SET @RA = 1

SELECT @RA = @RA * (1 + Rent) FROM BBAS3_Rent
WHERE Data <= @Data

SET @RA = @RA – 1

RETURN (@RA)

END

— Retorna a rentabilidade e a rentabilidade acumulada
SELECT Data, Rent, dbo.Multiplica(Data) As RA FROM BBAS3_Rent

Com apenas um detalhe de arredondamento, a rentabilidade acumulada foi retornada corretamente 

Data

Rentabilidade

RA

31/03/2006

0.0000

0.0000

30/06/2006

-0.0995

-0.0995

30/09/2006

-0.0496

-0.01442

31/12/2006

0.3474

0.1531

31/03/2007

0.0422

0.2018

30/06/2007

-0.1637

0.0051

30/09/2007

0.1076

0.1132

31/12/2007

-0.0159

0.0955

31/03/2008

-0.2398

-0.1672

30/06/2008

0.1315

-0.0577

30/09/2008

-0.1300

-0.1802

A lógica normal para a construção da função seria um loop, mas em nenhum momento um WHILE foi construído e mesmo assim a rentabilidade acumulada foi retornada corretamente. Isso se deve a um "bug" no uso do SELECT para atribuição de variáveis, mas que beneficiou a solução. Se a data de 31/12/2006 (20061231 na tabela) for informada, a cláusula SELECT deve retornar quatro registros (há quatro linhas cuja data é menor ou igual a 31/12/2006). A atribuição @RA = @RA * Rent faz o loop automaticamente pelas linhas e acumula a variável fazendo com que a multiplicação fique correta. Ao final é diminuida uma unidade para que o cálculo fique correto. Esse comportamento em alguns momentos é útil, mas pode ser que em versões futuras ele seja descontinuado. O mais correto (porém mais trabalhoso) é codificar a function da forma abaixo:

— Cria uma função de multiplicação
ALTER FUNCTION dbo.Multiplica (@Data SMALLDATETIME)
RETURNS DECIMAL(6,4)
AS
BEGIN

— Declara a variável para cálculo da rentabilidade acumulada
— Declara a variável para iterar entre o período necessário
DECLARE @RA DECIMAL(6,4), @DataRef SMALLDATETIME
SET @RA = 1
SET @DataRef = (SELECT TOP 1 Data FROM BBAS3_Rent
                WHERE Data <= @Data ORDER BY Data ASC)

WHILE @DataRef <= @Data
BEGIN

    SET @RA = @RA * (SELECT TOP 1 (1 + Rent) FROM BBAS3_Rent
                    WHERE Data >= @DataRef ORDER BY Data ASC)

    SET @DataRef = (SELECT TOP 1 Data FROM BBAS3_Rent
                    WHERE Data > @DataRef ORDER BY Data ASC)

END

SET @RA = @RA – 1

RETURN (@RA)

END

— Retorna a rentabilidade e a rentabilidade acumulada
SELECT Data, Rent, dbo.Multiplica(Data) As RA FROM BBAS3_Rent

Essa function permite o cálculo da rentabilidade acumulada sem dependência das cotações do papel. Os cálculos apresentados podem mostrar-se complexos e a tentação de utilizar um cursor é possivelmente muito maior do que a disposição de entender o raciocínio matemático. Pode-se argumentar que se uma análise for feita no código da function é nítido que seu comportamento iterativo é idêntico a um cursor, ou seja, varre-se linha a linha para calcular a rentabilidade acumulada. Embora essa construção ainda seja mais eficiente que um cursor, é fato que para cada data vários registros serão lidos várias vezes e esse comportamento iterativo irá denegrir o desempenho assim como o cursor. No próximo artigo, demonstrarei uma alternativa em SQL ANSI cujo desempenho é superior ao da function.

Admito que entender o mercado financeiro pode ser tão difícil quanto as cláusulas SQL apresentadas aqui. Entretanto estou certo que a principal dificuldade é internalizar os conceitos, pois, sem a clareza dos mesmos, as consultas podem parecer construções sem muito sentido. À medida que os conceitos tornam-se mais familiares certamente as consultas também ficarão mais fáceis.

Aos DBAs investidores do Banco do Brasil, a pior parte talvez não seja entender como realizar o cálculo usando a SQL, mas sim descobrir que após pouco mais de dois anos, perdeu-se 18,01%. Aos especuladores, houve possibilidades de ganho de 34% em três meses. Assim como a SQL, mercado financeiro requer estudo e preparo para análises mais avançadas.

[ ]s,

Gustavo

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s