Wednesday 4 January 2017

Poussin De Python

Backtesting d'une moyenne mobile Crossover en Python avec des pandas Dans l'article précédent sur Research Backtesting Environments En Python Avec Pandas nous avons créé un environnement de backtesting basé sur la recherche orientée objet et l'avons testé sur une stratégie de prévision aléatoire. Dans cet article, nous allons utiliser les mécanismes que nous avons mis en place pour mener des recherches sur une stratégie réelle, à savoir le Crossover moyen mobile sur AAPL. Stratégie de croisement moyenne mobile La technique de crossover de moyenne mobile est une stratégie de momentum simpliste extrêmement connue. Il est souvent considéré comme l'exemple Hello World pour le commerce quantitatif. La stratégie décrite ici est longue seulement. Deux filtres de moyenne mobile simple distincts sont créés, avec des périodes d'analyse différentes, d'une série temporelle particulière. Les signaux d'achat de l'actif se produisent lorsque la moyenne mobile de retour en arrière est plus longue que la moyenne mobile à long terme. Si la moyenne plus longue dépasse par la suite la moyenne plus courte, l'actif est vendu de nouveau. La stratégie fonctionne bien lorsqu'une série chronologique entre dans une période de tendance forte, puis renverse lentement la tendance. Pour cet exemple, j'ai choisi Apple, Inc. (AAPL) comme la série chronologique, avec un court retour de 100 jours et un lookback long de 400 jours. C'est l'exemple fourni par la bibliothèque de trading algorithmique zipline. Ainsi, si nous voulons mettre en œuvre notre propre backtester, nous devons nous assurer qu'il correspond aux résultats en zipline, comme un moyen de base de validation. Implémentation Assurez-vous de suivre le tutoriel précédent ici. Qui décrit comment la hiérarchie d'objet initiale pour le backtester est construite, sinon le code ci-dessous ne fonctionnera pas. Pour cette implémentation particulière, j'ai utilisé les bibliothèques suivantes: La mise en œuvre de macross. py nécessite le backtest. py du tutoriel précédent. La première étape consiste à importer les modules et les objets nécessaires: Comme dans le didacticiel précédent, nous allons sous-classer la classe de base abstraite de stratégie pour produire MovingAverageCrossStrategy. Qui contient tous les détails sur la façon de générer les signaux lorsque les moyennes mobiles de AAPL se croisent. L'objet nécessite une fenêtre courte et une fenêtre longue sur laquelle fonctionner. Les valeurs ont été définies à des valeurs par défaut de 100 jours et 400 jours respectivement, qui sont les mêmes paramètres utilisés dans l'exemple principal de la tyrolienne. Les moyennes mobiles sont créées en utilisant la fonction rollingmaing pandas sur les barsFermer le cours de clôture du stock AAPL. Une fois que les moyennes mobiles individuelles ont été construites, la série de signaux est générée en plaçant la colonne égale à 1,0 lorsque la moyenne mobile courte est supérieure à la moyenne mobile longue ou 0,0 autrement. De là, les ordres de position peuvent être générés pour représenter des signaux de négociation. Le MarketOnClosePortfolio est sous-classé de Portfolio. Qui se trouve dans backtest. py. Il est presque identique à la mise en œuvre décrite dans le didacticiel précédent, à l'exception que les métiers sont maintenant effectués sur une base Close-to-Close, plutôt que Open-to-Open. Pour plus de détails sur la définition de l'objet Portfolio, reportez-vous au didacticiel précédent. Ive a laissé le code dedans pour l'intégralité et pour garder ce tutoriel autonome: Maintenant que les classes MovingAverageCrossStrategy et MarketOnClosePortfolio ont été définies, une fonction principale sera appelée pour attacher toutes les fonctionnalités ensemble. En outre, la performance de la stratégie sera examinée au moyen d'un graphique de la courbe de capitaux propres. L'objet DataReader de pandas télécharge les prix OHLCV des stocks d'AAPL pour la période du 1er janvier 1990 au 1er janvier 2002, date à laquelle les signaux DataFrame sont créés pour générer les signaux long seulement. Par la suite, le portefeuille est généré avec une base de capital initiale de 100 000 USD et les rendements sont calculés sur la courbe de capitaux propres. La dernière étape est d'utiliser matplotlib pour tracer un graphique à deux chiffres des deux prix AAPL, recouvert avec les moyennes mobiles et les signaux buysell, ainsi que la courbe d'équité avec les mêmes signaux buysell. Le code de traçage est pris (et modifié) à partir de l'exemple d'implantation de typo. La sortie graphique du code est la suivante. J'ai fait usage de la commande IPython coller pour mettre cela directement dans la console IPython alors que dans Ubuntu, de sorte que la sortie graphique reste en vue. Les upticks roses représentent l'achat du stock, alors que les downticks noirs représentent la vente de retour: Comme on peut le voir la stratégie perd de l'argent au cours de la période, avec cinq métiers de tour-aller. Cela n'est pas surprenant compte tenu du comportement de l'AAPL au cours de la période, qui a connu une légère tendance à la baisse, suivie d'une recrudescence significative à partir de 1998. La période de retour des signaux de la moyenne mobile est assez importante et a eu un impact sur le profit du commerce final , Qui autrement aurait pu rendre la stratégie rentable. Dans les articles suivants, nous allons créer un moyen plus sophistiqué d'analyse de la performance, ainsi que la description de la façon d'optimiser les périodes de retour de la moyenne individuelle des moyens de signalisation outils analogiques Analogiquement, DataFrame a une méthode cov pour calculer pairwise covariances parmi les séries dans le DataFrame, À l'exclusion des valeurs NAnull. En supposant que les données manquantes sont manquantes au hasard cela se traduit par une estimation de la matrice de covariance qui est impartiale. Cependant, pour de nombreuses applications, cette estimation n'est peut-être pas acceptable parce que la matrice de covariance estimée n'est pas garantie comme étant semi-définie positive. Ceci pourrait conduire à des corrélations estimées ayant des valeurs absolues qui sont supérieures à une, et / ou une matrice de covariance non inversible. Voir Estimation des matrices de covariance pour plus de détails. DataFrame. cov prend également en charge un mot-clé optionnel minperiods qui spécifie le nombre minimal requis d'observations pour chaque paire de colonnes afin d'avoir un résultat valide. Les poids utilisés dans la fenêtre sont spécifiés par le mot clé wintype. La liste des types reconnus est: boxcar triang blackman hamming bartlett parzen bohman blackmanharris nuttall barthann kaiser (besoins bêta) gaussian (besoins std) generalgaussian (besoins puissance, largeur) slepian (besoins de largeur). Notez que la fenêtre du boxcar équivaut à mean (). Pour certaines fonctions de fenêtrage, des paramètres supplémentaires doivent être spécifiés: Pour. sum () avec un wintype. Il n'y a pas de normalisation faite aux poids pour la fenêtre. Passer des poids personnalisés de 1, 1, 1 donnera un résultat différent que les poids de passage de 2, 2, 2. par exemple. Lors du passage d'un wintype au lieu de spécifier explicitement les poids, les poids sont déjà normalisés de sorte que le poids le plus important soit 1. Par contre, la nature du calcul. mean () est telle que les pondérations sont normalisées l'une par rapport à l'autre. Les poids de 1, 1, 1 et 2, 2, 2 donnent le même résultat. Rolling nouveau temps dans la version 0.19.0. Nouveau dans la version 0.19.0 sont la capacité de passer un décalage (ou convertible) à une méthode. rolling () et de le faire produire des fenêtres de taille variable basée sur la fenêtre de temps passée. Pour chaque point de temps, cela inclut toutes les valeurs précédentes se produisant dans le delta de temps indiqué. Cela peut être particulièrement utile pour un indice de fréquence temporelle non régulier. Il s'agit d'un indice de fréquence régulier. L'utilisation d'un paramètre de fenêtre entière fonctionne pour rouler le long de la fréquence de la fenêtre. La spécification d'un décalage permet une spécification plus intuitive de la fréquence de laminage. À l'aide d'un index non régulier, mais toujours monotone, rouler avec une fenêtre entière ne donne aucun calcul spécial. L'utilisation de la spécification de temps génère des fenêtres variables pour ces données clairsemées. De plus, nous permettons maintenant à un paramètre facultatif de spécifier une colonne (plutôt que la valeur par défaut de l'index) dans un DataFrame. Rolling vs Resampling en temps réel L'utilisation de. rolling () avec un index basé sur le temps est assez similaire au rééchantillonnage. Ils opèrent tous deux et exécutent des opérations réductrices sur des objets pandas indexés dans le temps. Lorsque vous utilisez. rolling () avec un décalage. Le décalage est un temps-delta. Prenez une fenêtre de recherche en arrière-à-temps, et agréger toutes les valeurs dans cette fenêtre (y compris le point final, mais pas le point de départ). C'est la nouvelle valeur à ce point dans le résultat. Il s'agit de fenêtres de taille variable dans l'espace temporel pour chaque point de l'entrée. Vous obtiendrez un résultat de la même taille que l'entrée. Lorsque vous utilisez. resample () avec un décalage. Construire un nouvel indice qui est la fréquence du décalage. Pour chaque intervalle de fréquences, les points d'agrégation de l'entrée dans une fenêtre de recherche en arrière-dans-temps qui tombent dans ce bac. Le résultat de cette agrégation est la sortie pour ce point de fréquence. Les fenêtres sont de taille fixe dans l'espace fréquentiel. Votre résultat aura la forme d'une fréquence régulière entre le minimum et le maximum de l'objet d'entrée d'origine. Pour résumer. Rolling () est une opération de fenêtre temporelle, tandis que. resample () est une opération de fenêtre basée sur la fréquence. Centrer les fenêtres Par défaut, les étiquettes sont définies sur le bord droit de la fenêtre, mais un mot clé central est disponible afin que les étiquettes puissent être définies au centre. Fonctions de fenêtres binaires cov () et corr () peuvent calculer des statistiques de fenêtres mobiles sur deux séries ou toute combinaison de DataFrameSeries ou DataFrameDataFrame. Voici le comportement dans chaque cas: deux séries. Calculer la statistique pour l'appariement. DataFrameSeries. Calculer les statistiques pour chaque colonne du DataFrame avec la série passée, renvoyant ainsi un DataFrame. DataFrameDataFrame. Par défaut calculer la statistique pour les noms de colonne correspondants, en retournant un DataFrame. Si l'argument partagé pairwiseTrue est passé, calcule ensuite la statistique pour chaque paire de colonnes, renvoyant un Panel dont les éléments sont les dates en question (voir la section suivante). Calcul de covariances et de corrélations en paire par roulement Dans l'analyse de données financières et d'autres domaines, il est courant de calculer des matrices de covariance et de corrélation pour une collection de séries temporelles. Souvent, on s'intéresse également à la covariance de la fenêtre mobile et aux matrices de corrélation. Cela peut être fait en passant l'argument par mots clés pairwise, qui dans le cas des entrées DataFrame donnera un Panel dont les éléments sont les dates en question. Dans le cas d'un seul argument DataFrame, l'argument pairwise peut même être omis: Les valeurs manquantes sont ignorées et chaque entrée est calculée en utilisant les observations par paires complètes. Veuillez consulter la section de covariance pour les réserves associées à cette méthode de calcul des matrices de covariance et de corrélation. Mis à part de ne pas avoir un paramètre de fenêtre, ces fonctions ont les mêmes interfaces que leurs homologues de routage. Comme ci-dessus, les paramètres qu'ils acceptent tous sont: minperiods. Le seuil des points de données non nuls à exiger. Le paramètre par défaut est le minimum requis pour calculer la statistique. Aucun NaN ne sera produit une fois que des points de données non nuls de minperiods ont été vus. centre. Booléen, s'il faut définir les étiquettes au centre (par défaut, False) La sortie des méthodes. rolling et. expanding ne renvoie pas NaN si au moins des valeurs non null de minperiods sont présentes dans la fenêtre courante. Cela diffère de cumsum. Cumprod. Cummax. Et le cumin. Qui renvoient NaN dans la sortie chaque fois qu'un NaN est rencontré dans l'entrée. Une statistique de fenêtre en expansion sera plus stable (et moins sensible) que sa contrepartie de fenêtre de roulement, car la taille de fenêtre croissante diminue l'impact relatif d'un point de données individuel. A titre d'exemple, voici la moyenne () de sortie pour le jeu de données de séries chronologiques précédentes: Exponentially Weighted Windows Un ensemble de fonctions connexes sont exponentiellement pondéré versions de plusieurs des statistiques ci-dessus. Une interface similaire à. rolling et. expanding est accessible via la méthode. ewm pour recevoir un objet EWM. Un certain nombre de méthodes EW en expansion (exponentiellement pondérées) sont fournies:


No comments:

Post a Comment