SAUDAÇÕES!

Seja bem vindo à página do professor Pedro Albuquerque. Para saber mais sobre meu currículo, disciplinas ministradas e interesses de pesquisa, navegue no menu disponível no topo da página.

terça-feira, 4 de dezembro de 2012

Estudo mapeia perfil do Administrador brasileiro.




Pesquisa foi realizada pelo Conselho Federal de Administração em parceria com a FIA


Homem jovem, com renda mensal entre 3,1 a 10 salários mínimos, empregados de empresas de grande porte do setor privado. Esse é o perfil do Administrador de Empresas revelado pela “Pesquisa Nacional sobre o Perfil, Formação, Atuação e Oportunidades de Trabalho do Administrador 2011”. O levantamento realizado pelo Conselho Federal de Administração (CFA) em parceria com a Fundação Instituto de Administração (FIA) acaba de ser divulgado e aponta tendências para a profissão de Administrador no país.

A pesquisa ouviu mais de 21.110 pessoas em todo o país entre Administradores, professores e coordenadores do curso de Administração e empresários. Apesar do levantamento apontar que a maioria – 65% - é formada por homens, a pesquisa revela que participação feminina é crescente na profissão, tendo elas atingido 35% de participação em 2011.

Para 25,41% dos 17.982 Administradores entrevistados o que motivou a escolha do curso de Administração foi o interesse em ter uma formação generalista e abrangente. “Hoje em dia a pessoa está mais preocupada com as oportunidades que o mercado de trabalho vai oferecer. Por isso, a vocação já não pesa na hora de decidir a carreira”, justifica o presidente do CFA, Adm. Sebastião Luiz de Mello.

Outro dado relevante é que a remuneração mensal do Administrador, em termos do total Brasil, situa-se entre 3,1 e 10 salários mínimos (43,37%), com a média aproximada de 9,75 salários mínimos. No entanto, foram observadas diferenças significativas na remuneração entre gêneros, empresas públicas e privadas, empresas micros, pequenas, médias e grandes e entre regiões do país.

O setor privado ainda é o que mais emprega Administradores de Empresa (58%). Nesse segmento, a maioria dos entrevistados – 46% - afirmou que trabalha em empresa de grande porte e 21,84% dos profissionais ocupam cargo de gerência.

Áreas de atuação - Cerca de 85% dos Administradores estão concentrados nas áreas de serviços em geral, indústria, comércio varejista, consultoria empresarial, instituições financeiras e serviços hospitalares e da saúde. O setor de serviços continuou sendo o que emprega maior número de Administradores, seguido do industrial.

Formação – Dos Administradores entrevistados pela Pesquisa, 84,18% concluíram o curso de Administração em instituição de ensino superior privada e informaram que o curso atendeu suas expectativas. Se, por um lado, os Administradores declaram-se satisfeitos com o que aprenderam nos cursos de graduação, por outro demonstraram ter encontrado dificuldades quando de seu ingresso no mercado de trabalho, pela falta de conteúdos nas disciplinas que os aproximassem das práticas.

O desenvolvimento do empreendedorismo, a gestão ambiental/ desenvolvimento sustentável e a gestão pública também foram indicados como novos conteúdos capazes de dinamizarem os projetos pedagógicos dos cursos de Administração. Já a Educação a Distância (EAD), apesar de estar em expansão, ela ainda não é bem aceita como modalidade de ensino, na opinião dos Administradores e dos Coordenadores/Professores participantes da pesquisa.

Com relação aos cursos de pós-graduação a maioria dos Administradores que participaram da pesquisa possui curso de especialização (75,33%) e pretende continuar seu aprendizado e atualização nas áreas da administração.

Características profissionais – A Pesquisa realizada pelo CFA aponta que o Administrador é um profissional com visão ampla da organização, tendo sido apontada como a característica predominante na sua identidade profissional pelos três segmentos da pesquisa: Administradores, Coordenadores/Professores de Administração, Empresários/Empregadores.

O comportamento ético é a atitude mais valorizada pelos entrevistados. Saber administrar pessoas e equipes e ter bom relacionamento interpessoal são as competências e habilidades apontadas como essenciais entre o público da pesquisa.

Tendências - Os empresários entendem que, nos próximos cinco anos, as áreas mais promissoras para a contratação de Administradores são: serviços, administração pública direta e indireta e indústria. “Na fase da pesquisa qualitativa ficou claro, ainda, que existem oportunidades de trabalho para o Administrador como consultor nas micro e pequenas empresas”, destacou o presidente do CFA.

As áreas mais promissoras para a contratação de Administradores, em termos de resultados gerais para o Brasil, são as de consultoria empresarial, serviços em geral e administração pública indireta, tendo, no entanto, sido observadas significativas diferenças regionais. Na Região Centro-Oeste, por exemplo, há uma crescente oportunidade na área do agronegócio. Já na Região Norte, umas das áreas com potencial para empregar Administradores é a do Comércio Atacadista.

Segundo Sebastião Mello, essa foi uma das maiores pesquisa, se não a maior realizada por meio da internet em todo o Brasil. “Tivemos participação maciça dos profissionais de Administração. Por meio da pesquisa conseguimos levantar informações sobre o ensino da Administração, as tendências profissionais para os Administradores, entre outros. Um verdadeiro raio X”, afirmou.

Ações do Sistema CFA/CRAs - Uma vez traçado o raio X da profissão, o Sistema CFA/CRAs, de posse desses dados, delineará ações a curto, médio e longo prazos para melhorar ainda mais esse cenário, além de promover e dignificar a profissão e o ensino da Administração de todo o país. “É nossa missão propor iniciativas coerentes com a realidade, mas antecipando futuro já que a expansão dos mercados mundiais é um desafio e, para estar preparado às mudanças, precisamos pensar em diretrizes de desenvolvimento para os profissionais de Administração”, diz Sebastião Mello, ressaltando que a pesquisa também servirá de guia para gestores públicos e privados, professores e profissionais de Administração que desejarem fazer a diferença.

Todos os dados da “Pesquisa Nacional sobre o Perfil, Formação, Atuação e Oportunidades de Trabalho do Administrador 2011” está disponível no endereço http://pesquisa.cfa.org.br. O acesso é gratuito.

Fonte:CFA.

terça-feira, 27 de novembro de 2012

Programação Linear no R.


A programação linear possui muitas aplicações nas Ciências Sociais e Exatas.

Nesse post mostrarei como solucionar problemas de programação linear no R por meio da biblioteca lpSolveAPI.

Considere o seguinte problema de programação linear:


O primeiro passo no R para a resolução desse problema é invocar a biblioteca lpSolveAPI, para isso utilizamos o seguinte comando:

#Chama a biblioteca
library(lpSolveAPI)

Como o problema possui somente duas variáveis vamos criá-lo com o nome de modelo.lp1 inicialmente sem nenhuma restrição:

#Define a criação de um modelo com 0 restrições e 2 variáveis
modelo.lp1 <- make.lp(0, 2)

#Dá o nome ao problema de programação linear
name.lp(modelo.lp1, "Exemplo 1 - Aula de MMQD 1")
Note que o comando make.lp recebe dois argumentos, o primeiro informa quantas restrições existem no problema e o segundo quantas variáveis. Inicialmente, colocamos zero restrições pois iremos adicioná-las dinamicamente nos próximos passos. Já o comando name.lp recebe dois argumentos, o primeiro argumento é o objeto modelo.lp1 que nós criamos e o segundo é o nome (ou descrição) do problema. Uma vez definida as principais características do problema de programação linear precisamos definir o domínio das variáveis e o tipo de problema (maximização ou minimização). Como nosso problema é um problema de maximação, escrevemos:
#Define as características do modelo
lp.control(modelo.lp1, sense="max")
Nesse comando, atribuímos ao modelo.lp1 o sentido de Maximização (isso é sense=''max'') para a função objetivo. Caso desejássemos Minimizar ao invés de maximizar escreveríamos sense=''min''. Como a função objetivo é escrita na forma $Minimize: Z=5x_{1} +6x_{2}$ devemos informar ao R que os coeficientes da função objetivo são, $5$ e $6$ respectivamente. Isso é feito por meio da seguinte sintaxe:
#Define a função objetivo
set.objfn(modelo.lp1, c(5,6))
Em seguida, como o problema pode assumir valores $x_{1}\geq 0,x_{2}\geq 0$ atribuímos os seguintes limites para as variáveis de decisão:
#Define os limites da região factível
set.bounds(modelo.lp1, lower = c(0,0), upper = c(Inf, Inf))

#Tipo das variáveis de decisão
set.type(modelo.lp1, c(1,2), type = c("real"))
No comando set.bounds informamos que a primeira variável possui limite inferior (lower) igual a zero e limite superior (upper) igual a infinito (Inf). O mesmo fazemos para a segunda variável, nesse caso dizemos que o limite inferior (lower) é igual a zero e o limite superior (upper) é igual a infinito (Inf). A ordem aqui importa, ou seja, caso a primeira variável estivesse contida entre zero e infinito e a segunda variável estivesse contida entre os valores 1 e 4 deveríamos escrever set.bounds(modelo.lp1, lower = c(0,1), upper = c(Inf, 4)). O comando set.type define o tipo de variável para cada uma das variáveis de decisão. É possível escolher as seguintes opções:
  1. integer - A variável só pode assumir valores inteiros.
  2. binary - A variável só pode assumir valores binários, isso é, 1 ou zero.
  3. real - A variável pode assumir valores nos reais.
O comando set.type informa ao objeto modelo.lp1 que as variáveis $x_{1}$ e $x_{2}$ (c(1,2)) são números reais. Mas o comando anterior, set.bounds diz ao R que as variáveis devem estar entre 0 e $\infty$, portanto, $x_{1}\geq 0$ e $x_{2}\geq 0$. O passo 3 é responsável pela adição das restrições no problema de Programação Linear. Vamos então adicionar uma restrição de cada vez. A primeira restrição é dada por: $x_{1} \le 6$ a qual pode ser escrita na forma $ 1x_{1}+0x_{2} \le 6$. Assim, a adição dessa restrição no objeto modelo.lp1 é feita da seguinte forma:
#Define os coeficientes da primeira restrição
coef1 <- c(1,0)

#Adiciona a restrição
add.constraint(modelo.lp1, coef1, "<=", 6)
Para a segunda restrição $2x_{2} \le 12\Rightarrow 0x_{1}+2x_{2} \le 12$, a adição é feita da seguinte forma:
#Define os coeficientes da segunda restrição
coef2 <- c(0,2)

#Adiciona a restrição
add.constraint(modelo.lp1, coef2, "<=", 12)
Finalmente, a última restrição $3x_{1}+2x_{2}\le 18$ é adicionada fazendo-se:
#Define os coeficientes da terceira restrição
coef3 <- c(3,2)

#Adiciona a restrição
add.constraint(modelo.lp1, coef3, "<=", 18)
Uma vez que o problema tenha sido configurado, todas as informações associadas a ele estão armazenadas no objeto modelo.lp1. Podemos visualizar essas informações fazendo:
#Mostra as informações do modelo
print(modelo.lp1)
Podemos também visualizar esse problema, uma vez que é um problema bidimensional, isso é, contém somente duas variáveis de decisão:
#Plota a região factível
plot(modelo.lp1)
Finalmente, para resolvê-lo, fazemos:
#Resolve o problema primal
solve(modelo.lp1)
resultado<-get.primal.solution(modelo.lp1)
print(resultado)
Entretanto, como os resultados não estão em um formato muito explicativo, vamos transformá-los em uma tabela (isso é um data.frame) e colocar títulos nas linhas e nas colunas:
#Transforma o resultado em uma tabela
solucao<-as.data.frame(resultado)

#Coloca os nomes nas colunas e nas linhas da tabela
names(solucao)<-c("Valores")
rownames(solucao)<-c("Função Objetivo", "Variável de folga 1","Variável de folga 2",
"Variável de folga 3","Solução X1", "Solução X2")

#Mostra os resultados com os nomes
print(solucao)

quinta-feira, 22 de novembro de 2012

Causalidade e Correlação


Causalidade é a relação entre um evento (a causa) e um segundo evento (o efeito), em que o segundo acontecimento é entendida como uma consequência do primeiro.

No uso comum, a causalidade é também a relação entre um conjunto de fatores (causas) e um fenômeno (o efeito). Qualquer coisa que afete um efeito, é denominada fator desse efeito. Um fator direto é um fator que afeta diretamente o efeito, isto é, sem quaisquer fatores intervenientes.

Compreender a relação causa-efeitoentre as variáveis ​​é de interesse primordial em muitos campos da ciência. Normalmente, a intervenção experimental é utilizada para avaliar estas relações.

Entre os métodos comuns para a avaliação da cause e efeito destacam-se:

  1. Variáveis Instrumentais.
  2. Equações estruturais.
  3. Redes Bayesianas.
  4. Modelos Gráficos.

Pacote pcalg


Suponha que temos um sistema descrito por algumas variáveis ​​e muitas observações obtidas deste sistema. Além disso, suponha que seja plausível a não existência de variáveis faltantes (omissão de variáveis) e também que no sistema não apresenta loops de feedback do sistema causal subjacente.

A estrutura causal de um sistema deste tipo pode ser convenientemente representado por um gráfico acíclico dirigido (DAG - Directed Acyclic Graph), em que cada nó representa uma variável e cada aresta representa uma causa direta.

Por exemplo, suponha o seguinte grafo:


Nesse exemplo, a variável 1 causa a variável 2 diretamente, ou seja é um fator direto para a variável 2 mas é um fator interveniente da variável 5.

Usualmente, não se conhece a relação entre as variáveis a não ser que algum modelo teórico seja desenvolvido para explicar a relação entre as variáveis, e mesmo nesse caso o modelo necessita ser validado.

O caso mais comum ocorre quando não há qualquer informação quanto ao comportamento causal dessas variáveis, nesse caso o objetivo é estimar essas relações e apresentar o grafo causal estimado.

Os modelos implementados no pacote pcalg são capazes de estimar o grafo causal das variáveis de uma base de dados mesmo que nenhum modelo seja conhecido a priori.

Os métodos implementados são o Algoritmo PC (Spirtes et al., 2000), Algoritmo FCI (Spirtes et al. ,1999), Algoritmo RFCI (Colombo et al., 2012) e o Método IDA (Maathuis et al., 2009).

Alguns pressupostos para cada um dos algoritmos implementados no pacote pcalg são apresentados abaixo:

  • Algoritmo PC: Nenhuma variável oculta existe ou deixou de ser selecionada.
  • Algoritmo FCI: Permite a existência de variável oculta ou omissão de variáveis.
  • Algoritmo RFCI: Permite a existência de variável oculta ou omissão de variáveis.
  • Método IDA: Nenhuma variável oculta existe ou deixou de ser selecionada.

Prática no R.


Antes de instalar o pacote pcalg no R é necessário instalar dois pacotes:


Para a representação de gráficos, o pacote pcalg utiliza dois outros pacotes chamados RBGL e o pacote graph.

Estes pacotes não estão disponíveis no CRAN, mas estão no outro repositório do software R, BioConductor.

Para instalá-los, siga as instruções abaixo:

#Instala os pacotes necessários.
source("http://bioconductor.org/biocLite.R") 
biocLite("RBGL")
biocLite("Rgraphviz")

Após a instalação desses pacotes, instale normalmente o pacote pcalg. Como exemplo utilizaremos dados simulados pelos autores do pacote pcalg.

Esses dados foram construídos de modo a possuírem a estrutura gráfica apresentada anteriormente. Aqui, realizaremos estimativas com base nos dados para avaliar se os métodos gráficos implementados no pcalg conseguem identificar corretamente a estrutura gráfica original.

Devemos inicialmente habilitar o pacote pcalg e em seguida ler o conjunto de dados que desejamos explorar:

#Habilita o pacote pcal
library("pcalg")

#Lê os dados simulados
dados.df<-read.csv("http://dl.dropbox.com/u/36068691/DadosPCALG.csv",sep=" ")
O primeiro método que utilizaremos é o Algoritmo PC:
#Gera as Estatísticas Suficientes
estatisticas  <-  list(C  =  cor(dados.df),  n  =  nrow(dados.df))

#Executa o Algoritmo PC
pc.fit  <-  pc(estatisticas,  indepTest  =  gaussCItest, p  =  ncol(dados.df),  alpha  =  0.01)

#Plota os resultados
plot(pc.fit,  main  =  "Algoritmo PC.")
Na primeira parte do comando a lista estatisticas armazena a Matriz de Correlações e o tamanho da amostra (número de observações na base). Essas informações são suficientes para a execução do Algoritmo PC. Em seguida a função pc(.) executa o Algoritmo PC. O comando "gaussCItest" testa a independência condicional assumindo que as variáveis possuem distribuição normal a um nível de significância de 0.01. O resultado obtido fornece o seguinte grafo:
Note que o grafo gerado está muito próximo da estrutura verdadeira, os desvios ocorrem devido ao tamanho amostral e flutuações estocásticas. Por exemplo, a relação entre as variáveis 1 e 6 foi apresentada corretamente, mas a relação entre as variáveis 1 e 2 apresenta uma relação bidirecional, o que não é verdade para os dados simulados. O próximo algoritmo a ser utilizado é o Algoritmo FCI. O Algoritmo FCI é uma generalização do Algoritmo PC, no sentido de permitir a existência de muitas possíveis variáveis latentes (omitidas) no modelo. A execução do Algoritmo FCI é similar ao do Algoritmo PC:
#Executa o Algoritmo FCI
fci.fit  <-  fci(estatisticas,  indepTest  =  gaussCItest, p  =  ncol(dados.df),  alpha  =  0.01)

#Plota os resultados
plot(fci.fit,  main  =  "Algoritmo FCI.")
O grafo obtido usando esse algoritmo foi:
Note que nesse caso, algumas relações foram identificadas mas a direção não pode ser estimada. Por exemplo, a variável 1 causa a variável 6, mas a relação entre a variável 1 e a variável 2 não pode ser identificada... A única informação que temos é que possivelmente as variáveis 1 e 2 se relacionam mas não sabemos como. Para o Algoritmo RFCI utilizamos a seguinte sintaxe:
#Executa o Algoritmo RFCI
rfci.fit  <-  rfci(estatisticas,  indepTest  =  gaussCItest, p  =  ncol(dados.df),  alpha  =  0.01)

#Plota os resultados
plot(rfci.fit,  main  =  "Algoritmo RFCI.")
O Algoritmo RFCI é similar ao Algoritmo FCI. No entanto, esse é mais rápido em sua execução. O grafo produzido, nesse caso, é idêntico ao Algoritmo FCI:
Por fim, o último algoritmo é o Método IDA. Esse método, diferente dos demais algoritmos mensura o grau de relação entre as variáveis. Por exemplo, se desejamos saber qual o grau de efeito entre as variáveis 1 e 6 (variável 1 causando a variável 6) utilizamos o seguinte código:
#Executa o Método IDA para o Algoritmo PC
ida(1, 6, cov(dados.df), pc.fit@graph)
O comando retorna os seguintes valores [0.7536376 0.5487757]. Isso significa que a magnitude do efeito da variável 1 sobre a variável 6 é algum valor nesse intervalo. Uma vez que ambos os valores são maiores do que zero, podemos concluir que a variável 1 apresenta um efeito positivo causal sobre a variável 6. Esses valores refletem o efeito do aumento em uma unidade na variável 1 em relação a variável 6. Em alguns casos quando se conhece determinadas relações entre as variáveis, é possível fixar relações e permitir que os algoritmos busquem apenas as relações de causalidade desconhecidas, nesses casos utiliza-se os comandos fixedGaps e fixedEdges.


terça-feira, 13 de novembro de 2012

Modelos de mediação.


Em muitos campos da ciência o objetivo dos pesquisadores não é apenas estimar o efeito causal de um tratamento, mas também a compreensão do processo no qual o tratamento afeta o resultado de maneira causal.

A análise de mediação causal é frequentemente usada para avaliar os potenciais mecanismos causais.

Estudiosos de diversas disciplinas estão cada vez mais interessados ​​em identificar mecanismos causais, indo além da estimativa dos efeitos causais e explorando por completo o modelo causal.

Uma vez que certas variáveis foram identificadas como responsáveis pelo efeito causal associado a um determinado resultado, o próximo passo é entender como essas variáveis ​​exercem influência.

Nesses casos, o procedimento padrão para analisar os mecanismos causais na pesquisa aplicada é chamada análise de mediação. Nessas análises um conjunto de modelos de regressão, são ajustados e, em seguida, as estimativas dos "efeitos de mediação" são calculados a partir dos modelos ajustados (por exemplo, Haavelmo 1943; Baron e Kenny 1986; Shadish, Cook e Campbell 2001; MacKinnon 2008).

Pacote mediation.


O pacote de mediation do R permite aos usuários:

  1. Investigar o papel dos mecanismos causais utilizando diferentes tipos de dados e modelos estatísticos.
  2. Explorar como os resultados mudam quando os pressupostos são relaxados (análise de sensibilidade).
  3. Calcular medidas de interesse em diversos projetos de pesquisa.

A prática corrente na análise de mediação atualmente são inferências baseadas em modelos. Em um delineamento experimental, a variável tratamento é randomizada e as variáveis de mediação e os resultados são observados.

Imai et ai. (2010) mostram que uma gama de modelos paramétricos e semi-paramétrico podem ser utilizados para estimar o efeito médio causal média e mediação causal e outras quantias de interesse.

Aplicação usando o pacote mediation.

Para ilustrar o procedimento utilizaremos como exemplo os dados obtidos por Brader, Valentino e Suhat (2008).

Brader et al. (2008) conduziram um experimento casualizado onde os indivíduos foram expostos a diferentes histórias sobre a imigração. O objetivo era investigar como o seu enquadramento os influencia as atitudes e comportamentos políticos em relação à política de imigração.

#Habilita o pacote mediation
library("mediation")

#Lê os dados
dados.df<-read.csv("http://dl.dropbox.com/u/36068691/dadosMediacao.csv")
Os autores postularam a ansiedade (variável emo) como variável mediadora do efeito causal para o enquadramento na opinião pública. O primeiro passo é ajustar o modelo de mediação para a medida de ansiedade (variável emo), essa é modelada como uma função da variável tratamento (treat) e co-variáveis ​​de pré-tratamento como (idade - age, educ, gênero - gender e renda - income).
# Modelo de mediação
med.fit <- lm(emo ~ treat + age + educ + gender + income, data = dados.df)
Em seguida, modelamos a variável resultado, a qual é uma variável binária que indica se o participante concordou em enviar uma carta sobre a política de imigração ao seu membro do Congresso (variável cong_mesg). As variáveis ​​explicativas do modelo incluem a variável de mediação, a variável de tratamento, e o mesmo conjunto de variáveis de pré-tratamento ​​como as utilizadas no modelo de mediação.
# Modelo para o resultado
out.fit <- glm(cong_mesg ~ emo + treat + age + educ + gender + income, data = dados.df, family = binomial("probit"))
Neste exemplo, espera-se que o tratamento aumente a resposta emocional dos entrevistados, que por sua vez é postulado fazer com que os respondentes sejam mais propensos a enviar uma carta ao seu membro do Congresso. Inicialmente usamos um modelo de regressão linear e regressão de probit para os modelos de mediação e o modelo para o resultado, respectivamente. Vamos agora usar o modelo de mediação para estimar os efeitos médios causais diretos (ACME - Average Causal Mediation effects). Para isso, basta executar o seguinte código:
#Habilita o pacote sandwich
library(sandwich)

#Estima os efeitos médios
med.out <- mediate(med.fit, out.fit, treat = "treat", mediator = "emo", robustSE = TRUE)

#Apresenta as estimativas
summary(med.out)
Como argumentos para esta função, é necessário especificar os modelos (neste caso, med.fit e out.fit), bem como o nome da variável de tratamento e da variável de mediação, que são representados como treat = "treat" e mediator = "emo", respectivamente. Além disso, usamos a matriz de variâncias e covariâncias robustas para a heterocedasticidade oriunda do pacote de sandwich. Ao executar o comando, o seguinte resultado surge:
Nesse exemplo, utilizou-se 1000 simulações para que o erro-padrão das estimativas fossem obtidos. Neste exemplo, os efeitos médios causais diretos (ACME - Average Causal Mediation effects) estimados são estatisticamente significantes e portanto, diferentes de zero, mas as estimativas dos efeitos diretos para médio e total não são. Em outras palavras, os resultados sugerem que o tratamento no ensaio pode ter aumentado a resposta emocional, que por sua vez tornou os indivíduos mais propensos a enviar uma mensagem ao seu congressista. Aqui, uma vez que a variável resultado é binária todos os efeitos estimados são expressos como uma alteração na probabilidade do respondente enviar uma mensagem ao Congresso. O pacote mediation apresenta outras opções como a possibilidade de análises gráficas, análises por segmentos e múltiplas entradas. Para maiores detalhes veja Tingley et. al (2012).

quinta-feira, 8 de novembro de 2012

Otimização de portfólio.


O pacote do R denominado Tawny fornece uma maneira simples para otimizar carteiras de investimento de forma a minimizar o risco em uma carteira.

Este otimizador pode executar a otimização de carteiras para diversos períodos temporais simultaneamente.

A ideia é: "não colocar todos os seus ovos em uma mesma cesta".

Para fins de ilustração, considere um subconjunto de ativos do S&P 500. Abaixo estão os códigos em R para otimizar a carteira de investimentos:

#Habilita a biblioteca Tawny 
library(tawny)

#Lê o subconjunto de dados do S&P 500
data(sp500.subset)
dados <- create(TawnyPortfolio, sp500.subset, window=190)

# Otimizando por meio de uma janela temporal de tamanho 190
pesos <- optimizePortfolio(dados, create(SampleFilter) )

quarta-feira, 3 de outubro de 2012

Testando a hipótese de reação exagerada em mercados.


Até meados da década de 1980, pesquisas econômicas financeiras eram essencialmente sobre como investigar a interação entre o comportamento racional dos maximizadores de utilidade.

Muito sobre essa abordagem de pesquisa e investigação foi produzido mas pouco sobre o comportamento individual dos participantes do mercado foi explicitado. Com as influências da psicologia clínica e economia experimental impactando a disciplina de finanças a partir de ângulos diferentes, a investigação sobre os aspectos comportamentais em finanças começaram a surgir.

Um dos primeiros artigos empíricos na área de finanças comportamentais foi o estudo seminal de DeBondt e Thaler (1985) sobre a reação exagerada do mercado de ações.

Os resultados DeBondt e Thaler (1985), mostraram que quando os ativos eram mantidos por longos períodos de tempo, as ações apresentavam um comportamento significante para a reversão dos preços desses mesmos ativos.

A explicação para a quantidade substancial de reversão no preço dos ativos é baseada no comportamento. Os investidores, em geral, tendem a "super-ponderar" desempenhos mais recentes do ativo em questão e "sub-ponderar" informações de mais longo prazo em suas decisões. Esse comportamento é consistente com a heurística da disponibilidade apresentada por Tversky e Kahneman (1973).

Por exemplo, se uma ação sofreu recentemente uma diminuição nos ganhos devido a alguma mudança não estrutural temporária nas oportunidades econômicas, a queda dos preços pode ser exagerada devido a atualidade da notícia.

Uma vez que o preço da ação foi pressionado, o seu aumento gradual até a sua recuperação completa pode ser lento. Isso até que os investidores percebam sua "reação exagerada" à notícia temporariamente ruim, criando assim uma pressão compradora para "inverter" a queda dos preços.

DeBondt e Thaler (1985) encontraram uma persistência significante para esse fenômeno de reversão e sugeriram que os mercados tendem a sofrer de reação exagerada dos investidores.

A beleza da abordagem de DeBondt e Thaler (1985) está em demonstrar como uma hipótese de reação exagerada pode ser testada empiricamente.

Especificamente, o que DeBondt e Thaler (1985) fazem é calcular o retorno das carteiras para alguns períodos, por exemplo, o desempenho da carteira pode ser calculada para os 36 meses anteriores e, posteriormente, avaliamos como o portfólio se comporta, especialmente para um determinado período de avaliação ou seja, o desempenho nos 36 meses subsequentes.

Para testar a hipótese de reação exagerada, DeBondt e Thaler (1985) formaram portfólios "perdedores" e "vencedores" compostos pelas 30 ações com o pior desempenho e 30 ações com o melhor desempenho, respectivamente, durante o período de formação.

Os autores, então, seguem estas carteiras para os 36 meses seguintes e avaliam e comparam seus desempenhos. Com o tempo, a carteira "perdedora", composta das ações com o pior desempenho no período de formação, consistentemente supera a carteira de "vencedora" durante o período de avaliação. Esses resultados, de acordo com DeBondt e Thaler (1985), sugerem uma forte evidência da presente reação exagerada do mercado de ações, consistente com a teoria da tomada de decisão irracional dos agentes.

O objetivo deste post é mostrar como você pode realizar um simples estudo sobre a reação exagerada do Mercado de ações usando o R para isso.

Teste de reação exagerada usando o R.


DeBondt e Thaler (1985) acumularam em seu trabalho os retornos ajustados do mercado ao longo de um período de formação de três anos para cada ação do New York Stock Exchange (NYSE) com início em dezembro de 1932 e continuando até dezembro de 1977. As carteiras "perdedoras" e "vencedora" foram as carteiras avaliadas ao longo dos 17 períodos disjuntos de três anos de avaliação.

No nosso exemplo, trabalharemos com os ativos disponíveis de 2000 a 2012 e assim como DeBondt e Thaler (1985) utilizaremos três anos para o período de formação e três anos para o período de avaliação.

Conrad e Kaul (1993) introduziram a ideia de que os retornos acumulados em horizontes longos podem enviesar os resultados sobre a super-reação dos agentes. Uma solução para isso é usar períodos de retenção (holding periods) ao investigar horizontes longos.

Tal como acontece com a maior parte da investigação em economia financeira, o primeiro passo para a análise de dados é lê-los a partir de um conjunto de observações de dados externos. Esta tarefa é realizada pela seguinte sintax:

#Limpa o console
rm(list=ls(all=TRUE))

#Lista de ativos Bovespa
ativos<-read.csv("http://dl.dropbox.com/u/36068691/Ativos.csv")

#Obtêm os dados da Bovespa
lista<-as.character(ativos[,"Sigla"])
Em seguida, captura-se a data atual da máquina para a composição da série de interesse:
#Pega a data atual
d <- Sys.time()
current.year <- format(d, "%Y")
current.month <- format(d, "%m")
current.day <- format(d, "%d")
A fonte dos nossos dados é a API do Yahoo Finance, pior isso, precisamos especificar algumas parametrizações:
#Yahoo finance considera janeiro como 00 então:
month <- as.numeric(current.month) - 1
month <- ifelse(month < 10, paste("0",month, sep=""), m)

#Pega os prerídos diários para o ticket 1
tckr <- lista[1]                                   
fn <- sprintf("http://ichart.finance.yahoo.com/table.csv?s=%s&a=0&b=1&c=2000&d=%s&e=%s&f=%s&g=d&ignore=.csv",tckr, month, current.day, current.year)

#Guarda os dados
dados <- read.csv(fn, colClasses=c("Date", rep("numeric",6)))
dados<-dados[c("Date","Close")]
colnames(dados)<-c("Date",lista[1])
O código acima captura os dados do primeiro ativo listado e armazena em um data.frame denominado dados. Em seguida, precisamos repetir esse processo para cada um dos ativos disponíveis:
for(i in 2:length(lista))
{
  tckr <- lista[i]                                
  fn <- sprintf("http://ichart.finance.yahoo.com/table.csv?s=%s&a=0&b=1&c=2000&d=%s&e=%s&f=%s&g=d&ignore=.csv",tckr, month, current.day, current.year)
  
  #Guarda os dados
  data<-data.frame()
  data <- try(read.csv(fn, colClasses=c("Date", rep("numeric",6))))
  if(ncol(data)>0)
    {
      data<-data[c("Date","Close")]
      colnames(data)<-c("Date",tckr)
      dados<-merge(dados, data, by.x = "Date", by.y = "Date", all = TRUE)
    }
}
Uma função muito útil para se utilizar em análise de séries temporais é a função shift desenvolvida pelo R-Bloggers. Essa função é capaz de defasar a série temporal para trás (lag) e para frente (lead):
shift<-function(x,shift_by){
  stopifnot(is.numeric(shift_by))
  stopifnot(is.numeric(x))
  
  if (length(shift_by)>1)
    return(sapply(shift_by,shift, x=x))
  
  out<-NULL
  abs_shift_by=abs(shift_by)
  if (shift_by > 0 )
    out<-c(tail(x,-abs_shift_by),rep(NA,abs_shift_by))
  else if (shift_by < 0 )
    out<-c(rep(NA,abs_shift_by), head(x,-abs_shift_by))
  else
    out<-x
  out
}
Então, para cada ativo calculamos os retornos nos períodos de formação (três anos antes) e no período de avaliação (três anos depois):
#Para cada ativo calcular o retorno três anos antes e três anos depois
resultado<-data.frame()
for(i in 1:length(lista))
{
  precos<-dados[,c("Date",lista[i])]
  precos[,"pform"]<-shift(precos[,lista[i]],-3*360)
  precos[,"paval"]<-shift(precos[,lista[i]],+3*360)  
  precos[,"pform"]<-(precos[,lista[i]]-precos[,"pform"])/precos[,"pform"]
  precos[,"paval"]<-(precos[,"paval"]-precos[,lista[i]])/precos[,lista[i]]
  precos$Empr<-lista[i]
  precos<-na.omit(precos[,c("Date","Empr","pform","paval")])
  resultado<-rbind(resultado,precos)
}
Podemos em seguida eliminar as observações que são outliers:
#Remove retornos exagerados
resultado<-resultado[resultado[,"pform"]>-1 & resultado[,"paval"]>-1, ]

#Ordena os resultados
resultado <- resultado[order(resultado[,"Date"], resultado[,"Empr"]), ]

#Frequência dos ativos 
firmas <-  as.data.frame(table(resultado[,"Date"]))
names(firmas) <- c("Date", "freq")
firmas[,"Date"]<-as.Date(firmas[,"Date"])

#Une as frequências com a base resultado
dat <- merge(resultado, firmas, by="Date",all.x=T)
O código acima além de fazer a limpeza dos outliers calcula a frequência de dados para cada ativo e une esse resultado no data.frame dat. Os ativos são então ranqueados permitindo assim a definição dos "perdedores" e dos "vencedores":
#Ranqueia as empresas
firma <- unlist(tapply(rep(1, nrow(resultado)), resultado[,"Date"], cumsum))
dat <- cbind(dat, firma)
O teste T é então utilizado para se comparar o comportamento das carteiras "perdedoras" e dos "vencedoras" e consequentemente a possível existência de uma inversão das categorias "perdedoras" e "vencedoras":
#Carteira perdedora
perdedor <- dat[dat[,"firma"]<=5, ]
summary(perdedor[,"paval"])
t.test(perdedor[,"paval"])

#Carteira vencedora
vencedor <- dat[dat[,"firma"] >= dat$freq-4, ]
summary(vencedor[,"paval"])
t.test(vencedor[,"paval"])
A carteira "perdedoras" apresenta intervalo de confiança de 95% como [0.5463877, 0.6533983] e estimativa pontual de 0.599893. Já a carteira dita "vencedora" apresenta intervalo de confiança de 95% como [1.068938, 1.364774] e estimativa pontual de 1.216856, dessa forma não há evidências de reação exagerada para o conjunto de dados e período estudado.

sábado, 29 de setembro de 2012

QGIS - Aplicações em geomarketing - Parte 3.


Nesse post mostrarei como elaborar mapas temáticos no Quantum Gis.

Mapas temáticos são úteis quando deseja-se apresentar geograficamente variáveis oriundas de algum banco de dados.

Para o exercício contido aqui é importante que o leitor tenha reproduzido os exercícios dos posts anteriores (Parte 1 e Parte 2), assim a compreensão será completa.

Elaborando mapas temáticos.

Para executar esse exercício faça o download da malha digital de columbus. No arquivo Dados Columbus.zip os principais itens são:

  • Columbus.shp
  • Dados.dbf

Lembrando que para trabalhar com mapas no formato digital é necessário pelo menos três arquivos: *.shp, *.shx e *.dbf. Todos com o mesmo nome, por exemplo, Columbus.shp, Columbus.shx e Columbus.dbf.

Além desses arquivos, pode ser interessante adicionar a tabela do mapa outras variáveis. No caso da malha Columbus.shp a tabela com os dados chama-se Dados.dbf.

O Quantum Gis aceita a importação de arquivos em diversos formatos, o mais comum é o formato *.dbf.

Isso não é uma restrição a sua análise, já que softwares como Excel, Access, Open Office, SPSS, SAS, R, etc. são capazes de converter suas bases nativas para o formato *.dbf.

Particularmente, o software que eu mais gosto para fazer esse tipo de conversão é o StatTransfer (o problema é que ele não é gratuito).

Realizando o JOIN entre as tabelas do mapa e base de dados.


Para realizar a união (join) entre os dados (Dados.dbf) e a malha (Columbus.shp) é necessário inicialmente que ambos os arquivos possuam uma variável chave essa variável será responsável pela determinação de quais observações da base de dados (Dados.dbf) estarão associadas aos polígonos da malha digital (Columbus.shp).

É importante que as variáveis tenham o mesmo formato, isso é, se uma é caractere a outra variável deverá ser caractere, se é numérica, ambas devem ser numéricas. Se uma tem 6 dígitos a outra também deverá ter seis dígitos.

Graficamente, podemos representar da seguinte forma:


Uma boa prática é utilizar variáveis chave que sejam numéricas. Assim evitamos problemas com acentuação, letras maiúsculas, minúsculas, etc..

Usualmente, as principais variáveis chave são:

  • Código do município.
  • Código do setor censitário.
  • CEP.

No caso do nosso exercício, a variável chave chama-se POLYID em ambos os arquivos Dados.dbf e Columbus.shp.

Adicionando a malha no ambiente QGis.

Como demonstrado nos posts anteriores, admita que a malha já esteja projetada e adicionada no ambiente QGis.

Graficamente, devemos ter algo como:


Em seguida devemos fazer a junção (join) entre os dados (Dados.dbf) e a malha (Columbus.shp) para isso arraste o arquivo Dados.dbf para o ambiente QGis. Essa base aparecerá no campo Layers como mostrado abaixo:


Em seguida, clique com o botão direito do mouse sobre o Layer columbus e escolha a opção Properties. Na tela que surge clique na aba Joins.


Clique no botão "soma" e assim surgirá o seguinte formulário:


A variável chave em ambos os campos é POLYID. Em seguida clique no botão OK:


Finalmente, clique no botão Apply e posteriormente no botão OK. Para saber se as variáveis foram adicionadas corretamente, clique com o botão direito do mouse sobre o Layer columbus e escolha a opção Open Attribute Table. Se o procedimento foi realizado corretamente, haverá novas variáveis na base de dados do Layer columbus. Essa malha com novas variáveis pode ser salva, evitando assim a repetição de procedimento no futuro.

Pintando o mapa.

Agora, podemos visualizar a distribuição da criminalidade em Columbus, para isso, faremos um mapa temático.

O primeiro passo é clicar com o botão direito do mouse sobre o Layer columbus e escolher a opção Properties. Na tela que surge escolha a aba
Style:


Escolha então a opção Graduated:


Na caixa Column escolha a variável que desejamos representar espacialmente (aqui será a variável CRIME), na caixa Mode há algumas opções, aqui escolheremos a opção Natural Breaks (Jenks) que minimiza a variância interna em cada uma das classes. O número de classes escolhidas aqui é 5 e pintaremos o mapa na escala de laranjas:


Clique no botão Apply e posteriormente no botão OK. O resultado é o seguinte:


Para exportamos o mapa final para um formato de imagem procedemos da seguinte forma: clique no botão New Print Compose:


Na tela que surge, clicamos no botão Add New Map e com o mouse definimos onde gostaríamos que o mapa estivesse na imagem:


Usando o mouse representamos onde o mapa deverá estar:


Para adicionar a legenda, clicamos no botão Add new legend:


Novamente usando o mouse posicionamos onde a legenda deverá estar. Por fim usando a janela Item properties podemos editar as opções da legenda:


Para salvar o mapa fazemos File → Export as PDF.... É claro que você pode salvar a imagem em outros formatos também.

quinta-feira, 27 de setembro de 2012

Previsão de Séries Temporais usando Holt Winters.


Usualmente, quado desejamos fazer previsão há uma série de informações sobre o mercado que deveríamos levar em conta. Por exemplo, as vendas de produtos são muitas vezes sazonais, e podemos esperar que as tendências sejam sustentadas por períodos curtos, os quais podem se alterar.

Se temos por exemplo um produto inovador bem-sucedido, as vendas aumentarão inicialmente, mas depois estabilizarão antes de decrescer devido aos concorrentes que entram no mercado. Esse tipo de informação pode ser adequadamente modelada pelo método Holt-Winters.

A nomenclatura usada aqui define a mudança no nível de um período de tempo para o período seguinte, como inclinação (slope). Os padrões sazonais também podem mudar devido aos caprichos da moda e da variação do clima.

O método de Holt-Winters foi sugerido por Holt (1957) e Winters (1960), que
trabalharam no School of Industrial Administration em Carnegie Institute
of Technology
.

O método usa médias móveis ponderadas exponencialemente para atualizar as estimativas da média ajustada sazonalmente (chamada de nível), inclinação e sazonalidade.

Considere uma série temporal $\{x_{t}\}$ com período igual a $p$. O método Holt-Winters utiliza as seguintes equações:


onde $a_{t}$, $b_{t}$ e $s_{t}$ são as estimativas para o nível, inclinação e efeito da sazonalidade no período $t$. Os parâmetros $\alpha$, $\beta$ e $\gamma$ são os parâmetros de suavização.

A previsão para valores futuros $x_{n+k}$ em $k$ períodos a frente após a $n$-ésima observação é dada da seguinte forma:


onde $a_{n}$ é o nível estimado, $b_{n}$ é a inclinação estimada e $a_{n}+kb_{n}$ é o nível estimado no tempo $n+k$ e $s_{n}+k-p$ é a estimativa do peso exponencializado para o efeito sazonal no tempo $n=k-p$. Outra forma do método Holt-Winters é com efeito sazonal multiplicativo. Nesse caso, o conjunto de equações é dado por:


A equação de previsão para o período $x_{n} + k$ torna-se:


Os parâmetros podem ser fixados no R ou então estimados de modo a minimizar o erro de previsão. Em outras palavras, quando os parâmetros não são informados, o R procura pelos valores que minimizam o erro de previsão.

Usando o método Holt-Winters no R.

Para realizar a estimação e posterior previsão pelo método Holt-Winters no R utilizamos a função HoltWinters.

Para esse exemplo, considere a base de dados das concentrações atmosféricas de CO2 expressos em partes por milhão (ppm).

O nome da base em CSV é denominada BaseCO2.csv.

O primeiro passo é ler a base de dados no R:

#Lê a base de dados
dados.df<-read.csv("http://dl.dropbox.com/u/36068691/BaseCO2.csv")

#Imprime as variáveis existentes
names(dados.df)

#Cria a série temporal
serie<-ts(dados.df$CO2,start=c(1959,1),end=c(1997,12),frequency=12)
Os dados também foram transformados no formato ts com a primeira observação referente a Janeiro de 1959 e a última em Dezembro de 1997. O argumento frequency=12 informa ao R que cada período (de um ano) é composto por 12 observações. Em outras palavras, informa ao R que a frequência da série é mensal. Em seguida utilizamos a função HoltWinters:
#Realiza o método Holt-Winters
holt <- HoltWinters(serie)

#Plota a série temporal
plot(holt)

#Plota a decomposição da serie
plot(fitted(holt))
A série temporal observada juntamente com seus valores preditos pelo modelo são representados no gráfico abaixo:
O método decompõem a série temporal. Essa decomposição é apresentada a seguir:
A previsão para o próximo ano com um intervalo de confiança de 95% é dado pelo seguinte comando:
#Realiza a previsão para 12 meses a frente
p <- predict(holt, 12, prediction.interval = TRUE, level = 0.95)
plot(holt, p)
Cujo resultado é apresentado pelo gráfico abaixo:
Caso não haja sazonalidade evidente, podemos fazer:
#Realiza o método Holt-Winters sem efeito sazonal
holt <- HoltWinters(serie, gamma = FALSE)
Para maiores detalhes do método Holt-Winters indico o texto The Holt-Winters Forecasting Procedure.

quarta-feira, 26 de setembro de 2012

QGIS - Aplicações em geomarketing - Parte 2.


Dando continuidade sobre as operações no Quantum Gis em especial com aplicações em Geomarketing demonstrarei aqui como adicionar ao mapa: ruas ou imagens de satélites oriundas do Google Maps.

Esse tipo de análise é útil quando deseja-se estudar o impacto de variáveis georeferenciadas e a sua relação com possíveis estruturas como ruas, shoppings, parques, etc..

Assumindo que a primeira parte do post QGIS - Aplicações em geomarketing - Parte 1, tenha sido realizada podemos seguir aqui com uma nova análise.

Adicionando Layers do Google Map no QGis.

Considere a malha de setor censitário de Brasília, a mesma malha publicada no post QGIS - Aplicações em geomarketing - Parte 1.

Após realizar a projeção em: Projected Coordinate Systems → Universe Transverse Mercartor (UTM) → SAD69/ UTM Zone 23S (procedimento explicado no primeiro post) e ter salvo a nova malha já projetada, a tela do Qgis deverá ser algo como:


Para adicionar a malha do Google Map no Qgis precisamos adicionar um plugin no Qgis.

Os plugins são compilações de funções, usualmente criadas pelos usuários do Qgis que realizam determinadas tarefas.

O primeiro passo para adicionar a malha do Google Map no Qgis precisamos adicionar um novo repositório de plugins no software.

Para isso, execute os seguintes procedimentos: Plugins → Fetch Python Plugins... na tela que surgir escolha a aba Repositories, a seguinte surgirá:


O plugin que necessitamos chama-se OpenLayers Plugin.

Para que ele fique disponível, precisamos adicionar o seguinte repositório: http://build.sourcepole.ch/qgis/plugins.xml. Para isso, clique no botão Add e adicione o nome do repositório (por exemplo, Repositorio) e o endereço (nesse caso http://build.sourcepole.ch/qgis/plugins.xml) e clique no botão OK:


Na aba plugins procure pelo plugin OpenLayers e adicione-o. Para isso, clique nele e pressione o botão Install plugin:


Após esse procedimento, feche a janela. Em seguida, para adicionarmos a malha do Google Map no ambiente do Qgis faça no Menu: Plugins → OpenLayers plugin → Add Google Streets layers:


Como o QGis funciona como um sistema de camadas (Layers) a camada superior se subrepõem as demais, assim, caso a malha BSB esteja sobre a malha Google Streets a seguinte imagem surge:


Para trocar a ordem das camadas basta segurar a camada desejada e arrastar para a posição de interesse. Entretanto, não é possível observar as ruas sobre a malha BSB, para isso, podemos reduzir a visibilidade da camada BSB.

Para isso, dê dois cliques com o botão direito sobre a cor do Layer BSB (nesse caso o quadrado em lilás), caso o procedimento tenha sido executado corretamente a seguinte tela surgirá:


Faça a transparência igual a 50%:


Em seguida clique no botão OK:


Com a transparência alterada para 50% boa parte das estruturas existentes no Google Street podem ser observadas nesse novo mapa e análises podem ser formuladas com base nesse novo mapa.

terça-feira, 18 de setembro de 2012

Teste de razão de variâncias de Lo-MacKinlay.


Existem muitos textos que sugerem através de evidências empíricas que o retorno de ações contém componentes que podem ser preditos.

Por exemplo, Keim e Stambaugh (1986) encontraram um modelo estatisticamente significante para prever o preço de ações usando um modelo de previsão com variáveis pré-determinadas.

Fama e French (1987) mostraram que um longo período de retenção de retornos é negativamente correlacionado serialmente, implicando assim que 25% a 40% da variação de um longo período de retornos é previsível com base nos retornos passados.

Esse post, no entanto, tem como objetivo principal apresentar o Teste de Razão de Variâncias proposto por Lo e MacKinlay (1988). Os autores indicam que o modelo de passeio aleatório (ou passeio do bebâdo) é, em geral, inconsistente (para os ativos estudados) com o comportamento estocástico dos retornos semanais, especialmente para as ações com menor capitalização (Small Caps).

Lo e MacKinlay (1988) alertam que estes resultados não implicam necessariamente que o mercado de ações é ineficiente ou que os preços das ações não são avaliações racionais dos seus valores "fundamentais". O teste proposto pelos autores pode ser interpretado como um teste para a rejeição de "algum" modelo econômico de formação eficiente de preços.

Teste de razão de variâncias.

A eficiência do mercado de ações tem sido debatida por pesquisadores e profissionais do mercado financeiro. Uma forma particular de eficiência do mercado de ações é a eficiência informacional.

A eficiência informacional se baseia na premissa de que os preços dos ativos refletem as informações relevantes disponíveis instantaneamente aos investidores e ao público em geral. Como a chegada de informações é imprevisível, os preços dos ativos também se tornam imprevisíveis. A hipótese de que a chegada de informações fundamentais ao mercado é aleatória e, portanto, os movimentos dos preços dos ativos também serão aleatórios, é englobada pela teoria do passeio aleatório dos preços dos ativos.

De maneira simplista, a teoria do passeio aleatório indica que uma vez que a chegada de informações é imprevisível, o melhor preditor do preço de um ativo é seu valor atual. Esta ideia simples pode ser facilmente incorporada no modelo de passeio aleatório bem conhecido dos preços dos ativos, que pode ser expresso da seguinte forma: $P_{t}=P_{t-1}+\epsilon$.

$P_{t}$ é o preço atual do ativo em estudo, $P_{t-1}$ é o preço do período anterior, e $\epsilon$ é um termo de erro aleatório. Cada termo de erro aleatório representa a chegada de uma nova informação, o qual se assumido ser imprevisível deve ser independentes uns dos outros. Admitindo sobre a hipótese nula o termo de erro aleatório é independente e identicamente distribuído segundo uma distribuição normal, então a variância do termo de erro aleatório é linear no intervalo de tempo durante o qual os preços são observados. Simplesmente, a variância da variação de preços quinzenais deve ser o dobro da variação de preços semanais. Além do mais, a variância das alterações de preços mensais deve ser quatro vezes superior ao de alterações de preços semanais, e assim por diante.

A relação linear entre o intervalo de tempo observado para os preços do ativo de interesse e a sua variação é a essência da especificação do teste desenvolvido por Lo e MacKinlay (1988). Lo e MacKinlay (1988) desenvolveram distribuições limitantes para os estimadores de razão de variância, com e sem a existência de heterocedasticidade, e mostraram que os preços dos ativos não necessariamente seguem um passeio aleatório. Seus estimadores são definidos como se segue:

A equação (01) representa a média das alterações dos preços em T períodos de tempo:


Já a equação (02) representa um estimador de variância para as alterações dos preços no period de tempo especificado, isso é $t=1,\dots,T$:


Por fim, a equação (03) representa um estimador de variância para as mudanças q-temporais de preços:


e $m=q(T-q+1)(1-\frac{q}{T})$ é um ajuste executado no denominador da variância do estimador q-temporal para acomodar as observações que se sobrepõem, além de ajudar a aumentar a potência do teste de razão de variância.

Especificação do teste.


Assim, o teste da razão de variâncias é definido por:


Para acomodar a possível heterocedasticidade, utiliza-se a estatística do teste padronizado $z$ o qual é assintoticamente distribuído segundo uma normal padrão:



onde


e


Aplicação usando os dados da Bovespa


Utilizando o R, vamos calcular o teste de razão de variâncias de Lo e MacKinlay para as ações PETR4 em um período $q=1$ diário, isso é, com defasagem de um dia.

#Limpa o console
rm(list=ls(all=TRUE))

#Habilita o pacote quantmod
library(quantmod)

#Início do período de interesse
start = as.Date("2011-01-01") 

#Fim do período de interesse
end = as.Date("2011-12-31") 

#Obtêm os dados da PETR4
getSymbols("PETR4.SA", src="yahoo",from=start,to=end)

A seguir é necessário calcular os log-retornos de duas séries: a série original e a série defasada (nesse caso em um dia):

#Aplica o log-retorno nos preços
ret <- as.matrix(c(rep(NA, 0), diff(log(Cl(PETR4.SA)), lag=1)))

#Aplica o log-retorno nos preços (Defasagem diária)
ret2 <- as.matrix(c(rep(NA, 0), diff(log(Cl(PETR4.SA)), lag=2)))
#Plota a série temporal dos preços de fechamento
plot(ret, main="Petr4",type="l",
+ylab="Log-return Close price. (Lag 1)",xlab="Time")

plot(ret2,main="Petr4",type="l",
+ylab="Log-return Close price. (Lag 2)",xlab="Time")
Em seguida os parâmetros exigidos para o teste são calculados:
#Calcula muhat
muhat <- mean(ret, na.rm=TRUE)
nq <- nrow(ret)
#Parâmetros Sigma e Delta
sigatop <- (ret - muhat)^2
sigatop1 <- c(NA, sigatop[-length(sigatop)])
deltop <- sigatop * sigatop1
delbot <- sigatop
sigctop <- (ret2 - 2*muhat)^2
#Guarda os resultados
dados <- data.frame(ret, sigatop, sigatop1, deltop, delbot, sigctop)
Fazendo a soma, obtemos os valores desejados:
#Calcula a soma dos valores
sigatop <- sum(sigatop, na.rm=TRUE)
sigctop <- sum(sigctop, na.rm=TRUE)
deltop <- sum(deltop, na.rm=TRUE)
delbot <- sum(delbot, na.rm=TRUE)
Em seguida o cálculo dos testes é realizado:
nq<-nrow(ret)
q<-2
qm1<-q-1
theta<-0
j<-1
m <- q*(nq-q+1)*(1-q/nq)
siga <- sigatop/(nq-1)
sigc <- sigctop/m
varrat2 <- sigc/siga
delta <- nq*deltop/(delbot**2)
while(j <= qm1)
{
  theta <- theta + ((2*(q-j)/q)**2)*delta
  j<-j+1
}

z <- sqrt(nq)*(varrat2-1)/sqrt(theta)
print(nq, cat("Número de retornos:"))
print(varrat2, cat("Razão de variâncias para retronos com Lag=2:"))
print(z, cat("Teste Robusto a Heterocedasticidade de Lo-MacKinlay:"))
Após realizar a análise obtêm-se:
  • Número de retornos:[1] 249
  • Razão de variâncias para retronos com Lag=2:[1] 1.081269
  • Teste Robusto a Heterocedasticidade de Lo-MacKinlay:[1] 1.052326
Os resultados indicam que a hipótese nula de presença de um comportamento como um passeio aleatório para a série PETR4 diária entre 01-01-2011 até 31-12-2011 não pode ser rejeitada, uma vez que o valor do teste não é maior do que o valor crítico sobre a hipótese nula, qual seja, aproximadamente 1.96 a um nível de confiança de 95%. Uma maneira direta de se atingir o mesmo resultado é por meio da biblioteca vrtest. A função que realiza o teste de Lo-MacKinlay é a função Lo.Mac(y=, kvec=) onde o parâmetro y= recebe o vetor de ativos e kvec= a defasagem utilizada no teste.