Friday 19 January 2018

Implementação de média móvel exponencial


Estou desenvolvendo um pequeno robô comercial como um exercício. Ele recebe os preços das ações dia após dia (representados como iterações). Heres o que minha classe de comércio olha como: Como você pode ver de meus dois atributos passados, eu desejo executar uma média movente exponencial como parte de um algoritmo seguinte da tendência. Mas eu acho que eu não entendi muito bem como implementá-lo heres minha função calcEMA que simplesmente calcula o EMA: Mas quando meus valores de ações (passado em um arquivo) são como tal: Como para certificar-se de que o meu EMA faz sentido, e bem. Ele não Onde eu errei na operação Adicionalmente, que valor devo dar lastEMA se é a primeira vez que eu chamo calcEMA A operação está errada, como você observou. Disclaimer Eu tenho esse algoritmo da wikipedia. E como tal não poderia ser preciso. Aqui (página 3) pode ser melhor, mas eu não consigo julgar, eu nunca usei esses algoritmos e por isso não tenho idéia do que estou falando :) c (EMA) y (EMA) ) EMA (EMA) é EMA anterior é EMA anterior é um valor aleatório entre 0 e 1 c (preço) é preço atual Mas você fez quase a mesma coisa: c (EMA) Y (EMA) b) y (EMA) Eu não sei por que você fez 2 / daysInTrading 1. mas isso nem sempre será um valor entre 0 e 1 (na verdade, pode ser mesmo a maior parte do tempo 0, porque são todos Intergers). Você coloca um parêntese no lugar errado (depois de B. e não depois de y (EMA)). Assim, a operação agora será assim: lastEMA 0.5 (currentStock - lastEMA) Para o primeiro lastEMA. De acordo com a Wikipedia: S 1 é indefinido. S 1 pode ser inicializado de várias maneiras diferentes, mais comumente definindo o primeiro elemento na lista, embora existam outras técnicas, como definir S 1 para uma média das primeiras 4 ou 5 observações. A importância do efeito de inicialização S 1 na média móvel resultante depende de valores menores, tornando a escolha de S 1 relativamente mais importante do que valores maiores, uma vez que um maior desacelera mais rapidamente as observações mais antigas. Respondeu 18 de maio às 13:30 eu acredito que você está faltando um parênteses em você função calcEMA. Ele ajuda a quebrar a expressão em expressões menores com variáveis ​​temporárias para manter resultados intermediários. Além disso, como PaulMcKenzie apontou nos comentários, você está usando ints para fazer matemática ponto flutuante. Você deve considerar o uso de flutuadores ou dobra para evitar o truncamento. Um EMA como o seu é definido para um período de tempo, chamado timePeriod acima. Enquanto daysInTrading é menor ou igual a timePeriod, lastEMA deve ser definido apenas para uma média normal. Uma vez que daysInTrading é maior do que seu timePeriod você pode começar a chamar sua função calcEMA com lastEMA devidamente inicializado. Lembre-se de atualizar o lastEMA após cada chamada para o calcEMA. Aqui está uma implementação possível: respondida em 18 de maio às 15: 18Eu tenho basicamente uma matriz de valores como este: A matriz acima é simplificada, estou colecionando 1 valor por milissegundo no meu código real e eu preciso processar a saída em um algoritmo que eu escrevi Para encontrar o pico mais próximo antes de um ponto no tempo. Minha lógica falha porque no meu exemplo acima, 0.36 é o pico real, mas meu algoritmo olharia para trás e veria o último número 0.25 como o pico, pois há uma diminuição para 0.24 antes dele. O objetivo é tomar esses valores e aplicar um algoritmo para eles que irá suavizar-los um pouco para que eu tenha mais valores lineares. (Ou seja: Id como meus resultados para ser curvy, não jaggedy) Ive foi dito para aplicar um filtro exponencial de média móvel para os meus valores. Como posso fazer isso É muito difícil para mim ler equações matemáticas, eu lidar muito melhor com o código. Como processar valores em minha matriz, aplicando um cálculo de média móvel exponencial para até mesmo para fora perguntado Feb 8 12 at 20:27 Para calcular uma média móvel exponencial. Você precisa manter algum estado ao redor e você precisa de um parâmetro de ajuste. Isso requer uma pequena classe (supondo que você está usando o Java 5 ou posterior): Instantiate com o parâmetro de decadência desejado (pode ter a sintonia deve estar entre 0 e 1) e use a média () para filtrar. Ao ler uma página sobre alguma recorrência matemática, tudo o que você realmente precisa saber ao transformá-lo em código é que os matemáticos gostam de escrever índices em matrizes e seqüências com subscritos. (Eles têm algumas outras notações também, o que não ajuda.) No entanto, o EMA é bastante simples, como você só precisa se lembrar de um antigo valor não arrays estado complicado necessário. Respondeu 8 fevereiro às 20:42 TKKocheran: Muito bonito. Não é bom quando as coisas podem ser simples (se começar com uma nova seqüência, obter um novo averager.) Note que os primeiros termos na seqüência média saltarão em torno de um pouco devido a efeitos de limite, mas você obtém aqueles com outras médias móveis também. No entanto, uma boa vantagem é que você pode envolver a lógica de média móvel para o averager e experimentar sem perturbar o resto do seu programa muito. Ndash Donal Fellows Feb 9 12 em 0:06 Estou tendo dificuldade em entender suas perguntas, mas vou tentar responder de qualquer maneira. 1) Se o seu algoritmo encontrado 0,25 em vez de 0,36, então ele está errado. É errado porque assume um aumento ou uma diminuição monotônica (que está sempre subindo ou sempre indo para baixo). A menos que você média TODOS os seus dados, seus pontos de dados --- como você apresentá-los --- são não-lineares. Se você realmente deseja encontrar o valor máximo entre dois pontos no tempo, corte sua matriz de tmin para tmax e encontre o máximo desse subarray. 2) Agora, o conceito de médias móveis é muito simples: imagine que eu tenho a seguinte lista: 1.4, 1.5, 1.4, 1.5, 1.5. Eu posso suavizar isto tomando a média de dois números: 1.45, 1.45, 1.45, 1.5. Observe que o primeiro número é a média de 1,5 e 1,4 (segundo e primeiro números) a segunda (nova lista) é a média de 1,4 e 1,5 (terceira e segunda lista antiga) a terceira (nova lista) a média de 1,5 e 1,4 (Quarto e terceiro), e assim por diante. Eu poderia ter feito o período de três ou quatro, ou n. Observe como os dados são muito mais suaves. Uma boa maneira de ver médias móveis no trabalho é ir ao Google Finance, selecionar um estoque (tente Tesla Motors bastante volátil (TSLA)) e clique em technicals na parte inferior do gráfico. Selecione Média Móvel com um período determinado e Média Mínima exponencial para comparar suas diferenças. A média móvel exponencial é apenas mais uma elaboração disto, mas pondera os dados mais antigos menos do que os novos dados, esta é uma forma de polarizar o alisamento para trás. Por favor, leia a entrada da Wikipedia. Então, isso é mais um comentário do que uma resposta, mas a pequena caixa de comentários era apenas pequena. Boa sorte. Se você está tendo problemas com a matemática, você poderia ir com uma média móvel simples, em vez de exponencial. Assim, a saída que você obtém seria o último x termos dividido por x. Pseudocódigo não testado: Note que você precisará lidar com as partes inicial e final dos dados, uma vez que claramente você não pode fazer a média dos últimos 5 termos quando estiver no seu 2º ponto de dados. Além disso, há maneiras mais eficientes de calcular essa média móvel (soma soma - mais antigo mais recente), mas isso é para obter o conceito do que está acontecendo em toda. Respondeu 8 de fevereiro às 20:41 Como calcular EMA em Excel Aprenda a calcular a média móvel exponencial no Excel e VBA e obter uma planilha on-line conectada livre. A planilha recupera dados de estoque do Yahoo Finance, calcula EMA (sobre sua janela de tempo escolhida) e traça os resultados. O link de download está na parte inferior. O VBA pode ser visto e editado it8217s completamente gratuito. Mas primeiro desconsiderar por que EMA é importante para os comerciantes técnicos e analistas de mercado. As cartas históricas do preço da ação são poluídas frequentemente com muitos do ruído high-frequency. Isso muitas vezes obscurece grandes tendências. As médias móveis ajudam a suavizar estas pequenas flutuações, dando-lhe uma maior visão sobre a direção geral do mercado. A média móvel exponencial dá maior importância aos dados mais recentes. Quanto maior o período de tempo, menor a importância dos dados mais recentes. A EMA é definida por esta equação. O preço de today8217s (multiplicado por um peso) e o EMA de yesterday8217s (multiplicado por 1-weight) Você necessita kickstart o cálculo de EMA com um EMA inicial (EMA 0). Esta é geralmente uma média móvel simples de comprimento T. O gráfico acima, por exemplo, dá a EMA da Microsoft entre 01 de janeiro de 2017 e 14 de janeiro de 2017. Técnico comerciantes muitas vezes usam o cruzamento de duas médias móveis 8211 um com um curto prazo E outro com um longo prazo 8211 para gerar sinais de compra / venda. Frequentemente são utilizadas médias móveis de 12 e 26 dias. Quando a média móvel mais curta sobe acima da média móvel mais longa, o mercado está tendendo para cima este é um sinal de compra. No entanto, quando as médias móveis mais curtas cai abaixo da média móvel longa, o mercado está caindo este é um sinal de venda. Let8217s primeiro aprender a calcular EMA usando funções de planilha. Depois que we8217ll descobrir como usar VBA para calcular EMA (e automaticamente traçar gráficos) Calcular EMA no Excel com Funções de Folha Etapa 1. Let8217s dizer que queremos calcular o EMA de 12 dias do preço das ações Exxon Mobil8217s. Primeiro precisamos obter preços de ações históricos 8211 você pode fazer isso com este downloader de cotação de ações em massa. Passo 2 . Calcule a média simples dos primeiros 12 preços com a função Average () do Excel8217s. No screengrab abaixo, na célula C16 temos a fórmula AVERAGE (B5: B16) onde B5: B16 contém os primeiros 12 preços de fechamento. Passo 3. Logo abaixo da célula usada na Etapa 2, digite a fórmula EMA acima Lá você tem You8217ve calculou com sucesso um importante indicador técnico, EMA, em uma planilha. Calcule EMA com VBA Agora let8217s mecanizar os cálculos com VBA, incluindo a criação automática de parcelas. Eu não mostrarei o VBA completo aqui (it8217s disponível na planilha abaixo), mas discutiremos o código mais crítico. Etapa 1. Faça o download de cotações históricas de ações para o seu ticker do Yahoo Finance (usando arquivos CSV) e carregue-as no Excel ou use o VBA nesta planilha para obter as cotações históricas diretamente no Excel. Seus dados podem parecer algo como isto: Etapa 2. É aqui que precisamos exercitar alguns braincells 8211 precisamos implementar a equação EMA na VBA. Podemos usar o estilo R1C1 para inserir programaticamente fórmulas em células individuais. Examine o fragmento de código abaixo. EMAWindow é uma variável que é igual à janela de tempo desejada numRows é o número total de pontos de dados 1 (o 8220 18221 é porque we8217re assumindo que os dados de estoque reais começa na linha 2) o EMA é calculado na coluna h Supondo que EMAWindow 5 e numrows 100 (isto é, existem 99 pontos de dados) a primeira linha coloca uma fórmula na célula h6 que calcula a média aritmética dos primeiros 5 pontos de dados históricos A segunda linha coloca fórmulas nas células h7: h100 que calcula o EMA dos restantes 95 Pontos de dados Etapa 3 Esta função VBA cria um gráfico do preço de fechamento e EMA. Ótimo trabalho em gráficos e explicações. Eu tenho uma pergunta embora. Se eu alterar a data de início para um ano mais tarde e olhar para dados EMA recentes, é visivelmente diferente do que quando eu uso o mesmo período de EMA com uma data de início anterior para a mesma referência de data recente. É isso que você espera. Isso torna difícil olhar para gráficos publicados com EMAs mostrado e não ver o mesmo gráfico. Shivashish Sarkar diz: Oi, eu estou usando sua calculadora EMA e eu realmente aprecio. No entanto, tenho notado que a calculadora não é capaz de traçar os gráficos para todas as empresas (mostra erro de tempo de execução 1004). Você pode por favor criar uma edição atualizada de sua calculadora em que as novas empresas serão incluídas Deixe uma resposta Cancelar resposta Like the Free Spreadsheets Master Base de Conhecimento Mensagens recentesExponential Moving Average (EMA) A fórmula EMA clássico é: Ao contrário Simple Moving Average. Onde o peso de todas as barras anteriores é igual, a Média Móvel Exponencial torna a barra mais recente mais importante. O peso de cada barra mais antiga diminui exponencialmente. Abaixo está um gráfico de peso para N 10 (1 é o preço atual, 2 o anterior e assim por diante): A fórmula de peso é onde i é uma distância para a barra mais recente. 0 significa o mais recente, 1 a barra anterior e assim por diante. Primeiro valor A fórmula faz referência ao valor anterior e não existe um acordo padrão qual é o primeiro (mais antigo) valor. Implementação diferente de EMA usa: O primeiro preço (MT4, Marketscope) ou A Média Móvel Simples dos primeiros preços N (Stockcharts). Uso em lugar de média móvel simples A média móvel exponencial pode ser usado exatamente como média móvel simples. Especialmente na situação em que a inércia da Média Móvel Simples não pode ser ignorada. Basta comparar EMA (10) e MVA (10) aplicados nos mesmos preços: Limitações A Média Móvel Exponencial baseia-se em todos os seus valores anteriores, portanto, o resultado do indicador para uma determinada barra depende da quantidade de dados históricos considerados. Assim, na situação em que mais dados históricos são carregados, o valor do indicador pode diferir do calculado anteriormente. Consulte também Artigos de indicadores Este artigo em outra implementação de LanguagesSpreadsheet de ajuste sazonal e suavização exponencial É fácil executar o ajuste sazonal e ajustar modelos de suavização exponencial usando o Excel. As imagens e gráficos de tela a seguir são extraídos de uma planilha que foi configurada para ilustrar o ajuste sazonal multiplicativo e a suavização exponencial linear nos seguintes dados de vendas trimestrais do Outboard Marine: Para obter uma cópia do próprio arquivo de planilha, clique aqui. A versão de suavização exponencial linear que será usada aqui para fins de demonstração é a versão de Brown8217s, simplesmente porque ela pode ser implementada com uma única coluna de fórmulas e há apenas uma constante de suavização para otimizar. Normalmente é melhor usar a versão Holt8217s que tem constantes de suavização separadas para nível e tendência. O processo de previsão prossegue da seguinte forma: (i) primeiro os dados são ajustados sazonalmente (ii) então as previsões são geradas para os dados ajustados sazonalmente através de suavização exponencial linear e (iii) finalmente as previsões sazonalmente ajustadas são quasi mensuradas para obter previsões para a série original . O processo de ajuste sazonal é realizado nas colunas D a G. O primeiro passo no ajuste sazonal é calcular uma média móvel centrada (realizada aqui na coluna D). Isto pode ser feito tomando a média de duas médias anuais que são compensadas por um período em relação um ao outro. (Uma combinação de duas médias de compensação ao invés de uma única média é necessária para fins de centralização quando o número de estações é par.) O próximo passo é calcular a relação com a média móvel - i. e. Os dados originais divididos pela média móvel em cada período - o que é realizado aqui na coluna E. (Isso também é chamado de componente quottrend-cyclequot do padrão, na medida em que os efeitos da tendência e do ciclo de negócios podem ser considerados como sendo tudo isso Permanece após a média de dados de um ano inteiro. Naturalmente, as mudanças mês a mês que não são devido à sazonalidade poderia ser determinada por muitos outros fatores, mas a média de 12 meses suaviza sobre eles em grande medida.) O índice sazonal estimado para cada estação é calculado pela primeira média de todas as razões para essa estação particular, que é feita nas células G3-G6 usando uma fórmula AVERAGEIF. As razões médias são então redimensionadas de modo que somam exatamente 100 vezes o número de períodos em uma estação, ou 400, neste caso, o que é feito nas células H3-H6. Abaixo na coluna F, as fórmulas VLOOKUP são usadas para inserir o valor do índice sazonal apropriado em cada linha da tabela de dados, de acordo com o trimestre do ano que ele representa. A média móvel centrada e os dados ajustados sazonalmente acabam parecidos com isto: Note que a média móvel normalmente se parece com uma versão mais lisa da série ajustada sazonalmente, e é mais curta em ambas as extremidades. Outra planilha no mesmo arquivo do Excel mostra a aplicação do modelo de suavização exponencial linear aos dados dessazonalizados, começando na coluna G. Um valor para a constante de alisamento (alfa) é inserido acima da coluna de previsão (aqui, na célula H9) e Por conveniência é atribuído o nome do intervalo quotAlpha. quot (O nome é atribuído usando o comando quotInsert / Name / Createquot). O modelo LES é inicializado definindo as duas primeiras previsões iguais ao primeiro valor real da série ajustada sazonalmente. A fórmula usada aqui para a previsão de LES é a forma recursiva de equação única do modelo Brown8217s: Esta fórmula é inserida na célula correspondente ao terceiro período (aqui, célula H15) e copiada para baixo a partir daí. Observe que a previsão do LES para o período atual se refere às duas observações precedentes e aos dois erros de previsão anteriores, bem como ao valor de alfa. Assim, a fórmula de previsão na linha 15 refere-se apenas a dados que estavam disponíveis na linha 14 e anteriores. (É claro que, se desejássemos usar a suavização linear simples em vez de linear, poderíamos substituir a fórmula SES aqui. Também poderíamos usar Holt8217s ao invés do modelo LES de Brown8217s, o que exigiria mais duas colunas de fórmulas para calcular o nível ea tendência Que são usados ​​na previsão.) Os erros são computados na coluna seguinte (aqui, coluna J) subtraindo as previsões dos valores reais. O erro médio quadrático é calculado como a raiz quadrada da variância dos erros mais o quadrado da média. (Isto decorre da identidade matemática: VARIANCE MSE (erros) (AVERAGE (erros)) 2.) No cálculo da média e variância dos erros nesta fórmula, os dois primeiros períodos são excluídos porque o modelo não começa a prever até O terceiro período (linha 15 na planilha). O valor ótimo de alfa pode ser encontrado alterando manualmente alfa até que o RMSE mínimo seja encontrado, ou então você pode usar o quotSolverquot para executar uma minimização exata. O valor de alpha que o Solver encontrado é mostrado aqui (alpha0.471). Geralmente é uma boa idéia traçar os erros do modelo (em unidades transformadas) e também calcular e traçar suas autocorrelações em defasagens de até uma estação. Aqui está um gráfico de séries temporais dos erros (ajustados sazonalmente): As autocorrelações de erro são calculadas usando a função CORREL () para calcular as correlações dos erros com elas mesmas retardadas por um ou mais períodos - os detalhes são mostrados no modelo de planilha . Aqui está um gráfico das autocorrelações dos erros nos primeiros cinco lags: As autocorrelações nos intervalos 1 a 3 são muito próximas de zero, mas a espiga no retardo 4 (cujo valor é 0,35) é ligeiramente problemática - sugere que a Processo de ajuste sazonal não foi completamente bem sucedido. No entanto, é apenas marginalmente significativo. 95 para determinar se as autocorrelações são significativamente diferentes de zero são mais ou menos 2 / SQRT (n-k), onde n é o tamanho da amostra e k é o atraso. Aqui n é 38 e k varia de 1 a 5, então a raiz quadrada de - n-menos-k é de cerca de 6 para todos eles e, portanto, os limites para testar a significância estatística de desvios de zero são aproximadamente mais - Ou-menos 2/6, ou 0,33. Se você variar o valor de alfa à mão neste modelo do Excel, você pode observar o efeito sobre as parcelas de tempo de série e de autocorrelação dos erros, bem como sobre o erro raiz-médio-quadrado, que será ilustrado abaixo. Na parte inferior da planilha, a fórmula de previsão é quotbootstrappedquot para o futuro, simplesmente substituindo as previsões de valores reais no ponto onde os dados reais se esgotou - i. e. Onde o futuro começa. (Em outras palavras, em cada célula onde um valor de dados futuro ocorreria, uma referência de célula é inserida que aponta para a previsão feita para esse período.) Todas as outras fórmulas são simplesmente copiadas para baixo de cima: Observe que os erros para previsões de O futuro são todos computados como sendo zero. Isso não significa que os erros reais serão zero, mas sim apenas reflete o fato de que para fins de previsão estamos assumindo que os dados futuros serão iguais às previsões em média. As previsões de LES resultantes para os dados ajustados sazonalmente são as seguintes: Com este valor específico de alfa, que é ideal para as previsões de um período antecipado, a tendência projetada é ligeiramente alta, refletindo a tendência local observada nos últimos 2 anos ou então. Para outros valores de alfa, uma projeção de tendência muito diferente pode ser obtida. Geralmente é uma boa idéia ver o que acontece com a projeção de tendência de longo prazo quando alfa é variado, porque o valor que é melhor para previsão de curto prazo não será necessariamente o melhor valor para prever o futuro mais distante. Por exemplo, aqui está o resultado que é obtido se o valor de alfa é manualmente definido como 0.25: A tendência de longo prazo projetada é agora negativa em vez de positiva Com um menor valor de alfa, o modelo está colocando mais peso em dados mais antigos em A sua estimativa do nível e da tendência actuais e as suas previsões a longo prazo reflectem a tendência descendente observada nos últimos 5 anos, em vez da tendência ascendente mais recente. Este gráfico também ilustra claramente como o modelo com um valor menor de alfa é mais lento para responder a pontos de quoturno nos dados e, portanto, tende a fazer um erro do mesmo sinal para muitos períodos em uma linha. Seus erros de previsão de 1 passo são maiores em média do que aqueles obtidos antes (RMSE de 34,4 em vez de 27,4) e fortemente positivamente autocorrelacionados. A autocorrelação lag-1 de 0,56 excede largamente o valor de 0,33 calculado acima para um desvio estatisticamente significativo de zero. Como alternativa ao aumento do valor de alfa para introduzir mais conservadorismo nas previsões de longo prazo, às vezes é adicionado ao modelo um fator de amortecimento de quottrend para fazer com que a tendência projetada se aplique após alguns períodos. A etapa final na construção do modelo de previsão é a de igualar as previsões de LES, multiplicando-as pelos índices sazonais apropriados. Dessa forma, as previsões reseasonalized na coluna I são simplesmente o produto dos índices sazonais na coluna F e as previsões de LES estacionalmente ajustadas na coluna H. É relativamente fácil calcular intervalos de confiança para as previsões de um passo à frente feitas por este modelo: primeiro Calcular o RMSE (erro quadrático médio, que é apenas a raiz quadrada do MSE) e, em seguida, calcular um intervalo de confiança para a previsão ajustada sazonalmente, adicionando e subtraindo duas vezes o RMSE. (Em geral, um intervalo de confiança de 95 para uma previsão de um período antecipado é aproximadamente igual à previsão de pontos mais ou menos duas vezes o desvio padrão estimado dos erros de previsão, assumindo que a distribuição de erro é aproximadamente normal eo tamanho da amostra É grande o suficiente, digamos, 20 ou mais. Aqui, o RMSE em vez do desvio padrão da amostra dos erros é a melhor estimativa do desvio padrão de futuros erros de previsão porque leva bias, bem como variações aleatórias em conta.) Os limites de confiança Para a previsão ajustada sazonalmente são então reseasonalized. Juntamente com a previsão, multiplicando-os pelos índices sazonais apropriados. Neste caso o RMSE é igual a 27,4 e a previsão ajustada sazonalmente para o primeiro período futuro (Dec-93) é 273,2. O intervalo de confiança ajustado sazonalmente é de 273,2-227,4 218,4 para 273,2227,4 328,0. Multiplicando esses limites por Decembers índice sazonal de 68,61. Obtemos limites de confiança inferior e superior de 149,8 e 225,0 em torno da previsão de ponto Dec-93 de 187,4. Os limites de confiança para as previsões de mais de um período de tempo em geral aumentarão à medida que o horizonte de previsão aumentar, devido à incerteza quanto ao nível e à tendência, bem como aos fatores sazonais, mas é difícil computá-los em geral por métodos analíticos. (A maneira apropriada de calcular limites de confiança para a previsão de LES é usando a teoria ARIMA, mas a incerteza nos índices sazonais é outra questão.) Se você quer um intervalo de confiança realista para uma previsão mais de um período à frente, tomando todas as fontes de A sua melhor aposta é usar métodos empíricos: por exemplo, para obter um intervalo de confiança para uma previsão de duas etapas à frente, você poderia criar outra coluna na planilha para calcular uma previsão de duas etapas para cada período ( Por bootstrapping a previsão one-step-ahead). Em seguida, calcule o RMSE dos erros de previsão em duas etapas e use isso como base para um intervalo de confiança de 2 passos à frente.

No comments:

Post a Comment