Outros sites Medialivre
Caldeirão da Bolsa

Programação para Finanças (R/Python)

Espaço dedicado a todo o tipo de troca de impressões sobre os mercados financeiros e ao que possa condicionar o desempenho dos mesmos.

Re: Programação em R para Finanças

por VirtuaGod » 5/2/2017 16:25

Tens uma forma engraçada de aprender. Estudas no meio do caos e depois organizas tudo mentalmente. Acho que muitos autodidatas fazem isso (incluindo eu) mas nunca vi ninguém a fazer isso activamente e não consigo fazer na dimensão que estás a fazer :shock:

Tenho as várias fontes no mesmo script e depois faço um na.locf(merge(x)) e faço uma mega base de dados.

O que pretendes não deverá ser muito complicado de obter porque são coisas internaciomais. A rotina do BEST tive de fazer de raiz mas agora o que procuras quase de certeza que alguém já fez e muito provavelmente até está no quandmod.

Estuda as fontes que o quandmod usa na função getSymbols: http://www.quantmod.com/documentation/00Index.html

Outra fonte muito boa que tem uma API própria é a quandl. Vai ver se têm o que pretendes: https://www.quandl.com/. Vê aqui como usar a API deles: https://www.quandl.com/docs/api?r#introduction

Entre isto e o webscraping tens boa info para estudar. Em relação a outras fontes é mais simples dizer especificamente o que queres sacar e a forma como obtens para o excel. Não vejo forma de obtermos algo da bloomberg sem um terminal. Mas se tens acesso a um (um dos meus sonhos, mas não tenho 1500 usd por mês para "queimar" :-" ) terias a acesso a TUDO.

P.S. - Eu prefiro usar ETFs como benchmark, em vez de indíces. Exemplo é que eu consigo bater SEMPRE o S&P. Porquê? Porque o S&P é um indíce que não inclui os dividendos. Basta comprares SPY que bates sempre o S&P. O SPY é o S&P 500 TR (total return) menos 0.1% de custos anuais e isso bate sempre o S&P desde que os dividendos sejam superiores aos 0.1% de custos. Prefiro o SPY como benchmark ao S&P por isso!! Pensa se não será melhor usares ETFs como benchmark.
Artigos e estudos: Página repositório dos meus estudos e análises que vou fazendo. Regularmente actualizada. É costume pelo menos mais um estudo por semana. Inclui a análise e acompanhamento das carteiras 4 e 8Fundos.
Portfolio Analyser: Ferramenta para backtests de Fundos e ETFs Europeus

"We don’t need a crystal ball to be successful investors. However, investing as if you have one is almost guaranteed to lead to sub-par results." The Irrelevant Investor
Avatar do Utilizador
 
Mensagens: 5707
Registado: 20/11/2002 21:56
Localização: Porto

Re: Programação em R para Finanças

por Varendia » 5/2/2017 7:40

Tinha perdido esta mensagem importantissima!
VirtuaGod Escreveu:
Varendia Escreveu:1. A criacao/actualizacao/formatacao da base de dados (download e tratamento), que nao e so de dados do Best. Provavelmente preciso de mais do que uma rotina para isto, dependendo da origem dos dados.

Vamo-nos focar nisto.
Sim, diferentes fontes têm diferentes "rotinas" que terão de ser incluidas no script. O de fundos do Best tens no meu script. Que precisas de adicionar mais? yahoo? que outros activos? ETFs americanos? Dá-me um exemplo sff dos dados que vais buscar que não são do best e a gente vê já isso...


Com a mesma rotina dos fundos tambem tiras ETFs?

Yahoo e FRED sao duas bases onde tambem vou para coisas especificas.
Forex, uso alguns pares de moedas, vou ao site do banco de portugal, vem tudo num ficheiro, e so importar para o R (este ate eu devia conseguir fazer, os cabecalhos do ficheiro sao mauzinhos, mas posso sempre mudar com base noutro file)

Mas o mais importante para mim seriam indices/benchmarks que uso para os meus testes, tenho muita informacao ate meio de 2015, mas actualizar da muito trabalho. Isso pede mesmo uma rotina em R. :mrgreen:

spindices
ftserussell
msci
euronext
bloomberg

Queres comecar por algum em particular?
"Strategy without tactics is the slowest route to victory. Tactics without strategy is the noise before defeat." Sun Tzu
 
Mensagens: 215
Registado: 10/12/2012 12:12

Re: Programação em R para Finanças

por Varendia » 5/2/2017 4:43

VirtuaGod Escreveu:6 minutos é imenso tempo... :oh:


Nao estou em Portugal e a minha ligacao passa por um controlo local de dados, aqui tudo e gravado. A largura de banda e dividida por 2 para que eles gravem uma copia de tudo o que fazes.... so coisas boas. :wink:
6 minutos esta optimo!!

O web scraping vai ser um luxo .. com jeito e tempo da para automatizar a minha 'pre-seleccao de fundos'. Mas isso vai ser muita investigacao.
"Strategy without tactics is the slowest route to victory. Tactics without strategy is the noise before defeat." Sun Tzu
 
Mensagens: 215
Registado: 10/12/2012 12:12

Re: Programação em R para Finanças

por VirtuaGod » 4/2/2017 20:04

Varendia Escreveu:Nao e por causa dos erros, fiz um ficheiro so com os 203 fundos e demorou o mesmo tempo, 6 minutos. Mas estou a sacar os dados desde 1999.
Pode ser que o limite seja a velocidade da ligacao da net, e nao o computador. :D

De qualquer maneira, 6 minutos esta optimo.

6 minutos é imenso tempo... :oh:

Agora ando-me a divertir a arrebentar "instâncias" da AWS :roll: :-$ :-s :mrgreen: ( imagens virtuais de computadores na Amazon Web Services que são basicamente computadores à distância e bem mais potentes que a minha pequena máquina :wink: )
Artigos e estudos: Página repositório dos meus estudos e análises que vou fazendo. Regularmente actualizada. É costume pelo menos mais um estudo por semana. Inclui a análise e acompanhamento das carteiras 4 e 8Fundos.
Portfolio Analyser: Ferramenta para backtests de Fundos e ETFs Europeus

"We don’t need a crystal ball to be successful investors. However, investing as if you have one is almost guaranteed to lead to sub-par results." The Irrelevant Investor
Avatar do Utilizador
 
Mensagens: 5707
Registado: 20/11/2002 21:56
Localização: Porto

Re: Programação em R para Finanças

por Varendia » 4/2/2017 18:19

Nao e por causa dos erros, fiz um ficheiro so com os 203 fundos e demorou o mesmo tempo, 6 minutos. Mas estou a sacar os dados desde 1999.
Pode ser que o limite seja a velocidade da ligacao da net, e nao o computador. :D

De qualquer maneira, 6 minutos esta optimo.
"Strategy without tactics is the slowest route to victory. Tactics without strategy is the noise before defeat." Sun Tzu
 
Mensagens: 215
Registado: 10/12/2012 12:12

Re: Programação em R para Finanças

por Varendia » 4/2/2017 17:27

Acho que os 5 minutos e por causa dos erros. Sao 100 erros.

Amanha vejo o webscraping...
"Strategy without tactics is the slowest route to victory. Tactics without strategy is the noise before defeat." Sun Tzu
 
Mensagens: 215
Registado: 10/12/2012 12:12

Re: Programação em R para Finanças

por VirtuaGod » 4/2/2017 15:58

Varendia Escreveu:De 313 MSids que tinha na lista fiquei com dados de 203.... E ridiculo... dados de 203 fundos, levou 5 ou 6 minutos a correr tudo...

5 minutos??? Cum caraças. Isso não é normal. Tb não me parece culpa do PC. O meu portátil é mesmo fraquinho e demora 1 minuto a ir buscar 250 fundos + 100 ETFs que é a minha base de dados actual.

Deu-me um erro diferente, mas fui verificar alguns valores e nao me parece que tenha estoirado nos nomes. Ou seja da o erro mas o ficheiro final esta ok.
Acho que se resolve ao mudar o objecto, nao estar a usar Fundos para o objecto final. O que te parece?

> colnames(Fundos) <- c("Date", MSid)
Error in `colnames<-`(`*tmp*`, value = c("Date", "F0GBR05XKO", "F000000DUW", :
'names' attribute [314] must be the same length as the vector [204]


Esse erro é um erro nos nomes. O R está a dizer que não podes colocar 314 nomes (que são os MSID todos) em 204 fundos/colunas (que foram só os que que conseguiste sacar). Mas o objecto "Fundos" fica ok? Com nomes no topo? Pode ser que eu tenha feito sem querer uma redundância qualquer no código (muitas vezes faço por erro/mau código).

Proximos passos, ir buscar dados para juntar ao MSid, pelo menos o nome do fundo, ISIN, a moeda, se e Hedged ou nao, o benchmark que usa e a categoria , . Aceito ajuda sobre como ir buscar esses dados com base no MSid, senao ponho isso a ser feito no excel ate descobrir como fazer no R.

Aqui entra no mundo do Hadley Wickham e em que TUDO é ridiculamente simples. Ele basicamente revolucionou a linguagem.

Tens aqui um post que te explica tudo o que tens de saber para fazeres webscraping como um profissional 8-). Depois fazes uns For-Loops e é sempre a bombar.
[url]
https://blog.rstudio.org/2014/11/24/rve ... ng-with-r/[/url]

Isto e muito divertido...

Super, e ainda vais no início. Para ser honesto não percebo onde e como mas é super divertido e recompensador. Primeira vez que senti o poder/gratificação que programação dá foi ao criar o Pong em python. Desde então cada vez ando mais viciado...
Artigos e estudos: Página repositório dos meus estudos e análises que vou fazendo. Regularmente actualizada. É costume pelo menos mais um estudo por semana. Inclui a análise e acompanhamento das carteiras 4 e 8Fundos.
Portfolio Analyser: Ferramenta para backtests de Fundos e ETFs Europeus

"We don’t need a crystal ball to be successful investors. However, investing as if you have one is almost guaranteed to lead to sub-par results." The Irrelevant Investor
Avatar do Utilizador
 
Mensagens: 5707
Registado: 20/11/2002 21:56
Localização: Porto

Re: Programação em R para Finanças

por Varendia » 4/2/2017 15:10

A questao do merge para o Fundos ja resolvi, o trycatch e mais uma funcao, e preciso fechar } depois.

Alguns tinha na lista para pensar um dia, outros preseleccionei e fiz testes ate inicio de 2015, mas nao encaixaram e nunca comprei. Dos que tenho so 2 ja fizeram merges.
Alguns sao fundos nao comercializados em Portugal, pode ser essa a razao de uma serie dos erros/falta de dados.

De 313 MSids que tinha na lista fiquei com dados de 203.... E ridiculo... dados de 203 fundos, levou 5 ou 6 minutos a correr tudo...

Deu-me um erro diferente, mas fui verificar alguns valores e nao me parece que tenha estoirado nos nomes. Ou seja da o erro mas o ficheiro final esta ok.
Acho que se resolve ao mudar o objecto, nao estar a usar Fundos para o objecto final. O que te parece?

> colnames(Fundos) <- c("Date", MSid)
Error in `colnames<-`(`*tmp*`, value = c("Date", "F0GBR05XKO", "F000000DUW", :
'names' attribute [314] must be the same length as the vector [204]

Proximos passos, ir buscar dados para juntar ao MSid, pelo menos o nome do fundo, ISIN, a moeda, se e Hedged ou nao, o benchmark que usa e a categoria , . Aceito ajuda sobre como ir buscar esses dados com base no MSid, senao ponho isso a ser feito no excel ate descobrir como fazer no R.

Isto e muito divertido...
"Strategy without tactics is the slowest route to victory. Tactics without strategy is the noise before defeat." Sun Tzu
 
Mensagens: 215
Registado: 10/12/2012 12:12

Re: Programação em R para Finanças

por VirtuaGod » 4/2/2017 14:34

Usa a função
Código: Selecionar todos
view(x)
onde x é o objecto.. Torna a visualização bastante mais simples!!

Ou head()/tail()
Artigos e estudos: Página repositório dos meus estudos e análises que vou fazendo. Regularmente actualizada. É costume pelo menos mais um estudo por semana. Inclui a análise e acompanhamento das carteiras 4 e 8Fundos.
Portfolio Analyser: Ferramenta para backtests de Fundos e ETFs Europeus

"We don’t need a crystal ball to be successful investors. However, investing as if you have one is almost guaranteed to lead to sub-par results." The Irrelevant Investor
Avatar do Utilizador
 
Mensagens: 5707
Registado: 20/11/2002 21:56
Localização: Porto

Re: Programação em R para Finanças

por VirtuaGod » 4/2/2017 14:24

Parece-me que o trycatch corrige o erro no loop mas depois a função quebra ao fazer o merge para o objecto "Fundos". Ao menos agora cria uma mensagem de erro a informar qual o fundo que quebrou a função e podes exclui-lo manualmente do CSV!!

Mas realmente o problema é se queres ficar com as cotações de fundos que já morreram... isso pode ser complicado. Só se fizeres um CSV com as cotações que tens no teu excel para o R ler.

Mas começas a entrar em campos complicados com merge com fundos que já não existem etc etc. Mas vamos um passo de cada vez que pode ser que se chegue lá.
Artigos e estudos: Página repositório dos meus estudos e análises que vou fazendo. Regularmente actualizada. É costume pelo menos mais um estudo por semana. Inclui a análise e acompanhamento das carteiras 4 e 8Fundos.
Portfolio Analyser: Ferramenta para backtests de Fundos e ETFs Europeus

"We don’t need a crystal ball to be successful investors. However, investing as if you have one is almost guaranteed to lead to sub-par results." The Irrelevant Investor
Avatar do Utilizador
 
Mensagens: 5707
Registado: 20/11/2002 21:56
Localização: Porto

Re: Programação em R para Finanças

por VirtuaGod » 4/2/2017 14:13

EHEHEH tentaste instalar o meu package como um normal. O meu package não está na CRAN :mrgreen: A CRAN é a Meca do packages, o meu é um simples package agnóstico ocidental :lol:

tens de instalar o devtools
Código: Selecionar todos
install.packages("devtools")

e depois instalar o meu package com as duas primeiras linhas no github:

Código: Selecionar todos
library(devtools)
install_github("VirtuaGod/AnaliseFI")

Em relação ao erro da função quando não existe um MSid é o loop que quebra quando há erros. Experimenta com tryCatch():

Versão do loop com TryCatch(), sem tere experimentado mas deve funcionar:

Código: Selecionar todos
  for (i in x) {
tryCatch({  # Função tryCatch continua o loop em caso de erro
    fund <- read.csv2(paste0("https://lt.morningstar.com/api/rest.svc/timeseries_price/okhysb8aoh?id=",i,
                             "&currencyId=BAS&idtype=Morningstar&frequency=daily&startDate=", Begin,"&outputType=CSV"))
    fund <- fund[, 1:2]
    fund$date <- as.Date(fund$date, format = "%Y-%m-%d")
    colnames(fund) <- paste(c("date", i))
    Fundos <- merge(Fundos, fund, by = "date", all.x = TRUE)
    fund   <- xts(fund[2:ncol(fund)], order.by = fund[, 1])
    fund   <- fund[Begin_End, ]
    assign('Fundos', Fundos, envir = .GlobalEnv)
    assign(i, fund, envir = .GlobalEnv)
    rm(fund)
  }, error=function(e){cat("Ooops, parece que houve um problema com o fundo", i,"\n")}) # Deve colocar uma mensagem na consola a dizer qual os MSid que geraram erro
}


Mas levantas uma questão interessante. Não vou poder usar as bases de dados de fundos que já "morreram". Vou guardar a do Eurizon Consumer Staples só por causa das coisaas (vai sofrer um merge co outro fundo).

Vê lá se consegues instalar o meu package e o tryCatch() funcionou.

Abr
Artigos e estudos: Página repositório dos meus estudos e análises que vou fazendo. Regularmente actualizada. É costume pelo menos mais um estudo por semana. Inclui a análise e acompanhamento das carteiras 4 e 8Fundos.
Portfolio Analyser: Ferramenta para backtests de Fundos e ETFs Europeus

"We don’t need a crystal ball to be successful investors. However, investing as if you have one is almost guaranteed to lead to sub-par results." The Irrelevant Investor
Avatar do Utilizador
 
Mensagens: 5707
Registado: 20/11/2002 21:56
Localização: Porto

Re: Programação em R para Finanças

por Varendia » 4/2/2017 7:49

Entao aqui vao alguns erros.

1. package ‘AnaliseFI’ is not available (for R version 3.3.2)
2. quando corro a tua funcao aparece-me o seguinte:
Loading required package: xts
Loading required package: zoo

Attaching package: ‘zoo’

The following objects are masked from ‘package:base’:

as.Date, as.Date.numeric

Loading required package: TTR

O R e esperto e vai buscar os packages sozinho...

Eu tambem nao sou um cepo e fui buscar a tua funcao ao GitHub, colei no meu script e aquilo correu que foi uma maravilha ... fiz um print(Fundos) e quase chorei.
Depois chorei mesmo a perguntar-me porque nao meti o meu $ todo no FCI no fim de 2007 ... :mrgreen:

Date FCI GS_SmallCaps MFSTR
2007-12-31 2007-12-31 20.65 8.20 10.18
2008-01-01 2008-01-01 20.65 8.20 10.18
2008-01-02 2008-01-02 20.35 8.06 10.16

Aparece duas vezes a data, a primeira coluna sem nome, acho que deve ser por causa da inicializacao do Fundos na tua funcao. Nada dificil de corrigir.

Apos mais umas buscas, aqui esta a mesma versao a correr automaticamente a ir buscar is MSids a um csv.
Primeiro dava um erro porque o CSV nao era um vector, depois la percebi o que nao estava a funcionar e encontrei a funcao para transformar o CSV automaticamente num vector (readLines)

> print(Fundos[c(1:3,nrow(Fundos)),])
Date F0GBR04EAN F000000FH0 F0GBR05ZUY
2007-12-31 2007-12-31 20.65 8.20 10.18
2008-01-01 2008-01-01 20.65 8.20 10.18
2008-01-02 2008-01-02 20.35 8.06 10.16
2017-01-31 2017-01-31 46.81 18.51 19.03

A questao de datas mais antigas nao e um problema, a funcao preenche com NA

Date F0GBR04EAN F000000FH0 F0GBR05ZUY
1999-12-31 1999-12-31 <NA> <NA> <NA>
2000-01-03 2000-01-03 <NA> <NA> <NA>
2000-01-04 2000-01-04 <NA> <NA> <NA>
2017-01-31 2017-01-31 46.81 18.51 19.03

e depois descobri o Environment que da para ver exactamente o que calculamos e o import Dataset do R ....

Agora o debug .. quando no CSV um dos MSids nao existe .. a funcao estoira e nao corre.
Podia meter-se na funcao um forma de quando o MSid nao existe, preenche com zero e segue em frente.

Tenho de ver onde ha uma funcao para me actualizar a base dos MDids de modo a que existam todos .... Aceito ajuda
"Strategy without tactics is the slowest route to victory. Tactics without strategy is the noise before defeat." Sun Tzu
 
Mensagens: 215
Registado: 10/12/2012 12:12

Re: Programação em R para Finanças

por VirtuaGod » 3/2/2017 19:13

Varendia Escreveu:Nada disso, se fizesses os comentarios eu nao tinha ter de procurar os arguments das funcoes e percebido como funcionava de facto. Agora ja entrei na logica e ja sei onde procurar :D .

Mas ainda fiquei sem preceber como a funcao faz o strip dos fins de semana. Como raio e que aquele strip limpa fins de semana??

AHHHHHH, nada a haver :oops: É uma alteração de formato de datas para por as datas estilo americanas (honestamente nem sei pk mas depois vejo)
Artigos e estudos: Página repositório dos meus estudos e análises que vou fazendo. Regularmente actualizada. É costume pelo menos mais um estudo por semana. Inclui a análise e acompanhamento das carteiras 4 e 8Fundos.
Portfolio Analyser: Ferramenta para backtests de Fundos e ETFs Europeus

"We don’t need a crystal ball to be successful investors. However, investing as if you have one is almost guaranteed to lead to sub-par results." The Irrelevant Investor
Avatar do Utilizador
 
Mensagens: 5707
Registado: 20/11/2002 21:56
Localização: Porto

Re: Programação em R para Finanças

por Varendia » 3/2/2017 18:51

Nada disso, se fizesses os comentarios eu nao tinha ter de procurar os arguments das funcoes e percebido como funcionava de facto. Agora ja entrei na logica e ja sei onde procurar :D .

Mas ainda fiquei sem preceber como a funcao faz o strip dos fins de semana. Como raio e que aquele strip limpa fins de semana??

e porque mudar a formatacao de %Y-%m-%d para "%m/%d/%Y? porque o ficheiro do Best vem assim? e quando reformatas ele reconhece que era uma data e altera os valores? posso sempre meter um print(Begin) para ver o que aconteceu :D
"Strategy without tactics is the slowest route to victory. Tactics without strategy is the noise before defeat." Sun Tzu
 
Mensagens: 215
Registado: 10/12/2012 12:12

Re: Programação em R para Finanças

por VirtuaGod » 3/2/2017 18:14

Varendia Escreveu:Fui ver o teu codigo ao GitHub.
Tive de carregar muita library para a coisa correr.

E interessante porque ja nao mexia em codigo ha muito tempo, mas a linguagem e 'simples' e parece o Scratch que os meus filhos aprendem com tudo por blocos.

Ao fim de uma hora e meia a ler o teu codigo e a ir fazer buscas para ver o que faz cada funcao, acho que consegui descortinar as primeiras linhas. Algumas duvidas abaixo, antes de seguir em frente.

getFI_best <- function(x, Begin_End = "1999-12-31/2017-12-31"){ #Cria uma funcao com dois elementos, uma variavel para mais tarde fazeres o loop, e um string chamado Begin_End
Fundos <- as.data.frame(timeBasedSeq(Begin_End)) # crias um object do tipo data frame chamado Fundos, quando crias tem so uma linha (ou coluna) do tipo time series para o qual usas o string que usaste, a funcao timeBasedSeq faz com que a coluna tenha todos os dias do intervalo do string
colnames(Fundos) <- ("Date") # titulo da coluna do data frame
Fundos$Date <- as.Date(Fundos$Date, format = "%Y-%m-%d") # formatacao da coluna
Begin <- str_sub(Begin_End, start = 1, end = 10) # crias outro objecto chamado Begin e vais buscar '1999-12-31' ao string para o valor de Begin, acredito que para so teres de mudar o Begin_End e este muda automaticamente certo? tambem podias criar um Begin e um End e fazer o Begin_End string com os dois? ou usar o Begin e o End no timeBasedSeq()?
Begin <- as.Date(Begin, format = "%Y-%m-%d") # para formatar o Begin
Begin <- strptime(as.character(Begin), "%Y-%m-%d") # esta nao apanhei, a funcao apaga horas se existirem, mas como esta a ser criado com base na data de Begin_End que nao tem horas, para que serve isto?
Begin <- format(Begin, "%m/%d/%Y") # formata outra vez para / em vez de -? porque?

De investigar mais um pouco, e assustador o tipo de funcoes que ja existem em libraries ... encontrei uma chamada get.hist.quote()
nesta lib tseries

Tenho de olhar para esse code e ver se consigo adaptar a outros sites de onde tipo info com base em graficos. A library parece ter mais umas coisas muito boas.
Ja levo 7 libraries carregadas no meu R.... :shock:
Por hoje ja chega, antes que esturique a cabeca toda.

Cum caraças. Podias-me ter dito que eu fazia os comentários em 5 minutos :lol:

A função strptime() é para tirar os fim de semana :wink: (strip time 8-) ) o str_sub e os format sou eu a mexer no Begin_End e transformar em Begin e End. Obviamente tb posso fazer o oposto. Isso é só o inicio da função. O loop ainda faz parte da função.

De resto estás correcto.

Abr
Artigos e estudos: Página repositório dos meus estudos e análises que vou fazendo. Regularmente actualizada. É costume pelo menos mais um estudo por semana. Inclui a análise e acompanhamento das carteiras 4 e 8Fundos.
Portfolio Analyser: Ferramenta para backtests de Fundos e ETFs Europeus

"We don’t need a crystal ball to be successful investors. However, investing as if you have one is almost guaranteed to lead to sub-par results." The Irrelevant Investor
Avatar do Utilizador
 
Mensagens: 5707
Registado: 20/11/2002 21:56
Localização: Porto

Re: Programação em R para Finanças

por Varendia » 3/2/2017 17:53

Fui ver o teu codigo ao GitHub.
Tive de carregar muita library para a coisa correr.

E interessante porque ja nao mexia em codigo ha muito tempo, mas a linguagem e 'simples' e parece o Scratch que os meus filhos aprendem com tudo por blocos.

Ao fim de uma hora e meia a ler o teu codigo e a ir fazer buscas para ver o que faz cada funcao, acho que consegui descortinar as primeiras linhas. Algumas duvidas abaixo, antes de seguir em frente.

getFI_best <- function(x, Begin_End = "1999-12-31/2017-12-31"){ #Cria uma funcao com dois elementos, uma variavel para mais tarde fazeres o loop, e um string chamado Begin_End
Fundos <- as.data.frame(timeBasedSeq(Begin_End)) # crias um object do tipo data frame chamado Fundos, quando crias tem so uma linha (ou coluna) do tipo time series para o qual usas o string que usaste, a funcao timeBasedSeq faz com que a coluna tenha todos os dias do intervalo do string
colnames(Fundos) <- ("Date") # titulo da coluna do data frame
Fundos$Date <- as.Date(Fundos$Date, format = "%Y-%m-%d") # formatacao da coluna
Begin <- str_sub(Begin_End, start = 1, end = 10) # crias outro objecto chamado Begin e vais buscar '1999-12-31' ao string para o valor de Begin, acredito que para so teres de mudar o Begin_End e este muda automaticamente certo? tambem podias criar um Begin e um End e fazer o Begin_End string com os dois? ou usar o Begin e o End no timeBasedSeq()?
Begin <- as.Date(Begin, format = "%Y-%m-%d") # para formatar o Begin
Begin <- strptime(as.character(Begin), "%Y-%m-%d") # esta nao apanhei, a funcao apaga horas se existirem, mas como esta a ser criado com base na data de Begin_End que nao tem horas, para que serve isto?
Begin <- format(Begin, "%m/%d/%Y") # formata outra vez para / em vez de -? porque?

De investigar mais um pouco, e assustador o tipo de funcoes que ja existem em libraries ... encontrei uma chamada get.hist.quote()
nesta lib tseries

Tenho de olhar para esse code e ver se consigo adaptar a outros sites de onde tipo info com base em graficos. A library parece ter mais umas coisas muito boas.
Ja levo 7 libraries carregadas no meu R.... :shock:
Por hoje ja chega, antes que esturique a cabeca toda.
"Strategy without tactics is the slowest route to victory. Tactics without strategy is the noise before defeat." Sun Tzu
 
Mensagens: 215
Registado: 10/12/2012 12:12

Re: Programação em R para Finanças

por VirtuaGod » 3/2/2017 16:17

Varendia Escreveu:1. A criacao/actualizacao/formatacao da base de dados (download e tratamento), que nao e so de dados do Best. Provavelmente preciso de mais do que uma rotina para isto, dependendo da origem dos dados.

Vamo-nos focar nisto.

Sim, diferentes fontes têm diferentes "rotinas" que terão de ser incluidas no script. O de fundos do Best tens no meu script. Que precisas de adicionar mais? yahoo? que outros activos? ETFs americanos? Dá-me um exemplo sff dos dados que vais buscar que não são do best e a gente vê já isso...

P.S. Até se usas excel no trabalho, e perdes muitas horas em excel em tratamento de dados, a mais valia do R vai ser brutal em termos profissionais.
Artigos e estudos: Página repositório dos meus estudos e análises que vou fazendo. Regularmente actualizada. É costume pelo menos mais um estudo por semana. Inclui a análise e acompanhamento das carteiras 4 e 8Fundos.
Portfolio Analyser: Ferramenta para backtests de Fundos e ETFs Europeus

"We don’t need a crystal ball to be successful investors. However, investing as if you have one is almost guaranteed to lead to sub-par results." The Irrelevant Investor
Avatar do Utilizador
 
Mensagens: 5707
Registado: 20/11/2002 21:56
Localização: Porto

Re: Programação em R para Finanças

por Varendia » 3/2/2017 15:45

Sem duvida que neste caso o optimo e inimigo do bom. Colocaria os passos a fazer em :
1. A criacao/actualizacao/formatacao da base de dados (download e tratamento), que nao e so de dados do Best. Provavelmente preciso de mais do que uma rotina para isto, dependendo da origem dos dados.
2. Regressions para modelar historicos de fundos (que faco de forma muito bruta e na qual nao confio muito). Se tiver a DB arranjada, consigo simular no excel quais as variaveis que se adequam mais atraves de R2 e depois fazer as regressoes a partir de um csv criado do meu excel. Ou entao ir para um machine learning, e fazer o R escolher as variaveis para fazer as regressoes. Para isto ja tenho de aprender muito muito.
3. Efficient Frontier com mais detalhe e definicao de intervalos para rebalancing. O Solver nao me anima.

Os returns, correlations, var/covar e facil fazer no excel. Ate o follow up nao e complicado, Levo 1 a 2 horas por mes e nao e muito automatizavel por causa das parcelas cash/moedas/outros produtos.. etc... Fazer um rotina para isso ia ser meter dados no R em vez de os meter no excel. E no excel as tabelas funcionam todas de forma automatica, meto os dados, faco dois copy/paste e fica tudo updated.

Vou ver o teu script para retirar dados e ver onde chego.
"Strategy without tactics is the slowest route to victory. Tactics without strategy is the noise before defeat." Sun Tzu
 
Mensagens: 215
Registado: 10/12/2012 12:12

Re: Programação em R para Finanças

por VirtuaGod » 3/2/2017 14:26

Varendia Escreveu:Comecei a ler umas coisas e estou com muito medo. Ja existem library de tudo e umas botas.

Por um lado estou a ver o muito trabalho que vai dar ate ter um programa a fazer o mesmo que o meu excel. Por outro estou a ver o quao facil ira ficar depois o colocar/retirar informacao.
Depois tudo o que faz a mais e melhor que o meu excel, que da para ver.

Uma questao, No meu excel (por exemplo), se quero tirar um report inteiro de um fundo ou de um portfolio, e muito facil desde que tenha os dados tratados. Quao facil sera fazer o mesmo? consegue-se facilmente criar um interface para escolher opcoes ou tera de se andar no codigo sempre que se quer testar alguma coisa, ou alterar ficheiros de dados, ou o q?

Não penses para já em alterar TUDO que tens no excel pelo R. Não sabes o suficiente (ainda). Baby steps :mrgreen: . Pessoalmente quando comecei e o primeiro script com aplicação real/prática foi resultado de uma questão:

O que é que eu perco horas a fazer no excel que tenho a sensação que um computador demoria segundos a fazer?

No meu caso a resposta foi simples. A base de dados das cotações. Eu demorava umas 4/5 horas a actualizar as cotações. Era um processo chato e repetitivo. Fiz um script que provavelmente me demorou essas 3 ou 4 horas a escrever mas a actualização de dados passou a a demorar 15 segundos :mrgreen: (neste momento demoraria uns 15 minutos a fazer um script semelhante de raiz).

Para já pensa em como o R pode complementar o teu excel. Depois aos poucos ele acabará por o substituir se um dia te sentires comfortável a escrever código em R. O que achas que o R pode fazer em vez de fazeres manualmente para implementares/actualizares no teu excel?

Uma questao, No meu excel (por exemplo), se quero tirar um report inteiro de um fundo ou de um portfolio, e muito facil desde que tenha os dados tratados.

Tão simples como correres um script. Existe uma ferramenta chamada Rmardown que faz os reports (podes ver uns exemplos na minha assinatura no meu RPubs).

consegue-se facilmente criar um interface para escolher opcões ou tera de se andar no codigo sempre que se quer testar alguma coisa, ou alterar ficheiros de dados, ou o q?

Embora possas fazer uma intereface simples e bonita (Shiny App) isso só será para a interacção de alguém que não percebe de programação com o teu script. Para ti vai ser sempre mais simples alterares coisas no código. Acredita. Como o código foi escrito por ti vai-se tornar tão simples com trabalhar em excel.
Artigos e estudos: Página repositório dos meus estudos e análises que vou fazendo. Regularmente actualizada. É costume pelo menos mais um estudo por semana. Inclui a análise e acompanhamento das carteiras 4 e 8Fundos.
Portfolio Analyser: Ferramenta para backtests de Fundos e ETFs Europeus

"We don’t need a crystal ball to be successful investors. However, investing as if you have one is almost guaranteed to lead to sub-par results." The Irrelevant Investor
Avatar do Utilizador
 
Mensagens: 5707
Registado: 20/11/2002 21:56
Localização: Porto

Re: Programação em R para Finanças

por Varendia » 3/2/2017 6:57

Comecei a ler umas coisas e estou com muito medo. Ja existem library de tudo e umas botas.

Por um lado estou a ver o muito trabalho que vai dar ate ter um programa a fazer o mesmo que o meu excel. Por outro estou a ver o quao facil ira ficar depois o colocar/retirar informacao.
Depois tudo o que faz a mais e melhor que o meu excel, que da para ver.

Uma questao, No meu excel (por exemplo), se quero tirar um report inteiro de um fundo ou de um portfolio, e muito facil desde que tenha os dados tratados. Quao facil sera fazer o mesmo? consegue-se facilmente criar um interface para escolher opcoes ou tera de se andar no codigo sempre que se quer testar alguma coisa, ou alterar ficheiros de dados, ou o q?
"Strategy without tactics is the slowest route to victory. Tactics without strategy is the noise before defeat." Sun Tzu
 
Mensagens: 215
Registado: 10/12/2012 12:12

Re: Programação em R para Finanças

por VirtuaGod » 2/2/2017 17:23

Varendia Escreveu:Error in setwd("'C:/Users/Hugo/Documents/'") :
cannot change working directory

Acho que vou viver sem o setwd :D

Não faças isso. O setwd() é o maior :mrgreen: :mrgreen: Tens um erro no código. Tens aspas repetidas. Usa ' em vez de " se for mais simples.

Tenta este:

Código: Selecionar todos
setwd("C:/Users/Hugo/Documents/")
Artigos e estudos: Página repositório dos meus estudos e análises que vou fazendo. Regularmente actualizada. É costume pelo menos mais um estudo por semana. Inclui a análise e acompanhamento das carteiras 4 e 8Fundos.
Portfolio Analyser: Ferramenta para backtests de Fundos e ETFs Europeus

"We don’t need a crystal ball to be successful investors. However, investing as if you have one is almost guaranteed to lead to sub-par results." The Irrelevant Investor
Avatar do Utilizador
 
Mensagens: 5707
Registado: 20/11/2002 21:56
Localização: Porto

Re: Programação em R para Finanças

por Varendia » 2/2/2017 16:08

And so it begins..

R version 3.3.2 (2016-10-31) -- "Sincere Pumpkin Patch"
Copyright (C) 2016 The R Foundation for Statistical Computing
Platform: x86_64-w64-mingw32/x64 (64-bit)

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

Ja fiz as tres primeiras aulas ... acho que la para o fim do fim de semana esta na altura de fazer um skip para os downloads .. :shock:

Primeiro erro na aula 6
Error in setwd("'C:/Users/Hugo/Documents/'") :
cannot change working directory

Acho que vou viver sem o setwd :D
Editado pela última vez por Varendia em 2/2/2017 18:28, num total de 1 vez.
"Strategy without tactics is the slowest route to victory. Tactics without strategy is the noise before defeat." Sun Tzu
 
Mensagens: 215
Registado: 10/12/2012 12:12

Re: Programação em R para Finanças

por VirtuaGod » 1/2/2017 19:08

Varendia Escreveu:1. Quando te referes aos Morningstar IDs, onde esta a rotina a ir buscar essa lista? nao vejo no script um ficheiro.

Criei eu. Tenho um Script de R que me vai ler um ficheiro CSV onde tenho (e adiciono) a MSid dos vários fundos e ele me vai buscar toda a info que quero através de webscraping. Se está na net eu consigo sacar. Incluindo toda a info de que falas abaixo se quiser. Pessoalmente só saco o ISIN, o nome e a moeda.

Mas a ideia é colocar mesmo na minha função. Exemplo acima saca 3 fundos com o MSid, testa. Depois passamos para os passos seguintes de exportar as cotações para CSV etc etc

E depois para onde esta o R a carregar esta informacao? ele cria um ficheiro csv com tudo tratado? ou esta a carregar para a tua matrix dentro da rotina quando corres os dados? e depois como guarda? consegues enviar para um csv? excel?

Yaps. Mais simples é enviar para um ficheiro CSV.

E se tiveres outros dados noutro csv? como importas para a mesma base? tens de correr so a parte de 'tratar'? sera mais facil ter uma rotina a descarregar dados para ficheiros individuais e outra so para os 'arranjar'?

Importo e dou um nome, por exemplo "DB" e depois aos que saco chamo "DB.act" (chamas o que quiseres obviamente mas eu uso DB para "database" e o .act seria algo que eu usaria para as "actualizações"). Depois faço um "merge" e em simultâneo "na.locf" que é uma função que se não houver cotação em determinado dia (NA) ele faz LOCF (Last observation carried forward). Assim alinhas as cotações todas.

Felizmente não tens de saber NADA disso, a minha função faz tudo :mrgreen: Só tens de incluir os MSid, e ela cria um data.table (ficheiro "virtual" no ambiente R) denominado "Fundos" com todas as cotações, alinhadas de todos os fundos.

Por exemplo no meu excel tenho um sheet que tem em colunas o seguinte:
Morningstar Category |Proprietary Category|Cat Group| Internal Code | ISIN |Name | Morningstar ID |WKN |Benchmark|Hedged |Currency

Depois uso-o para filtrar o que quero usar no backtest. Com o Internal Code (mas podia fazer com o que quisesse) tenho uma segunda sheet que vai buscar os dados que tenho tratados.
Uso as bases de dados todas que encontro, Best / WKN / Yahoo / Indices de todo o tipo / moedas / etc...
Uma alegria era o tratamento dos ficheiros das varias bases. Mesmo daquelas que se descarregam 'manualmente'.

Isso dá para fazer tudo mas complica bastante se não tens bases de programação. As cotações dos fundos do Best até não é complicado com a minha função, mas nada mais que isso.

agora o problema que tenho e fazer a calibration/regressoes para quando nao ha historico suficiente. Missing not at random data in Time Series. Por isso a funcionar e que era a completa loucura. E a parte que me impede de fazer os backtests como gostaria.

Se só usas fundos do best a minha função cria-te a base de dados das cotações. Posso-te pôr aqui um script onde só tens de incluir o MSid para te ir sacar as cotações. Em alternativa se quiseres envia-me posso colocar no script uma linha para ir ler um ficheiro .CSV com os MSid. Mas é complicado trabalhar assim à distância, às vezes dá um erro simples que não saberás solucionar. Mas diz aí como queres que eu tento enviar-te um script para testares. Só usas fundos do Best?

P.S. Saca o R e só depois o RStudio, deve ficar tudo 5 estrelas como se fosse só um programa. Primeiro corre o código "Para instalar" onde podes ver que está a instalar os packages e depois corres o código actualizado de exemplo da minha função. O código de instalação corre na consola mas o exemplo podes (e deves) usar a janela de "Source" (e para correr o código clicas em "source, em vez de carregares no Enter como na consola).
Artigos e estudos: Página repositório dos meus estudos e análises que vou fazendo. Regularmente actualizada. É costume pelo menos mais um estudo por semana. Inclui a análise e acompanhamento das carteiras 4 e 8Fundos.
Portfolio Analyser: Ferramenta para backtests de Fundos e ETFs Europeus

"We don’t need a crystal ball to be successful investors. However, investing as if you have one is almost guaranteed to lead to sub-par results." The Irrelevant Investor
Avatar do Utilizador
 
Mensagens: 5707
Registado: 20/11/2002 21:56
Localização: Porto

Re: Programação em R para Finanças

por Varendia » 1/2/2017 12:27

Bolas, este thread estava aqui escondido!

Muito interessante, tenho de experimentar isso em casa!
Entre trabalho, mestrado pos laboral e estar a mudar de pais outra vez, ver quando arranjo algum tempo.

Tenho ja umas perguntas:
1. Quando te referes aos Morningstar IDs, onde esta a rotina a ir buscar essa lista? nao vejo no script um ficheiro. E depois para onde esta o R a carregar esta informacao? ele cria um ficheiro csv com tudo tratado? ou esta a carregar para a tua matrix dentro da rotina quando corres os dados? e depois como guarda? consegues enviar para um csv? excel?

2. E se tiveres outros dados noutro csv? como importas para a mesma base? tens de correr so a parte de 'tratar'? sera mais facil ter uma rotina a descarregar dados para ficheiros individuais e outra so para os 'arranjar'?

Por exemplo no meu excel tenho um sheet que tem em colunas o seguinte:
Morningstar Category |Proprietary Category|Cat Group| Internal Code | ISIN |Name | Morningstar ID |WKN |Benchmark|Hedged |Currency

Depois uso-o para filtrar o que quero usar no backtest. Com o Internal Code (mas podia fazer com o que quisesse) tenho uma segunda sheet que vai buscar os dados que tenho tratados.
Uso as bases de dados todas que encontro, Best / WKN / Yahoo / Indices de todo o tipo / moedas / etc...
Uma alegria era o tratamento dos ficheiros das varias bases. Mesmo daquelas que se descarregam 'manualmente'.

3. agora o problema que tenho e fazer a calibration/regressoes para quando nao ha historico suficiente. Missing not at random data in Time Series. Por isso a funcionar e que era a completa loucura. E a parte que me impede de fazer os backtests como gostaria.
"Strategy without tactics is the slowest route to victory. Tactics without strategy is the noise before defeat." Sun Tzu
 
Mensagens: 215
Registado: 10/12/2012 12:12

Re: Programação em R para Finanças

por VirtuaGod » 25/1/2017 12:07

Isto ainda está em pré alpha lol. estou sempre a alterar coisas por isso pode haver um ou outro bug mas acho que te safas.

Já vai com 3 funções:
AnaliseFI no Github

Código acima corrigido para as alterações que entretanto fiz na função:

Código: Selecionar todos
library(quantmod)
library(stringr)
library(AnaliseFI)

MSid       <- c("F0GBR04EAN", "F000000FH0", "F0GBR05ZUY")
MSid.names <- c("FCI", "GS_SmallCaps", "MFSTR")

getFI_best(MSid, Begin_End = "2007-12-31/2017-01-20")

colnames(Fundos) <- c("Date", MSid.names)
plot(F0GBR05ZUY, main = "MFS Global Total Return")
Artigos e estudos: Página repositório dos meus estudos e análises que vou fazendo. Regularmente actualizada. É costume pelo menos mais um estudo por semana. Inclui a análise e acompanhamento das carteiras 4 e 8Fundos.
Portfolio Analyser: Ferramenta para backtests de Fundos e ETFs Europeus

"We don’t need a crystal ball to be successful investors. However, investing as if you have one is almost guaranteed to lead to sub-par results." The Irrelevant Investor
Avatar do Utilizador
 
Mensagens: 5707
Registado: 20/11/2002 21:56
Localização: Porto

AnteriorPróximo

Quem está ligado: