Ferramentas do usuário

Ferramentas do site


05_curso_antigo:r2018:alunos:trabalho_final:augusto.rampasso:start

Augusto Santos Rampasso

foto_augusto.jpg

Mestrando do Departamento de Genética e Biologia Evolutiva do Instituto de Biociências da USP.

Meus interesses são ecologia e evolução de drosofilídeos. O título do meu projeto é: “Substratos de desenvolvimento larval de Drosophilidae (Diptera) na reserva florestal Do Instituto de Biociências da USP”.



1 - Exercícios

Atalho para a página com os meus exercícios resolvidos: Exercícios_Augusto



2 - Trabalho Final


2.1 - Proposta A

Contextualização

Uma carteira de investimentos de longo prazo deve contar com aplicações diversificadas para que haja redução das chances de perda de capital ao longo do tempo. Sendo assim, além de investimentos em renda fixa também é recomendado investir em renda variável (ilustrada aqui por ações de 2 empresas) para aumentar a remuneração sobre seu capital. A estratégia usada aqui é de acúmulo de ações das empresas escolhidas, ou seja, a cada mês o usuário comprará ações de apenas uma empresa e em nenhum momento será sugerida a retirada de capital de nenhuma aplicação. Atenção: os investimentos indicados nesse projeto devem ser encarados apenas como exemplos, e jamais como recomendações! Se o usuário se interessar pelo assunto, é essencial um estudo prévio sobre os investimentos disponíveis no mercado, análise de empresas e elaboração da sua própria estratégia.

Para usar essa função, o usuário deve organizar uma planilha.csv de controle dos seus investimentos. Nessa planilha o usuário terá a liberdade de escolher quais e em quantas empresas deseja investir e a proporção do seu patrimônio que será alocada em cada uma delas. Eu indico o seguinte formato:

tabela_a_ok.png

Embora as colunas “nome_empresa” e “cnpj_empresa” não participem dessa análise, é interessante manter todas as informações organizadas para facilitar o processo de declaração do imposto de renda. Na coluna “objetivos” o usuário deverá estabelecer qual é a proporção do seu capital que é desejado alocar em cada empresa e a soma das proporções deve ser igual a 1. A coluna quantidade_acoes deverá ser preenchida com o número de ações que o usuário possui no momento em que a análise for feita (o próprio R puxará as cotações do dia e multiplicará pela quantidade de ações para determinar seu patrimônio).

Observação: eu encontrei 3 pacotes que podem fornecer as cotações (tidyquant, GetHFData e BatchGetSymbols), mas ainda estou aprendendo a mexer neles. Se não for possível obter essas informações assim, eu tentaria baixá-las diretamente de algum site.

A decisão de qual investimento escolher para alocar seu dinheiro a cada mês é sempre importante, e não deve ser influenciada por percepções subjetivas ou por informações veiculadas na mídia. A intenção dessa função é facilitar esse processo de escolha. Após comparar as proporções dos objetivos do investidor com as proporções do seu patrimônio efetivamente aplicado, a função retornará um dotplot que destaca com um asterisco qual dos investimentos atuais é o menor em relação ao seu objetivo. Com isso, o usuário saberá que é nesse investimento que o aporte mensal deverá ser alocado.

Planejamento da função

Entrada: no_que_investir (investimento, quantidade_acoes, objetivos, data = planilha)

  • investimento: coluna da planilha com os dados preenchidos que serão analisados (classe = factor).
  • quantidade_acoes: coluna da planilha com os dados preenchidos que serão analisados (classe = numeric).
  • objetivos: coluna da planilha com as proporções de investimento desejadas em cada empresa. A soma dos valores deve ser igual a 1 (classe = numeric).

Verificando os parâmetros:

  • investimento: a coluna está completamente preenchida? Se não, escreve: “A coluna “investimento” não está completamente preenchida.”
  • quantidade_acoes: a coluna está completamente preenchida? Se não, escreve: “A coluna “quantidade_acoes” não está completamente preenchida.”
  • objetivos: a soma dos objetivos é igual a 1? Se não, escreve: “A soma dos objetivos deve ser igual a 1.”

Pseudo-código:

  1. Carrega o pacote tidyquant, GetHFData ou BatchGetSymbols.
  2. Cria um data frame chamado renda_variavel com as colunas informadas na entrada (investimento, quantidade_acoes, objetivos).
  3. Nomeia as colunas investimento, quantidade_acoes e objetivos.
  4. Cria uma coluna chamada acoes_valor no data frame renda_variavel cheia de NAs.
  5. Entra em um ciclo for com contador i de 1 a nrow(renda_variavel).
    1. Puxa a cotação da ação indicada na coluna investimentos e multiplica pelo total de ações presente na coluna quantidade_acoes.
    2. Acrescenta o resultado na coluna acoes_valor.
  6. Soma o total investido em ações e o salva no objeto acoes_total.
  7. Divide cada valor presente na coluna acoes_valor por acoes_total e salva o resultado em um vetor chamado acoes_proporcao.
  8. Cria um dotplot (x = empresas, y = proporção do capital) com os dados presentes nas colunas investimentos e objetivo. Tendo em vista que nesse gráfico serão plotadas proporções, e não valores absolutos, e que a soma de todas as proporções deve ser igual a 1 (que é o valor máximo possível), o eixo y será definido da seguinte maneira: ymin = 0, ymax = 1. Os pontos que representam os objetivos terão a cor azul.
  9. Abre a função points para acrescentar os valores presentes no vetor acoes_proporcao. Para isso, haverá outro ciclo for com contador i de 1 a nrow(renda_variavel). Os pontos que representam a proporção do patrimônio em cada empresa terão a cor verde.
  10. Com a função text será incluída uma legenda que indique o que as cores dos pontos (azul e verde) significam.
  11. Abre a função lines para traçar uma linha vermelha que ligue os pontos do objetivo e proporção do patrimônio em cada empresa. Para isso, haverá mais um ciclo for com contador i de 1 a nrow(renda_variavel).
  12. Subtrai o valor de cada posição do vetor acoes_proporcao pelo objetivo da empresa correspondente e acrescenta o resultado ao lado de cada linha vermelha traçada no item anterior. Para isso, haverá um último ciclo for com contador i de 1 a nrow(renda_variavel).
  13. Com a função text, incluir um * na posição 1 do eixo y da empresa cujo resultado da subtração acoes_proporcao pelo objetivo for o mínimo.

Saída:

Um dotplot contendo pontos indicando o objetivo e a proporção do patrimônio investido em cada empresa. Os pontos serão unidos por uma reta, e ao seu lado estará escrita qual é o resultado da subtração “acoes_proporcao” pelo “objetivo”. Acima da empresa cujo valor dessa diferença for o mínimo, haverá um asterisco. Veja abaixo uma ilustração de como essa figura deve ficar:

grafico.png


2.2 - Proposta B

Contextualização

Para elaborar um bom planejamento financeiro, é necessário refletir sobre quais proporções do salário deve ser reservada para cada tipo de objetivo. Por exemplo, uma parte do salário pode ser reservada para gastos fixos (que englobam gastos com moradia, transporte e alimentação), metas de curto prazo (que devem ser cumpridas em cerca de 1 ano), metas de médio prazo (que devem ser cumpridas em cerca de 5 anos), metas de longo prazo (que devem ser cumpridas em mais de 5 anos), educação (como compras de livros ou xerox) e lazer (que é fundamental!).

Após definir as proporções do salário que serão destinadas para cada fim, é recomendado que o usuário mantenha uma planilha.csv de controle de gastos, para que possa rastrear exatamente onde gastos excessivos estejam localizados e, com isso, refletir sobre quais atitudes serão necessárias para que ele entre em uma situação de equilíbrio.

A planilha pode seguir o seguinte modelo:

tabela_b.png

Em seguida, criar um vetor chamado objetivos que contenha as proporções do salário que serão destinadas a cada tipo de gasto. A soma desses objetivos deve ser igual a 1.

Além disso, criar um objeto chamado salario contendo o valor do quanto o usuário recebeu naquele mês.

Planejamento da função

Entrada: meus_gastos (planilha, objetivos, salario)

  • planilha: tabela com os gastos separados por categorias.
  • objetivos: vetor com as proporções de investimento desejadas em cada empresa. A soma dos valores deve ser igual a 1 (classe = numeric).
  • salario: o valor do salário (class = numeric, N > 0).

Verificando os parâmetros:

  • planilha: todas as colunas da tabela estão preenchidas? Se não, escreve: “Completar de postar os gastos em todas as colunas da tabela”.
  • objetivos: a soma dos objetivos é igual a 1? Se não, escreve: “A soma dos objetivos deve ser igual a 1.”
  • salario: o valor é maior que zero? Se não, escreve: o “valor deve ser maior que zero.”

Pseudo-código:

  1. Cria um vetor chamado totais cheia de Nas: rep(NA, ncol(planilha))
  2. Entra em um ciclo for com contador i de 1 a ncol(planilha).
    1. Soma todos os valores presentes em cada coluna.
    2. Acrescenta o resultado no vetor totais.
  3. Divide cada valor presente no vetor totais por salario e salva o resultado em um vetor chamado proporcoes.
  4. Cria um data frame chamado proporcoes_por_gastos com uma coluna com as categorias de gastos (gastos_fixos, metas_curto_p, metas_medio_p, metas_longo_p, educacao e lazer) e a outra com as informações dos vetores objetivos e proporcoes.
  5. Cria um gráfico de barras (x = categorias de gastos, y = proporções dos gastos) com as informações presentes no data frame proporcoes_por_gastos. As barras que representam as proporções terão a cor verde e as que representam os objetivos terão a cor azul. Dessa forma, as barras com o objetivo de gastos e a proporção dos gastos reais ficarão lado a lado.
  6. Com a função text será incluída uma legenda que indique o que as cores das barras (azul e verde) significam.
  7. Subtrai o valor de cada posição do vetor proporcoes pelo objetivo e acrescenta o resultado no topo das barras. Para isso, haverá um ciclo for com contador i de 1 a ncol(planilha).
  8. Com a função text, incluir um * na posição 1 do eixo y dos gastos cujos resultados das subtrações proporcoes pelo objetivo for maior que zero (já que valores positivos indicam que a proporção do gasto foi superior ao objetivo). Para isso, será necessário usar a função if dentro de outro ciclo for com contador i de 1 a ncol(planilha).

Saída:

Um gráfico de barras que compara as proporções de gastos observada com o objetivo de gastos planejado inicialmente. No topo das barras de cada tipo de gasto será acrescentado o resultado da subtração dos vetores proporcoes pelo objetivo. Nos casos em que os resultados forem positivos, serão inseridos asteriscos.


Comentários Melina

PROPOSTA A

Achei a proposta A bem detalhada e interessante, mas me parece ainda pouco desafiadora. Me vieram algumas questões que podem ser pensadas na hora de fazer a função de forma a incrementa-la:

Fiquei pensando se o usuário coloca uma empresa com o nome errado ou que não existe no “banco de dados” das cotações que você vai pesquisar (usando os pacotes), o que acontecerá com sua função? Vale a pena procurar por nomes parecidos e avisar ao usuário que o nome que ele colocou não foi encontrados e que talvez ele estivesse querendo dizer “tal empresa”? Ou simplesmente uma mensagem de erro avisando que aquela empresa não foi encontrada? Caso não encontre, como vai prosseguir com as análises para as outras empresas? Ignorar e seguir com os cálculos ou parar e não rodar nada?

E se houver empate entre empresas nas diferenças da proporção e do objetivo? Como a função vai agir na escolha da empresa?

A função vai indicar qual empresa se deve comprar mais ações, mas quantas ações o usuário teria que comprar pra atingir seu objetivo? Acho que seria uma saída boa para a função e não vai requerer muito código porque você já tem as informações necessárias, né?

Acho que o data.frame que você vai montar dentro da função pode ser uma saída também além da gráfica, pelo menos eu como usuária iria querer ver o valor unitário das minhas ações naquele dia (você poderia criar uma nova coluna com essa infomação) e o valor total das ações que possuo.

Será que vale a pena também haver um argumento na função onde o usuário indica quanto tem para investir? Aí a função faz as contas e sugere aonde investir, pois penso que talvez, para atingir o objetivo, a função possa dizer que precisa investir tanto numa e tanto em outra empresa.

Me parece que para a parte gráfica, alguns (ou todos) os loops preditos no pseudocódigo são desnecessários, pois é só dar o vetor de onde serão os pontos e linhas.

PROPOSTA B

Essa proposta também está muito bem explicada, mas me pareceu simples demais. Pelo que vi, você vai apenas fazer umas manipulações de objetos e cálculos para chegar num gráfico final. Acho que para seguir em frente com ela, é preciso ter alguma proposta mais desafiadora, que não seria fácil de ser alcançado simplesmente rodando um punhado de linhas de código. E se as análises fossem mensais (ou em qualquer outro intervalo de tempo) e não para apenas um período? Como ficariam as análises gráficas mensais e totais? Enfim, abaixo faço alguns comentários, mas acho que se você quiser permanecer com essa proposta, precisará dar uma incrementada nela.

Encontrei um errinho na entrada de objetivos, você copiou e colou a descrição da proposta A e nessa proposta isso não faz sentido.

Quando vc diz que para verificar os parâmetros é necessário que todas as colunas da planilha estejam preenchidas, você obriga o usuário a ter gasto/investimento para todas as categorias, mas pode ser que num mês específico ele não gastou ou investiu nada em lazer, como fica? O usuário precisa colocar um 0?

Outra coisa é que o formato da planilha de entrada pode ser diferente, com duas colunas indicando o tipo de gasto/investimento e o valor. Para mim, fica mais fácil do usuário preenche-la, e talvez mais fácil para você manipular na função.


Enfim, as propostas estão bem escritas, o que me ajudou a entenda-las! Eu sugiro que você faça a proposta A que tem alguns elementos mais interessantes de serem desenvolvidos do que a proposta B. Se você seguir com a A, veja se consegue incorporar algumas das sugestões que fiz. Se você preferir a B, acho que seria bom incrementá-la para que não fique simples demais (podendo afetar sua nota).

Se quiser que eu veja seus comentários sobre os meus comentários, ou tenha dúvidas ou qualquer outra coisa, me mande um email: melina.leite@ib.usp.br pois eu não monitoro a página wiki tão regularmente.

Bom trabalho!


Resposta Augusto

Oi Melina!

Obrigado pelos seus comentários!!

Eu fiquei feliz por você ter escolhido a proposta A, já que ela é a que mais me interessava e que eu dediquei mais tempo na elaboração!

Eu vou discutir um pouco as suas sugestões agora:

1 – usuário inserir nome errado de uma empresa: eu não tinha pensado sobre isso, e realmente é algo muito importante!! Caso aconteça, eu acho válido que a função abra uma mensagem de erro e não rode. Eu prefiro esse caminho porque seria muito difícil prever o que o usuário teria em mente, já que existem empresas com códigos muito parecidos, além de empresas que oferecem diferentes tipos de ações (ON e PN), que também possuem códigos um pouquinho diferentes (um deles termina com o número 3 e, o outro, com o 4). E ignorar a empresa que estivesse com o código errado e seguir adiante causaria um erro de cálculo do patrimônio total, uma vez que ele será calculado dentro da própria função.

2 – empate entre empresas: como o usuário teria diferentes quantidades de ações, objetivos de investir uma proporção diferente em cada empresa e que os preços das cotações variam, eu acredito que a chance de ter empate seja muito baixa. Mas se acontecer, a função poderia colocar o asterisco em ambas as empresas, indicando que as duas seriam igualmente boas para investir naquele momento. Nesse caso, a tomada de decisão seria do próprio usuário, mas eu realmente acho que a chance disso acontecer é muito baixa.

3 – a função indicar quantas ações o usuário teria que comprar para atingir seu objetivo: puxa, eu não tinha pensado nisso, e adorei sua ideia!! Com certeza vou incorporar na função!!

4 – o data frame ser uma das saídas: seria mesmo válido mostrar o data frame no final, farei isso!!

5 – o usuário indicar o quanto tem para investir e a função distribuir entre empresas: isso poderia ser feito, mas eu não acho que seria muito interessante. O motivo para isso é que toda compra ou venda de ações envolve custos, sabe? Então se o usuário comprasse ações de duas empresas no mesmo mês, os gastos com taxas pela compra seriam dobrados. Então para otimizar o dinheiro disponível para investir, é mais vantajoso investir em uma única empresa a cada mês.

6 – loops da parte gráfico no pseudocódigo: eu tenho certeza que você tem razão e que eles devem ser desnecessários mesmo… É que na minha cabeça esse seria o melhor caminho, mas na hora em que eu estiver escrevendo a função vou tentar fazer sem os loops para ver se consigo fazer funcionar!

3 - Trabalho final

Atalho para a página com a minha função e sua página de help: Trabalho final: Função NO QUE INVESTIR

05_curso_antigo/r2018/alunos/trabalho_final/augusto.rampasso/start.txt · Última modificação: 2020/08/12 06:04 (edição externa)