Friday, February 3, 2017

Monte Carlo Simulation Et Système Trading Pdf

PdfSR est un participant au programme Amazon Associates Services LLC, un programme de publicité affiliée conçu pour fournir un moyen pour les sites de gagner des frais de publicité par la publicité et le lien vers Amazon. Simulation Monte Carlo et système de négociation. Évaluation des risques, analyse des risques et validation des systèmes de négociation mécaniques Le système de négociation avec les systèmes de négociation mécaniques dans le monde détermine de plus en plus les activités des commerçants professionnels et privés sur le marché financier. Malheureusement, le taux de succès actuel d'une telle négociation systématique, à savoir le commerce à long terme rentable ne peut pas à ce jour suivre la popularité croissante de cette méthode. Les raisons en sont, entre autres, des processus de développement insuffisants ainsi que des systèmes insuffisamment testés. L'utilisation supplémentaire des simulations Monte Carlo au cours du développement du système et des phases de test du système contribue au fait que l'évaluation du hasard, l'analyse des risques et la validation des systèmes de négociation mécanique peuvent être améliorés qualitativement clairement. Volker Butzlaff, ingénieur en planification urbaine, a travaillé pendant de nombreuses années en tant que chef de projet, concepteur de systèmes et contrôleur d'assurance de la qualité au département des technologies de l'information de DaimlerChrysler en Allemagne. Aujourd'hui, il travaille comme ingénieur freelance avec l'accent mis sur le développement de systèmes et la méthodologie de simulation. Cette prévisualisation est fournie par Google, avec l'autorisation de ses éditeurs et auteurs. Plus infoby Michael R. Bryant L'analyse de Monte Carlo est une technique de calcul qui permet d'inclure les propriétés statistiques des paramètres d'un modèle dans une simulation. Dans l'analyse de Monte Carlo, les variables aléatoires d'un modèle sont représentées par des distributions statistiques, qui sont échantillonnées au hasard pour produire la sortie des modèles. La sortie est donc aussi une distribution statistique. Par rapport aux méthodes de simulation qui ne comprennent pas l'échantillonnage aléatoire, la méthode de Monte Carlo produit des résultats plus significatifs, qui sont plus conservateurs et ont tendance à être plus précis lorsqu'ils sont utilisés comme des prédictions. Lors de l'utilisation d'utiliser l'analyse Monte Carlo pour simuler la négociation, la distribution commerciale, telle que représentée par la liste des métiers, est échantillonnée pour générer une séquence commerciale. Chaque séquence est analysée et les résultats sont triés pour déterminer la probabilité de chaque résultat. De cette façon, un niveau de probabilité ou de confiance est attribué à chaque résultat. Sans l'analyse de Monte Carlo, l'approche standard pour calculer le taux de rendement historique, par exemple, serait d'analyser la séquence actuelle des métiers en utilisant, par exemple, le dimensionnement de position fractionnaire fixe. On peut constater que le taux de retour sur la séquence était de 114. Avec l'analyse de Monte Carlo, d'autre part, des centaines ou des milliers de différentes séquences de métiers sont analysées, et le taux de rendement est exprimé avec un qualificatif de probabilité. Par exemple, le taux de rendement tel que déterminé par l'analyse de Monte Carlo pourrait être de 83 avec 95 de confiance. Cela signifie que de toutes les milliers de séquences considérées, 95 avaient des taux de retour supérieurs ou égaux à 83. L'analyse de Monte Carlo est particulièrement utile pour estimer le retrait maximal de crête à vallée. Dans la mesure où le prélèvement est une mesure utile du risque, l'amélioration du calcul du prélèvement permettra de mieux évaluer un système ou une méthode de négociation. Bien que nous ne pouvons pas prédire comment le marché différera demain de ce que nous avons vu dans le passé, nous savons que ce sera différent. Si nous calculons le tirage maximal basé sur la séquence historique des transactions, nous fondions nos calculs sur une séquence de métiers que nous connaissons ne sera pas répétée exactement. Même si la répartition des métiers (au sens statistique) est la même dans l'avenir, la séquence de ces métiers est en grande partie une question de hasard. Le calcul du retrait basé sur une séquence particulière est quelque peu arbitraire. De plus, la séquence des transactions a un effet très important sur le tirage calculé. Si vous choisissez une séquence de métiers où cinq pertes se produisent dans une rangée, vous pourriez obtenir un retrait très important. Les mêmes métiers arrangés dans un ordre différent, de sorte que les pertes sont uniformément dispersées, pourraient avoir un rabaissement négligeable. En utilisant une approche de Monte Carlo pour calculer le prélèvement, la séquence historique des métiers est randomisée, et le taux de rendement et de retrait sont calculés pour la séquence aléatoire. Le processus est alors répété plusieurs centaines ou mille fois. En regardant les résultats dans l'ensemble, on peut trouver, par exemple, que dans 95 des séquences, le tirage était inférieur à 30 lorsque 4 des capitaux propres étaient risqués sur chaque métier. Nous pourrions interpréter cela comme signifiant qu'il ya une chance que le prélèvement soit inférieur à 30 lorsque 4 est risqué sur chaque transaction. En général, il existe deux façons de générer la séquence des métiers dans une simulation Monte Carlo. Une option consiste à construire chaque séquence de métiers par échantillonnage aléatoire des mêmes métiers que dans la séquence actuelle, chaque transaction étant incluse une fois. Cette méthode d'échantillonnage de la distribution commerciale est connue sous le nom de sélection aléatoire sans remplacement. Une autre méthode d'échantillonnage possible est la sélection aléatoire avec remplacement. Si cette méthode était utilisée, les métiers seraient choisis au hasard dans la liste initiale des métiers, sans égard au fait que le métier avait déjà été sélectionné. Dans la sélection avec remplacement, un échange pourrait se produire plus d'une fois dans la nouvelle séquence. L'avantage de la sélection sans remplacement est qu'il double exactement la distribution de probabilité de la séquence d'entrée, alors que la sélection avec le remplacement ne peut pas. L'inconvénient de la sélection sans remplacement est que les séquences échantillonnées aléatoirement sont limitées au nombre de transactions dans la séquence d'entrée. Si vous avez une courte séquence de métiers (par exemple moins de 30 métiers), cela peut limiter l'exactitude de certains calculs, comme le prélèvement. Un exemple basé sur l'échantillonnage sans remplacement est illustré ci-dessous. La négociation est simulée à l'aide d'un ratio de position fixe, à partir d'un compte de 10 000 actions. Chaque simulation emploie 500 séquences commerciales (échantillons). La première section de résultats de la figure montre les résultats clés, tels que le taux de rendement, à une série de niveaux de confiance. Notez, par exemple, que des rendements inférieurs sont prévus pour des niveaux de confiance plus élevés. Exemple de résultats d'analyse Monte Carlo. Monte Carlo Simulation de votre système d'échange REMARQUE: Sujet avancé. Assurez-vous de lire d'abord les parties précédentes du didacticiel. Afin d'interpréter correctement les résultats de la simulation Monte Carlo, vous devez lire cette section du manuel. Les paramètres non triviaux et les détails non évidents sont expliqués ci-dessous. S'il vous plaît ne sautez pas. D'une manière générale, les méthodes de Monte Carloquot représentent une large classe d'algorithmes informatiques qui utilisent un échantillonnage aléatoire répété pour obtenir des propriétés statistiques d'un processus donné. Il a été inventé par le mathématicien polonais Stanislaw Ulam travaillant sur des projets d'armes nucléaires au laboratoire de Los Alamos. Comme il était incapable d'analyser des processus physiques complexes à l'aide de méthodes mathématiques conventionnelles, il pensait pouvoir mettre en place une série d'expériences aléatoires, observer les résultats et les utiliser pour obtenir des propriétés statistiques du processus. Dans le développement du système commercial, la simulation Monte Carlo se réfère au processus d'utilisation de séquences commerciales simulées aléatoires pour évaluer les propriétés statistiques d'un système commercial. Il existe de nombreuses façons d'effectuer des calculs réels qui diffèrent quand il s'agit de détails d'implémentation, mais probablement le plus simple et fiable est la méthode bootstraping qui effectue l'échantillonnage aléatoire avec le remplacement de la liste de commerce réelle générée par le back-test. Différentes méthodes de simulation Monte Carlo permettent de vérifier la robustesse du système de négociation, de trouver la probabilité de la ruine et de nombreuses autres propriétés statistiques du système commercial. Comment fonctionne-t-il dans AmiBroker Afin d'effectuer la simulation de Monte Carlo (ou test de bootstrap) de votre système de trading, AmiBroker effectue les opérations suivantes: A. Création de jeu d'entrée A.1 Effectuer des back-testing de votre système commercial pour produire ensemble original de N Métiers B. À répétition (1000 fois) B.1 choisir au hasard les métiers de la liste du commerce d'origine pour produire de nouveaux ensembles aléatoires de N métiers (appelé réalisation) Ce jeu aléatoire contient le même nombre de métiers, ils sont commandés au hasard et certains métiers originaux Peuvent être omises et certaines utilisées plus d'une fois (permutation avec répétition, ou échantillonnage aléatoire avec remplacement). Étant donné que le nombre de réalisations uniques est NN (donc avec seulement 100 métiers d'entrée nous avons 100 100 réalisations uniques), avec un nombre suffisant de métiers (gt100) la probabilité de choisir une séquence identique à l'original est pratiquement nulle. B.2 effectuer séquentiellement le calcul du gain de gain pour chaque transaction choisie au hasard, en utilisant le dimensionnement de position défini par l'utilisateur pour produire l'équité du système B.3 enregistrer l'équité du système dans la distribution C.1 Données de processus obtenues en B pour générer des statistiques et des graphiques de répartition. Ci-dessus se produit lorsque vous appuyez sur le bouton Backtest dans la fenêtre Nouvelle analyse. AmiBrokers Monte Carlo simulateur est si rapide qu'il coûte habituellement juste une fraction de seconde au-dessus de la procédure normale backtest. Il convient de noter que les transactions simulées pendant le bootstrap sont effectuées séquentiellement. Si votre système commercial d'origine échangeait plusieurs positions à la fois (de sorte que certains ou tous les métiers se chevauchent), il pourrait en résulter des retraits plus faibles du système, car les tirages de transactions individuelles se produiraient séquentiellement (pas parallèlement à des transactions superposées ). La façon dont fonctionne le simulateur Monte Carlo peut être contrôlée à partir de la page Paramètres d'analyse, onglet QuotMonte Carloquot: Activation de la simulation Monte Carlo Cette case à cocher contrôle chaque fois que la simulation MC est effectuée automatiquement dans le backtest (juste après que le backtest génère la liste) définit le nombre De simulations MC à exécuter (devrait être de 1000 ou plus) Simuler à l'aide des changements d'équité du portefeuille Cette option entraîne que la simulation MC utilise des variations de pourcentage du portefeuille par rapport au portefeuille par rapport aux transactions individuelles. Ces changements individuels d'équité sont choisis au hasard et permutted pour créer la course de simulation. Dans ce mode, les variations des fonds propres par barres sont calculées en tant que ratio (donc 10 augmentation est représentée par 1,1), sélectionnées au hasard et multipliées cumulativement. Ce paramètre permet de gérer des situations où vous avez plusieurs transactions superposées dans votre système et ne nécessite aucun paramètre spécial pour le dimensionnement de position. Simuler à l'aide de la liste de négociation cette option fait que la simulation MC utilise des métiers individuels à partir du backtest d'origine pour créer une simulation. Pour effectuer la simulation dans ce mode, le simulateur MC sélectionne de façon aléatoire les métiers originaux et applique un nouveau dimensionnement de position comme défini ci-dessous. Ce mode est utile dans les cas où vous n'avez pas les métiers se chevauchant. Définit la méthode de dimensionnement de position utilisée par le simulateur MC dans le mode quottrade listquot: Ne pas changer - utilise la taille de la position originale telle qu'utilisée pendant le test arrière. Gardez à l'esprit qu'il utilise toujours la valeur en dollars d'origine du commerce (ou de la devise que vous utilisez), même si votre formule utilise le pourcentage d'actions de portefeuille. Taille fixe - utilise un nombre fixe de partscontractes par transaction Valeur constante - utilise un montant fixe pour ouvrir tout commerce Pourcentage de capital - utilise le pourcentage défini de la valeur de la valeur simulée courante. Soyez prudent lors de l'utilisation de ce paramètre - il provoque que la taille de la position d'un métier dépend des bénéfices sur les métiers précédents (compounding profits) et crée la dépendance en série. Il peut également conduire à l'effet de compoundage supplémentaire lorsque vous avez des métiers se chevauchant dans votre backtest d'origine comme bootstrap effectue métiers séquentiellement (de sorte qu'ils ne se chevauchent pas). Pour cette raison, son utilisation est limitée aux cas où il ne se produit pas de transactions se chevauchant. Activer les courbes de capitaux propres de MC (MinMaxAvg) permet d'activer les graphiques de titres de participation de MC (y compris les placements en actions les plus élevés, les plus bas et les plus moyens ainsi que les graphiques d'équité en paille). Notez que les lignes vertes et rouges (minmax equity) ne sont pas vraiment des actions uniques quotbestquot et quotworstquot. Ce sont les points les plus élevés (max) et les plus faibles (min) de toutes les actions générées par MC. Donc, ils sont en fait les meilleurs points de toutes les actions et les pires points de toutes les actions. Et la ligne bleue (avg) est la moyenne de toutes les lignes d'équité (toutes les courses). Afficher la valeur absolue s dans l'échelle linéaire - afficher les valeurs en valeur absolue en échelle logarithmique - afficher les actions en valeur absolue en dollars en utilisant le graphique semi-log Affichage du changement en pourcentage - affiche les actions comme quotrate de changement depuis le début Utiliser l'échelle logarithmique pour l'équité finale Affiche le tableau CDF des capitaux propres finaux à l'aide de l'échelle semi-logarithmique au lieu de linéaire. Utiliser l'échelle logarithmique pour le tirage Affiche le diagramme CDF de tirage en dollars à l'aide de l'échelle semi-logarithmique au lieu de linéaire. Utiliser les nombres négatifs pour le tirage (CDF de tirage inversé) Lorsque cette option est activée, les tirages en dollars et en pourcentage sont indiqués sous forme de nombres négatifs. Cela a également un effet sur la distribution du CDF. Il inverse la commande de quotdrawdownquot colonne dans la table MC et renverse la signification (c'est-à-dire 10 percentile valeur signifie qu'il ya 10 chances de tirages étant égal ou pire (plus négatif) que le montant présenté. Avec cette option désactivée (comme dans les anciennes versions ), Les prélèvements sont indiqués comme des nombres supérieurs à zéro (positifs) et la valeur de 10 percentile signifie que 10 chances de tirages sont égales ou supérieures (inférieures) au montant présenté. Pour supprimer les risques de corrélation sérielle affectant les résultats de la simulation de Monte Carlo, De sorte que l'ordre dans lequel le commerce donné dans la séquence originale n'affecte pas sa perte de profit due à la composition. Également en fonction de chaque fois que votre système ouvre plusieurs positions se chevauchant, Choisissez la méthode de simulation comme suit Simuler en utilisant la liste de négociation - pour les systèmes avec des transactions non chevauchantes ou Simuler en utilisant des changements d'équité de portefeuille pour les systèmes avec des transactions superposées (positions simultanées) Les résultats de la simulation de Monte Carlo sont affichés dans la page . En haut de la page, nous pouvons voir un tableau qui donne des valeurs de quelques statistiques clés dérivées des diagrammes de distribution cumulative (CDFs) des résultats de simulation Monte Carlo. Voici des exemples de résultats (les points saillants sont ajoutés manuellement à des fins d'illustration). L'équité initiale était de 10000 dans cet exemple. Le test a été effectué sur 7 ans (données EOD). Cette fois, la signification de la colonne de rabattement est inverse - il vous indique que les tirages serait pire (plus négatif) que le montant spécifié, valeur de 99 percentile de -7.23 signifie que dans 99 des cas, vous verrez des rabaissements pire (plus négatif) 7.23. 1 valeur de percentil de -63.82 vous indique que dans 1 des cas vous éprouveriez des tirages égal ou pire (plus négatif) que -63.82 Ainsi, la table peut être lue quotrow-wisequot et le haut de la table (petits percentiles) se réfèrent à quotpessimisticquot Scénarios. Au-dessous de la table, nous pouvons trouver tableau minavgmax de balais de paille des actions simulées: Notez que les lignes vertes et rouges (minmax équité) ne sont pas vraiment unique quotbestquot et quotworstquot actions. Ce sont les points les plus élevés (max) et les plus faibles (min) de toutes les actions générées par MC. Donc, ils sont en fait les meilleurs points de toutes les actions et les pires points de toutes les actions. Et la ligne bleue (avg) est la moyenne de toutes les lignes d'équité (toutes les courses). Le nuage de lignes grises représente les actions de test individuelles - comme nous pouvons le voir le même système commercial peut générer des résultats différents lorsque les conditions du marché changent et simulation MC tente de simuler les différents résultats et vous fournir quelques informations statistiques sur comment badgood il peut être. Après le tableau des balais de paille, vous pouvez trouver des diagrammes de la fonction de distribution cumulative (CDF) des capitaux propres finaux, RAC, des tirages et des fonds propres les plus faibles (les lignes d'annotation vertes et rouges ont été ajoutées manuellement): Les tableaux de distribution cumulatifs contiennent les mêmes informations Le haut de la page quotMonte Carloquot, mais sous la forme graphique. Encore une fois, lorsque nous examinons le graphique de distribution du bénéfice annuel (CAR), nous pouvons constater que dans environ 10 cas, notre système ne subirait pas le seuil de rentabilité. Nous pouvons également voir que dans environ 35 des cas, notre RAC serait inférieur à 5. Les bénéfices supérieurs à 10 par année ne se produisent que dans le top 20 des tests. Tous les autres graphiques de la page MC sont construits de la même façon et vous pouvez les lire en utilisant la même méthodologie. Le graphique de rendement annuel montre la fonction de répartition cumulée de la valeur finale des capitaux propres (à la fin de la période d'essai). Drawdown et Max. Les diagrammes Drawdown montrent la fonction de répartition cumulative des tirages (distances maximales à vaut par rapport au dollar) observées au cours du test. Le graphique de la plus basse équité montre la fonction de distribution cumulée des plus faibles fonds propres jamais expérimentés pendant le test. , Vous pouvez contrôler le simulateur Monte Carlo en utilisant la fonction SetOption (). Vous pouvez également récupérer ces valeurs à l'aide de la fonction GetOption. SetOption (quotMCEnablequot, 0) value 0 désactive la simulation MC SetOption (quotMCEnablequot, 1) La valeur 1 active MC uniquement dans les backtests de portefeuille (par défaut) La valeur 2 de SetOption (quotMCEnablequot, 2) ) Notez que l'activation de MC dans l'optimisation est fortement déconseillée à moins que vous n'utilisiez réellement les métriques MC comme cible d'optimisation via un backtestter personnalisé ou que vous utilisiez autrement les distributions MC dans le processus d'optimisation. Le processus de Monte Carlo est coûteux sur le plan du calcul et, bien que quelques centaines de millisecondes ajoutées à un backtest n'aient pas beaucoup d'importance, en cas d'optimisations lorsque celles-ci sont multiples par nombre de pas, vous pouvez facilement augmenter le temps d'optimisation par ordre de grandeur. Donc, sauf si vous avez vraiment besoin de la distribution MC en tant que métrique personnalisée et cible d'optimisation, ne pas activer MC dans l'optimisation. SetOption (quotMCRunsquot, 1000) définit le nombre d'exécutions de simulation de MC (réalisations) Autres paramètres MC qui peuvent être définis à l'aide de SetOption et retrived en utilisant GetOption: quotMCChartEquityCurvesquot (truefalse) quotMCStrawBroomLinesquot (0..100) quotMCPosSizePctEquityquot (0..100) quotMCPosSizeMethodquot - 0 (Nombre) quotMCPosSizePctEquityquot (nombre) quotMCUseEquityChangesquot (nombre), 1 signifie utiliser des modifications d'équité au lieu de la liste de transactions quotMCChartEquityScalequot (nombre), quotMCPosSizeValuequot (nombre) ), 1 pour l'échelle logarithmique, 0 pour l'échelle linéaire quotMCLogScaleFinalEquityquot (nombre), 1 pour l'échelle log, 0 pour l'échelle linéaire quotMCLogScaleDrawdownquot (nombre), 1 pour l'échelle log, 0 pour l'échelle linéaire quotMCNegativeDrawdownquot (nombre), 1 - Vous pouvez ajouter vos propres métriques personnalisées au rapport à l'aide de la méthode GetMonteCarloSim () du Backtester (en anglais) Objet et objet MonteCarloSim que cette fonction renvoie. Si vous ne connaissez pas de métrique personnalisée, consultez la section Comment ajouter des métriques personnalisées au rapport de backtester dans une partie de ce manuel. L'objet MonteCarloSim a une fonction GetValue (quotfieldquot, percentile) qui permet d'accéder aux valeurs CDF. Les valeurs de quotfieldquot disponibles sont: quotFinalEquityquotquotCARquotquotLowestEquityquotMaxDrawdownquotquotMaxPercDrawdownquot Maintenant, voici l'exemple de code qui présente comment ajouter le 30e percentile FinalEquity et CAR au rapport: SetOption (MCEnable. Vrai) SetOption (MCRuns.1000) SetCustomBacktestProc () Note: Les résultats de MC sont disponibles après Backtest () ou PostProcess en tant que simulation MC. Les résultats de MC sont disponibles après Backtest () ou PostProcess en tant que simulation MC Est terminée en phase finale de post-traitement mc bo. GetMonteCarloSim () si (mc) obtient le 30 e centile de l'équité finale et la distribution de la RCA bo. AddCustomMetric (FinalEq30.mc. GetValue (FinalEquity.30)) bo. AddCustomMetric (CAR30. Mc. GetValue (CAR. 30)) vous pouvez également combiner les stats MC avec les st st st st stats normaux st bo. GetPerformanceStats (0) bo. AddCustomMetric (CAR30MDD. mc. GetValue (CARTE 30) st. GetValue (MaxSystemDrawdownPercent)) Ajouté, il peut être utilisé comme objectif d'optimisation (ne pas oublier de changer MCEnable à 2) et utilisé dans le processus de test de marche en avant comme fonction objective. Pour sélectionner une métrique personnalisée comme cible d'optimisation, vous devez taper son nom exactement comme il apparaît dans l'appel AddCustomMetric dans le champ quotOptimization Targetquot dans la boîte de dialogue Paramètres, page Walk Forward. De cette façon, vous pouvez exécuter le test de marche avant d'optimisation qui est dirigé par les valeurs de la distribution de simulation MC. Ainsi, par exemple au lieu d'utiliser CARMDD vous pouvez utiliser CAR30MDD (30ème centile MC CAR divisé par le système de retrait max.). Qu'en est-il de la randomisation de Monte Carlo au lieu du test bootstrap La randomisation de Monte Carlo est différente du test bootstrap car elle n'utilise pas de liste réelle (réalisée) du backtest, mais elle tente d'utiliser quotall retours individuels chaque fois qu'ils sont réalisés ou hyphoteticalquot. Par exemple, lorsque le système commercial génère des signaux beaucoup plus que nous pouvons effectivement le commerce en raison du pouvoir d'achat limité, alors nous devons choisir les métiers que nous prendrions et que nous sauterions. Normalement, cette sélection fait partie du système de négociation et dans AmiBroker PositionScore variable indique au backtester quelles positions sont préférées et devraient être échangées. Dans le test de randomisation, au lieu d'utiliser un PositionScore déterministe analytique, vous utilisez aléatoire. S'il y a plus de signaux à ouvrir des positions que ce que nous pourrions prendre, ce processus mènerait à des choix commerciaux aléatoires. Maintenant, en utilisant la fonction Optimize () et PositionScore aléatoire, nous pouvons exécuter des milliers de ces choix aléatoires pour produire le test de randomisation Monte Carlo: step Optimize (étape 1. 1. 1000. 1) 1000 backtests avec des choix commerciaux aléatoires de l'univers large Vous l'exécutez sur de grandes listes de surveillance) PositionScore mtRandom () Le test de randomisation a un gros inconvénient: ne peut pas être utilisé dans de nombreux cas. Lorsque le système ne produit pas suffisamment de signaux à chaque barre, il n'y a pas grand-chose (le cas échéant) à choisir. De plus, plus important encore, la randomisation MC fait fausse supposition que toutes les opportunités quottradingquot (signaux) sont égales. Dans de nombreux cas, ils ne le sont pas. Très souvent, notre système commercial a une façon spécifique et déterministe de choisir des métiers de nombreuses oppotunities par une sorte de rankingscoring. Lorsque le système utilise un score (rang) comme composante principale du système (les systèmes rotatifs le font) - si vous remplacez le score analytique de par un nombre aléatoire, vous testez simplement le bruit blanc et non le système.


No comments:

Post a Comment