Didacticiel sur les conflits de données Python: Cryptocurrency Edition – investir sur crypto

Carte de paiement Crypto

Demandez votre Carte de paiement Crypto ici

Recevez 8 € de BTC gratuitement

Inscrivez-vous à CoinBase









Actualité bitcoin


Les bitcoins et les crypto-monnaies ont fait fureur… mais en tant que spécialistes des données, nous sommes des empiristes, non? Nous ne voulons pas nous fier aux mots des autres, nous voulons regarder les données de première main! Dans ce didacticiel, nous présenterons des techniques courantes et puissantes de gestion des données en Python.

D'une manière générale, querelles de données est le processus de transformation, d’agrégation, de séparation ou de transformation de vos données d’un format à un format plus utile.

Par exemple,. Disons que nous voulions effectuer une analyse avancée d’une stratégie très rudimentaire de négociation sur momentum:

  1. Au début de chaque mois, nous achetons la crypto-monnaie qui a enregistré la plus forte augmentation de prix par rapport aux 7, 14, 21 ou 28 jours précédents. Nous voulons évaluer chacune de ces fenêtres temporelles.
  2. Nous conservons ensuite pendant exactement 7 jours et vendons notre position. Remarque: il s’agit d’une stratégie simple et délibérément conçue à des fins d’illustration.

Dans quelle mesure devrions-nous évaluer cette stratégie?

C’est une excellente question pour présenter les techniques de gestion des données, car tout le travail à faire consiste à façonner votre jeu de données au format approprié. Une fois que vous avez la table de base analytique appropriée, la réponse à la question devient simple.

Ce que ce guide n'est pas:

Il ne s'agit pas d'un guide sur les stratégies d'investissement ou de négociation, ni d'un soutien pour ou contre la crypto-monnaie. Les investisseurs potentiels devraient se faire leur propre opinion de manière indépendante, mais ce guide présentera des outils pour le faire.

Encore une fois, ce didacticiel est axé sur les techniques de correspondance de données et la possibilité de transformer des jeux de données bruts en formats vous permettant de répondre à des questions intéressantes.

Un petit conseil avant de commencer:

Ce didacticiel est conçu pour être simplifié et ne traitera pas un sujet en détail. Il peut être utile d’avoir à côté de vous la documentation de la bibliothèque Pandas comme référence supplémentaire.

Contenu du didacticiel Python Data Wrangling

Voici les étapes que nous allons suivre pour notre analyse:

  1. Configurez votre environnement.
  2. Importer des bibliothèques et un jeu de données.
  3. Comprendre les données.
  4. Filtre observations indésirables.
  5. Pivot l'ensemble de données.
  6. Décalage l'ensemble de données pivoté.
  7. Fondre l'ensemble de données déplacé.
  8. Réduire-fusionner les données fondues.
  9. Agrégat avec group-by.

Étape 1: Configurez votre environnement.

Tout d’abord, assurez-vous que les éléments suivants sont installés sur votre ordinateur:

  • Python 2.7+ ou Python 3
  • Pandas
  • Jupyter Notebook (facultatif, mais recommandé)

Nous vous recommandons fortement d'installer Anaconda Distribution, fourni avec tous ces packages. Suivez simplement les instructions sur cette page de téléchargement.

Une fois Anaconda installé, démarrez simplement Jupyter (via la ligne de commande ou l’application Navigator) et ouvrez un nouveau carnet:

Jupyter New Notebook

Python 3 ou Python 2.7+ conviennent tous les deux.

Étape 2: Importer des bibliothèques et un jeu de données.

Commençons par importer Pandas, la meilleure bibliothèque Python pour la gestion de jeux de données relationnels (au format table). Les pandas feront le gros du travail lourd pour ce tutoriel.

  • Pointe: nous allons donner un pandas alias. Plus tard, nous pouvons invoquer la bibliothèque avec
    pd.

Ensuite, modifions un peu les options d’affichage. Premièrement, affichons les flottants avec 2 décimales pour rendre les tableaux moins encombrés. Ne vous inquiétez pas … il s'agit uniquement d'un paramètre d'affichage qui ne réduit pas la précision sous-jacente. Développons également les limites pour le nombre de lignes et de colonnes affichées.

Pour ce didacticiel, nous utiliserons un jeu de données de prix géré par Brave New Coin et distribué sur Quandl. La version complète suit les indices de prix pour plus de 1 900 paires de négoce fiat-crypto, mais elle nécessite un abonnement premium. Nous avons donc fourni un petit échantillon avec une poignée de cryptomonnaies.

Pour suivre, vous pouvez télécharger BNC2_sample.csv. Cliquez sur ce lien pour accéder à Google Drive, puis cliquez simplement sur l'icône de téléchargement en haut à droite:

Téléchargez BNC2_sample à partir de Google Drive

Une fois que vous avez téléchargé le jeu de données et placé le même répertoire de fichiers que votre bloc-notes Jupyter, vous pouvez exécuter le code suivant pour lire le jeu de données dans un cadre de données Pandas et afficher des exemples d'observations.

BNC2_sample 5 premières observations

Notez que nous utilisons le
noms= argument pour
pd.read_csv() pour définir nos propres noms de colonne car le jeu de données d'origine n'en contient aucun.

Dictionnaire de données (pour le code GWA_BTC):

  • Rendez-vous amoureux: Le jour où les valeurs d'index ont été calculées.
  • Ouvrir: Indice des prix d'ouverture du jour pour Bitcoin en dollars américains.
  • Haute: La valeur la plus élevée de l'indice de prix pour Bitcoin en dollars américains ce jour-là.
  • Faible: La valeur la plus basse de l'indice de prix pour Bitcoin en dollars américains ce jour-là.
  • Proche: Indice de prix de clôture du jour pour Bitcoin en dollars américains.
  • Le volume: Le volume de Bitcoin échangé ce jour-là.
  • VWAP: Le prix moyen pondéré en volume de Bitcoin négocié ce jour-là.
  • TWAP: Le prix moyen pondéré dans le temps de Bitcoin a été échangé ce jour-là.

Étape 3: Comprenez les données.

L'une des raisons les plus courantes de perturber les données est lorsqu'il y a «trop» d'informations dans une seule table, en particulier lorsqu'il s'agit de données chronologiques.

En règle générale, toutes les observations doivent être équivalentes granularité et en des unités.

Il y aura des exceptions, mais pour la plupart, cette règle empirique peut vous éviter de nombreux maux de tête.

  • Équivalence en granularité – Par exemple, vous pouvez avoir 10 lignes de données provenant de 10 crypto-devises différentes. Cependant, vous devriez ne pas avoir une 11ème ligne avec les valeurs moyennes ou totales des 10 autres lignes. Cette 11ème rangée serait un agrégation, et donc pas équivalent en granularité à l'autre 10.
  • Équivalence en unités – Vous pouvez avoir 10 lignes avec des prix en USD collectés à des dates différentes. Cependant, vous devriez ne pas puis avoir 10 autres lignes avec les prix indiqués en EUR. Les agrégations, distributions, visualisations ou statistiques n'auraient plus aucun sens.

Notre ensemble de données brutes actuel enfreint ces deux règles!

Les données stockées dans des fichiers CSV ou des bases de données sont souvent au format «empilé» ou «enregistrement». Ils utilisent un seul
'Code' colonne comme une fourre-tout pour les métadonnées. Par exemple, dans l'exemple de données, nous avons les codes suivants:

Tout d'abord, voyez comment certains codes commencent par GWA et d'autres avec MWA? Ce sont en réalité des types d'indicateurs complètement différents selon la page de documentation.

  • MWA signifie "moyenne pondérée par le marché, "et ils affichent les prix régionaux. Il existe plusieurs codes MWA pour chaque crypto-monnaie, un pour chaque monnaie locale.
  • En revanche, GWA signifie "moyenne pondérée globale, "qui présente des prix indexés globalement. GWA est donc une agrégation de MWA et n’a pas l’équivalent en granularité. (Remarque: seul un sous-ensemble de codes MWA régionaux est inclus dans l’ensemble de données.)

Par exemple, regardons les codes de Bitcoin à la même date:

Exemple de relation GWA et MWA

Comme vous pouvez le constater, nous avons plusieurs entrées pour une crypto-monnaie à une date donnée. Pour compliquer davantage les choses, les données MWA régionales sont libellées dans leur devise locale (c'est-à-dire, des unités non équivalentes). Vous aurez donc également besoin des taux de change historiques.

Avoir différents niveaux de granularité et / ou différentes unités rend l'analyse au mieux encombrante, voire carrément impossible au pire.

Heureusement, une fois que nous avons repéré ce problème, il est en fait trivial de le résoudre!

Étape 4: Filtrez les observations non souhaitées.

L'une des techniques de gestion des données les plus simples et les plus utiles consiste à supprimer les observations non désirées.

Dans l'étape précédente, nous avons appris que les codes GWA sont des agrégations des codes MWA régionaux. Par conséquent, pour effectuer notre analyse, il suffit de conserver les codes GWA globaux:

Maintenant que nous n'avons plus que des codes GWA, toutes nos observations sont équivalentes en granularité et en unités. Nous pouvons procéder en toute confiance.

Étape 5: Faites pivoter le jeu de données.

Ensuite, afin d’analyser notre stratégie de négociation dynamique décrite ci-dessus, nous devrons calculer, pour chaque crypto-monnaie, les rendements des 7, 14, 21 et 28 jours précédents … le premier jour de chaque mois.

Cependant, il serait très pénible de le faire avec le jeu de données "empilé" actuel. Cela impliquerait l'écriture de fonctions d'assistance, de boucles et de beaucoup de logique conditionnelle. Au lieu de cela, nous adopterons une approche plus élégante ….

Tout d'abord, nous allons pivot l'ensemble de données en ne conservant qu'une seule colonne de prix. Pour ce tutoriel, gardons le VWAP colonne (prix moyen pondéré en fonction du volume), mais vous pourriez faire de bonnes affaires pour la plupart d’entre elles.

Crypto pivoté

Comme vous pouvez le constater, chaque colonne de notre ensemble de données pivoté représente désormais le prix d’une crypto-monnaie et chaque ligne contient les prix d’une date. Toutes les fonctionnalités sont maintenant alignées par date.

Étape 6: Décalage du jeu de données pivoté.

Pour calculer facilement les rendements sur les 7, 14, 21 et 28 jours précédents, nous pouvons utiliser la méthode de Pandas. décalage méthode.

Cette fonction décale l'index de la trame de données par un certain nombre de périodes. Par exemple, voici ce qui se passe lorsque nous décalons notre jeu de données pivoté de 1:

Remarquez comment le jeu de données déplacé a maintenant des valeurs d'un jour auparavant? Nous pouvons en profiter pour calculer les rendements antérieurs pour nos fenêtres de 7, 14, 21 et 28 jours.

Par exemple, pour calculer les rendements sur les 7 jours précédents, nous aurions besoin
prix_aujourd'hui / prices_7_days_ago 1,0, qui se traduit par:

Exemple de jeu de données crypto décalé

Calculer les retours pour toutes nos fenêtres est aussi simple que d'écrire une boucle et de les stocker dans un dictionnaire:

Remarque: Le calcul des retours en déplaçant le jeu de données nécessite le respect de 2 hypothèses: (1) les observations sont triées croissant par date et (2) il y a pas de dates manquantes. Nous avons coché cette case pour que ce didacticiel reste concis, mais nous vous recommandons de le confirmer vous-même.

Étape 7: Fusionnez le jeu de données déplacé.

Maintenant que nous avons calculé les retours à l'aide de l'ensemble de données pivoté, nous allons "non-pivoter" les retours. Par non passionnant, ou fusion les données, nous pouvons créer plus tard un table de base analytique (ABT) chaque ligne contient toutes les informations pertinentes pour une pièce donnée à une date donnée.

Nous ne pouvions pas modifier directement le jeu de données d'origine car les données de différentes pièces de monnaie étaient empilées les unes sur les autres, de sorte que les limites se seraient chevauchées. En d'autres termes, les données BTC pourraient s'infiltrer dans les calculs de l'ETH, les données de l'ETH dans les calculs de la LTC, etc.

Pour faire fondre les données, nous allons …

  • reset_index() afin que nous puissions appeler les colonnes par leur nom.
  • Appeler le
    fondre() méthode.
  • Passez la ou les colonnes à conserver dans le
    id_vars= argument.
  • Nommez la colonne fondue en utilisant le
    nom_valeur= argument.

Voici à quoi ressemble une donnée:

Ensemble de données cryptographiques fondues

Pour le faire pour tous les retours de trames de données, nous pouvons simplement parcourir
delta_dict, ainsi:

Enfin, nous pouvons créer une autre trame de données fondue contenant le tourné vers l'avenir Retours 7 jours. Ce sera notre "variable cible" pour évaluer notre stratégie de négociation.

Il suffit de déplacer le jeu de données pivoté de
7 pour obtenir des prix "futurs", comme ceci:

Nous avons maintenant 5 images fondues stockées dans le répertoire
melted_dfs liste, une pour chacun des rendements rétroactifs de 7, 14, 21 et 28 jours et une pour les rendements prévisionnels de 7 jours.

Étape 8: Réduire-fusionner les données fondues.

Tout ce qui reste à faire est de réunir nos bases de données fondues dans un seul tableau de base analytique. Nous aurons besoin de deux outils.

Le premier est celui des pandas fusionner fonction, qui fonctionne comme SQL JOIN. Par exemple, pour fusionner les deux premiers cadres de données fondus …

Jeu de données crypto fusionné

Voyez comment nous avons maintenant delta_7 et delta_14 dans la même rangée? C'est le début de notre table de base analytique. Tout ce que nous devons faire maintenant, c'est fusionner toutes nos images fondues avec une image de base d'autres fonctionnalités que nous pourrions vouloir.

La façon la plus élégante de le faire est d'utiliser la fonction intégrée de Python réduire une fonction. Nous devons d'abord l'importer:

Ensuite, avant d’utiliser cette fonction, créons un
feature_dfs liste contenant les caractéristiques de base de l'ensemble de données d'origine et des ensembles de données fondus.

Nous sommes maintenant prêts à utiliser la fonction de réduction. Réduire applique une fonction de deux arguments cumulativement aux objets dans un séquence (par exemple une liste). Par exemple,
réduire(lambda X,y: X+y, [[[[1,2,3,4,5]) calcule
((((1+2)+3)+4)+5).

Ainsi, nous pouvons réduire la fusion toutes les fonctionnalités aiment:

Jeu de données cryptographiques ABT

Dictionnaire de données pour notre Table de base analytique (ABT):

  • Rendez-vous amoureux: Le jour où les valeurs d'index ont été calculées.
  • Code: Quelle crypto-monnaie.
  • VWAP: Le prix moyen pondéré par le volume négocié ce jour-là.
  • delta_7: Retour sur les 7 jours précédents (1,0 = rendement de 100%).
  • delta_14: Retour sur les 14 jours précédents (1,0 = rendement de 100%).
  • delta_21: Retour sur les 21 jours précédents (1,0 = rendement de 100%).
  • delta_28: Retour sur les 28 jours précédents (1,0 = rendement de 100%).
  • return_7: Rendement futur sur les 7 prochains jours (1,0 = rendement de 100%).

A propos, notez que les 7 dernières observations n’ont pas de valeurs pour le
'return_7' fonctionnalité? Cela est prévu, car nous ne pouvons pas calculer les "rendements à 7 jours futurs" pour les 7 derniers jours de l'ensemble de données.

Techniquement, avec cet ABT, nous pouvons déjà répondre à notre objectif initial. Par exemple, si nous voulions choisir la pièce qui avait le plus grand élan le 1er septembre 2017, nous pourrions simplement afficher les lignes de cette date et consulter les rendements précédents de 7, 14, 21 et 28 jours:

1er septembre Crypto Dataset

Et si vous vouliez choisir par programmation la crypto ayant le plus grand élan (par exemple, au cours des 28 derniers jours), vous écririez:

Cependant, comme nous ne sommes intéressés que par le trading le premier jour de chaque mois, nous pouvons nous faciliter encore plus les choses …

Étape 9: (Facultatif) Agréger avec group-by.

Enfin, si nous voulions ne garder que les premiers jours de chaque mois, nous pouvons utiliser un par groupe suivi d'un agrégation.

  1. Tout d'abord, créez un nouveau
    'mois' caractéristique des 7 premiers caractères des chaînes de date.
  2. Ensuite, groupe les observations de
    'Code' et par
    'mois'. Les pandas vont créer des "cellules" de données qui séparent les observations par code et par mois.
  3. Enfin, au sein de chaque groupe, il suffit de prendre la
    .première() observation et réinitialiser l'index.

Remarque: Nous supposons que votre base de données est toujours correctement triée par date.

Voici à quoi ça ressemble tous mis ensemble:

Groupe de données Groupby Agg Crypto

Comme vous pouvez le constater, nous avons maintenant un bon ABT avec:

  • Seules les données pertinentes du 1er jour de chaque mois.
  • Caractéristiques Momentum calculées à partir des 7, 14, 21 et 28 jours précédents.
  • Le futur revient que vous auriez fait 7 jours plus tard.

En d'autres termes, nous avons exactement ce dont nous avons besoin pour évaluer la stratégie de trading simple que nous avons proposée au début!


Félicitations … vous êtes arrivé à la fin de ce tutoriel sur la gestion des données en Python!

Nous avons introduit plusieurs outils clés de filtrage, de manipulation et de transformation de jeux de données en Python, mais nous n’avons fait qu’effleurer la surface. Pandas est une bibliothèque très puissante avec de nombreuses fonctionnalités supplémentaires.

Pour un apprentissage continu, nous vous recommandons de télécharger plus de jeux de données pour une pratique pratique. Proposez une question intéressante, planifiez votre approche et utilisez la documentation pour obtenir de l'aide.

Le code complet, du début à la fin.

Voici tout le code principal au même endroit, dans un seul script.



Traduit depuis https://elitedatascience.com/python-data-wrangling-tutorial

Carte de paiement Crypto

Demandez votre Carte de paiement Crypto ici

Recevez 8 € de BTC gratuitement


Inscrivez-vous à CoinBase