{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Pipeline\n", "\n", "Ce notebook est tiré du Guide Officiel de Quantopian sur les pipelines. N'oubliez pas de consulter leur documentation pour obtenir de nombreuses autres ressources intéressantes !\n", "\n", "De nombreux algorithmes de Trading ont la structure suivante :\n", "\n", "1. Pour chaque actif d'un ensemble connu (important), calculer N valeurs scalaires pour l'actif sur la base d'une fenêtre de données.\n", "2. Sélectionnez un ensemble d'actifs négociables plus petit sur la base des valeurs calculées en (1).\n", "3. Calculer les pondérations de portefeuille souhaitées sur l'ensemble des actifs sélectionnés en (2).\n", "4. Passer des ordres pour déplacer les allocations de portefeuille actuelles de l'algorithme vers les pondérations souhaitées calculées en (3).\n", "\n", "Il y a plusieurs défis techniques à relever pour réaliser cette opération de manière robuste. Il s'agit notamment de :\n", "\n", "* Interroger efficacement de grands ensembles d'actifs\n", "* effectuer des calculs sur de grands ensembles d'actifs\n", "* traitement des ajustements (fractionnements et dividendes)\n", "* les radiations d'actifs\n", "\n", "Le pipeline existe pour résoudre ces défis en fournissant une API uniforme pour exprimer les calculs sur une collection diverse d'ensembles de données." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Facteurs\n", "Un facteur est une fonction d'un actif et d'un moment dans le temps à une valeur numérique.\n", "\n", "Un exemple simple de facteur est le prix le plus récent d'un titre. Pour un titre et un moment précis, le prix le plus récent est un nombre. Un autre exemple est le volume moyen des transactions sur 10 jours d'un titre. Les facteurs sont le plus souvent utilisés pour attribuer des valeurs aux titres, qui peuvent ensuite être utilisées de plusieurs façons. Un facteur peut être utilisé dans chacune des procédures suivantes :\n", "* calcul des pondérations cibles\n", "* générer un signal alpha\n", "* construire d'autres facteurs plus complexes\n", "* construction de filtres" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Filtres\n", "Un filtre est une fonction allant d'un actif et d'un moment dans le temps à un booléen.\n", "Un exemple de filtre est une fonction indiquant si le prix d'un titre est inférieur à 10 $. En fonction d'un titre et d'un moment dans le temps, cela permet d'évaluer si le titre est vrai ou faux. Les filtres sont le plus souvent utilisés pour décrire des ensembles d'actifs à inclure ou à exclure dans un but particulier." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Classificateurs\n", "Un classificateur est une fonction d'un actif et d'un moment dans le temps ayant une sortie catégorielle.\n", "Plus précisément, un classificateur produit une chaîne ou un int qui ne représente pas une valeur numérique (par exemple, un label entier tel qu'un code de secteur). Les classificateurs sont le plus souvent utilisés pour regrouper des actifs pour des transformations complexes sur des sorties de facteurs. Un exemple de classificateur est la bourse sur laquelle un actif est actuellement négocié." ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [], "source": [ "from quantopian.pipeline import Pipeline" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [], "source": [ "def make_pipeline():\n", " return Pipeline()" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [], "source": [ "pipe = make_pipeline()" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [], "source": [ "from quantopian.research import run_pipeline" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "Pipeline Execution Time: 0.02 Seconds" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "result = run_pipeline(pipe,'2017-01-01','2017-01-01')" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
2017-01-03 00:00:00+00:00Equity(2 [ARNC])
Equity(21 [AAME])
Equity(24 [AAPL])
Equity(25 [ARNC_PR])
Equity(31 [ABAX])
Equity(39 [DDC])
Equity(41 [ARCB])
Equity(52 [ABM])
Equity(53 [ABMD])
Equity(62 [ABT])
\n", "
" ], "text/plain": [ "Empty DataFrame\n", "Columns: []\n", "Index: [(2017-01-03 00:00:00+00:00, Equity(2 [ARNC])), (2017-01-03 00:00:00+00:00, Equity(21 [AAME])), (2017-01-03 00:00:00+00:00, Equity(24 [AAPL])), (2017-01-03 00:00:00+00:00, Equity(25 [ARNC_PR])), (2017-01-03 00:00:00+00:00, Equity(31 [ABAX])), (2017-01-03 00:00:00+00:00, Equity(39 [DDC])), (2017-01-03 00:00:00+00:00, Equity(41 [ARCB])), (2017-01-03 00:00:00+00:00, Equity(52 [ABM])), (2017-01-03 00:00:00+00:00, Equity(53 [ABMD])), (2017-01-03 00:00:00+00:00, Equity(62 [ABT]))]" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result.head(10)" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "MultiIndex: 8356 entries, (2017-01-03 00:00:00+00:00, Equity(2 [ARNC])) to (2017-01-03 00:00:00+00:00, Equity(50569 [OUSM]))\n", "Empty DataFrame" ] } ], "source": [ "result.info()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Data" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [], "source": [ "from quantopian.pipeline.data.builtin import USEquityPricing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Facteurs\n", "\n", "N'oubliez pas que les facteurs prennent en compte un actif et un horodatage et rendent une certaine valeur numérique." ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [], "source": [ "from quantopian.pipeline.factors import BollingerBands,SimpleMovingAverage,EWMA" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "SimpleMovingAverage([EquityPricing.close], 30)" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "SimpleMovingAverage(inputs=[USEquityPricing.close],window_length=30)" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [], "source": [ "def make_pipeline():\n", " \n", " mean_close_30 = SimpleMovingAverage(inputs=[USEquityPricing.close],window_length=30)\n", " \n", " return Pipeline(columns={\n", " '30 Day Mean Close':mean_close_30\n", " })" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "Pipeline Execution Time: 0.38 Seconds" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "results = run_pipeline(make_pipeline(),'2017-01-01','2017-01-01')" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
30 Day Mean Close
2017-01-03 00:00:00+00:00Equity(2 [ARNC])20.110500
Equity(21 [AAME])3.899241
Equity(24 [AAPL])113.368433
Equity(25 [ARNC_PR])86.796111
Equity(31 [ABAX])52.498394
Equity(39 [DDC])9.523000
Equity(41 [ARCB])29.969167
Equity(52 [ABM])42.138239
Equity(53 [ABMD])114.030167
Equity(62 [ABT])38.664333
Equity(64 [GOLD])15.117736
Equity(66 [AB])23.119167
Equity(67 [ADSK])75.960667
Equity(69 [ACAT])15.839500
Equity(70 [VBF])18.208480
Equity(76 [TAP])97.727924
Equity(84 [ACET])20.722753
Equity(100 [IEP])59.281167
Equity(106 [ACU])22.628433
Equity(110 [RAMP])26.800333
\n", "
" ], "text/plain": [ " 30 Day Mean Close\n", "2017-01-03 00:00:00+00:00 Equity(2 [ARNC]) 20.110500\n", " Equity(21 [AAME]) 3.899241\n", " Equity(24 [AAPL]) 113.368433\n", " Equity(25 [ARNC_PR]) 86.796111\n", " Equity(31 [ABAX]) 52.498394\n", " Equity(39 [DDC]) 9.523000\n", " Equity(41 [ARCB]) 29.969167\n", " Equity(52 [ABM]) 42.138239\n", " Equity(53 [ABMD]) 114.030167\n", " Equity(62 [ABT]) 38.664333\n", " Equity(64 [GOLD]) 15.117736\n", " Equity(66 [AB]) 23.119167\n", " Equity(67 [ADSK]) 75.960667\n", " Equity(69 [ACAT]) 15.839500\n", " Equity(70 [VBF]) 18.208480\n", " Equity(76 [TAP]) 97.727924\n", " Equity(84 [ACET]) 20.722753\n", " Equity(100 [IEP]) 59.281167\n", " Equity(106 [ACU]) 22.628433\n", " Equity(110 [RAMP]) 26.800333" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results.head(20)" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [], "source": [ "def make_pipeline():\n", " \n", " mean_close_30 = SimpleMovingAverage(inputs=[USEquityPricing.close],window_length=30)\n", " latest_close = USEquityPricing.close.latest\n", " \n", " return Pipeline(columns={\n", " '30 Day Mean Close':mean_close_30,\n", " 'Latest Close':latest_close\n", " })" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "Pipeline Execution Time: 0.41 Seconds" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "results = run_pipeline(make_pipeline(),'2017-01-01','2017-01-01')" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
30 Day Mean CloseLatest Close
2017-01-03 00:00:00+00:00Equity(2 [ARNC])20.11050018.55
Equity(21 [AAME])3.8992414.10
Equity(24 [AAPL])113.368433115.84
Equity(25 [ARNC_PR])86.796111NaN
Equity(31 [ABAX])52.49839452.74
Equity(39 [DDC])9.5230009.69
Equity(41 [ARCB])29.96916727.75
Equity(52 [ABM])42.13823940.68
Equity(53 [ABMD])114.030167112.70
Equity(62 [ABT])38.66433338.42
\n", "
" ], "text/plain": [ " 30 Day Mean Close \\\n", "2017-01-03 00:00:00+00:00 Equity(2 [ARNC]) 20.110500 \n", " Equity(21 [AAME]) 3.899241 \n", " Equity(24 [AAPL]) 113.368433 \n", " Equity(25 [ARNC_PR]) 86.796111 \n", " Equity(31 [ABAX]) 52.498394 \n", " Equity(39 [DDC]) 9.523000 \n", " Equity(41 [ARCB]) 29.969167 \n", " Equity(52 [ABM]) 42.138239 \n", " Equity(53 [ABMD]) 114.030167 \n", " Equity(62 [ABT]) 38.664333 \n", "\n", " Latest Close \n", "2017-01-03 00:00:00+00:00 Equity(2 [ARNC]) 18.55 \n", " Equity(21 [AAME]) 4.10 \n", " Equity(24 [AAPL]) 115.84 \n", " Equity(25 [ARNC_PR]) NaN \n", " Equity(31 [ABAX]) 52.74 \n", " Equity(39 [DDC]) 9.69 \n", " Equity(41 [ARCB]) 27.75 \n", " Equity(52 [ABM]) 40.68 \n", " Equity(53 [ABMD]) 112.70 \n", " Equity(62 [ABT]) 38.42 " ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results.head(10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Facteurs Combinés" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [], "source": [ "def make_pipeline():\n", " \n", " mean_close_10 = SimpleMovingAverage(inputs=[USEquityPricing.close],window_length=10)\n", " mean_close_30 = SimpleMovingAverage(inputs=[USEquityPricing.close],window_length=30)\n", " latest_close = USEquityPricing.close.latest\n", " \n", " percent_difference = (mean_close_10-mean_close_30) / mean_close_30\n", " \n", " return Pipeline(columns={\n", " 'Percent Difference':percent_difference,\n", " '30 Day Mean Close':mean_close_30,\n", " 'Latest Close':latest_close\n", " })" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "Pipeline Execution Time: 0.41 Seconds" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "results = run_pipeline(make_pipeline(),'2017-01-01','2017-01-01')" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
30 Day Mean CloseLatest ClosePercent Difference
2017-01-03 00:00:00+00:00Equity(2 [ARNC])20.11050018.55-0.022749
Equity(21 [AAME])3.8992414.10-0.005499
Equity(24 [AAPL])113.368433115.840.028481
Equity(25 [ARNC_PR])86.796111NaN-0.000474
Equity(31 [ABAX])52.49839452.74-0.007665
\n", "
" ], "text/plain": [ " 30 Day Mean Close \\\n", "2017-01-03 00:00:00+00:00 Equity(2 [ARNC]) 20.110500 \n", " Equity(21 [AAME]) 3.899241 \n", " Equity(24 [AAPL]) 113.368433 \n", " Equity(25 [ARNC_PR]) 86.796111 \n", " Equity(31 [ABAX]) 52.498394 \n", "\n", " Latest Close \\\n", "2017-01-03 00:00:00+00:00 Equity(2 [ARNC]) 18.55 \n", " Equity(21 [AAME]) 4.10 \n", " Equity(24 [AAPL]) 115.84 \n", " Equity(25 [ARNC_PR]) NaN \n", " Equity(31 [ABAX]) 52.74 \n", "\n", " Percent Difference \n", "2017-01-03 00:00:00+00:00 Equity(2 [ARNC]) -0.022749 \n", " Equity(21 [AAME]) -0.005499 \n", " Equity(24 [AAPL]) 0.028481 \n", " Equity(25 [ARNC_PR]) -0.000474 \n", " Equity(31 [ABAX]) -0.007665 " ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Filtres et Ecrans\n", "\n", "Les filtres prennent en compte un actif et un horodatage et renvoient un booléen" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [], "source": [ "last_close_price = USEquityPricing.close.latest\n", "close_price_filter = last_close_price > 20" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "NumExprFilter(expr='x_0 > (20.0)', bindings={'x_0': Latest([EquityPricing.close], 1)})" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "close_price_filter" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [], "source": [ "def make_pipeline():\n", " \n", " mean_close_10 = SimpleMovingAverage(inputs=[USEquityPricing.close],window_length=10)\n", " mean_close_30 = SimpleMovingAverage(inputs=[USEquityPricing.close],window_length=30)\n", " latest_close = USEquityPricing.close.latest\n", " \n", " percent_difference = (mean_close_10-mean_close_30) / mean_close_30\n", " \n", " perc_diff_check = percent_difference > 0 \n", " \n", " return Pipeline(columns={\n", " 'Percent Difference':percent_difference,\n", " '30 Day Mean Close':mean_close_30,\n", " 'Latest Close':latest_close,\n", " 'Positive Percent Diff': perc_diff_check\n", " })" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "Pipeline Execution Time: 0.41 Seconds" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
30 Day Mean CloseLatest ClosePercent DifferencePositive Percent Diff
2017-01-03 00:00:00+00:00Equity(2 [ARNC])20.11050018.55-0.022749False
Equity(21 [AAME])3.8992414.10-0.005499False
Equity(24 [AAPL])113.368433115.840.028481True
Equity(25 [ARNC_PR])86.796111NaN-0.000474False
Equity(31 [ABAX])52.49839452.74-0.007665False
\n", "
" ], "text/plain": [ " 30 Day Mean Close \\\n", "2017-01-03 00:00:00+00:00 Equity(2 [ARNC]) 20.110500 \n", " Equity(21 [AAME]) 3.899241 \n", " Equity(24 [AAPL]) 113.368433 \n", " Equity(25 [ARNC_PR]) 86.796111 \n", " Equity(31 [ABAX]) 52.498394 \n", "\n", " Latest Close \\\n", "2017-01-03 00:00:00+00:00 Equity(2 [ARNC]) 18.55 \n", " Equity(21 [AAME]) 4.10 \n", " Equity(24 [AAPL]) 115.84 \n", " Equity(25 [ARNC_PR]) NaN \n", " Equity(31 [ABAX]) 52.74 \n", "\n", " Percent Difference \\\n", "2017-01-03 00:00:00+00:00 Equity(2 [ARNC]) -0.022749 \n", " Equity(21 [AAME]) -0.005499 \n", " Equity(24 [AAPL]) 0.028481 \n", " Equity(25 [ARNC_PR]) -0.000474 \n", " Equity(31 [ABAX]) -0.007665 \n", "\n", " Positive Percent Diff \n", "2017-01-03 00:00:00+00:00 Equity(2 [ARNC]) False \n", " Equity(21 [AAME]) False \n", " Equity(24 [AAPL]) True \n", " Equity(25 [ARNC_PR]) False \n", " Equity(31 [ABAX]) False " ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results = run_pipeline(make_pipeline(),'2017-01-01','2017-01-01')\n", "results.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Ecrans" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [], "source": [ "def make_pipeline():\n", " \n", " mean_close_10 = SimpleMovingAverage(inputs=[USEquityPricing.close],window_length=10)\n", " mean_close_30 = SimpleMovingAverage(inputs=[USEquityPricing.close],window_length=30)\n", " latest_close = USEquityPricing.close.latest\n", " \n", " percent_difference = (mean_close_10-mean_close_30) / mean_close_30\n", " \n", " perc_diff_check = percent_difference > 0 \n", " \n", " return Pipeline(columns={\n", " 'Percent Difference':percent_difference,\n", " '30 Day Mean Close':mean_close_30,\n", " 'Latest Close':latest_close,\n", " 'Positive Percent Diff': perc_diff_check},\n", " screen=perc_diff_check)" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "Pipeline Execution Time: 0.44 Seconds" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
30 Day Mean CloseLatest ClosePercent DifferencePositive Percent Diff
2017-01-03 00:00:00+00:00Equity(24 [AAPL])113.368433115.840.028481True
Equity(66 [AB])23.11916723.450.004578True
Equity(69 [ACAT])15.83950015.020.009375True
Equity(70 [VBF])18.20848018.490.011814True
Equity(84 [ACET])20.72275321.970.039630True
\n", "
" ], "text/plain": [ " 30 Day Mean Close Latest Close \\\n", "2017-01-03 00:00:00+00:00 Equity(24 [AAPL]) 113.368433 115.84 \n", " Equity(66 [AB]) 23.119167 23.45 \n", " Equity(69 [ACAT]) 15.839500 15.02 \n", " Equity(70 [VBF]) 18.208480 18.49 \n", " Equity(84 [ACET]) 20.722753 21.97 \n", "\n", " Percent Difference \\\n", "2017-01-03 00:00:00+00:00 Equity(24 [AAPL]) 0.028481 \n", " Equity(66 [AB]) 0.004578 \n", " Equity(69 [ACAT]) 0.009375 \n", " Equity(70 [VBF]) 0.011814 \n", " Equity(84 [ACET]) 0.039630 \n", "\n", " Positive Percent Diff \n", "2017-01-03 00:00:00+00:00 Equity(24 [AAPL]) True \n", " Equity(66 [AB]) True \n", " Equity(69 [ACAT]) True \n", " Equity(70 [VBF]) True \n", " Equity(84 [ACET]) True " ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results = run_pipeline(make_pipeline(),'2017-01-01','2017-01-01')\n", "results.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Inverser un écran" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [], "source": [ "def make_pipeline():\n", " \n", " mean_close_10 = SimpleMovingAverage(inputs=[USEquityPricing.close],window_length=10)\n", " mean_close_30 = SimpleMovingAverage(inputs=[USEquityPricing.close],window_length=30)\n", " latest_close = USEquityPricing.close.latest\n", " \n", " percent_difference = (mean_close_10-mean_close_30) / mean_close_30\n", " \n", " perc_diff_check = percent_difference > 0 \n", " \n", " return Pipeline(columns={\n", " 'Percent Difference':percent_difference,\n", " '30 Day Mean Close':mean_close_30,\n", " 'Latest Close':latest_close,\n", " 'Positive Percent Diff': perc_diff_check},\n", " screen=~perc_diff_check)" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "Pipeline Execution Time: 0.41 Seconds" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
30 Day Mean CloseLatest ClosePercent DifferencePositive Percent Diff
2017-01-03 00:00:00+00:00Equity(2 [ARNC])20.11050018.55-0.022749False
Equity(21 [AAME])3.8992414.10-0.005499False
Equity(25 [ARNC_PR])86.796111NaN-0.000474False
Equity(31 [ABAX])52.49839452.74-0.007665False
Equity(39 [DDC])9.5230009.69-0.015436False
\n", "
" ], "text/plain": [ " 30 Day Mean Close \\\n", "2017-01-03 00:00:00+00:00 Equity(2 [ARNC]) 20.110500 \n", " Equity(21 [AAME]) 3.899241 \n", " Equity(25 [ARNC_PR]) 86.796111 \n", " Equity(31 [ABAX]) 52.498394 \n", " Equity(39 [DDC]) 9.523000 \n", "\n", " Latest Close \\\n", "2017-01-03 00:00:00+00:00 Equity(2 [ARNC]) 18.55 \n", " Equity(21 [AAME]) 4.10 \n", " Equity(25 [ARNC_PR]) NaN \n", " Equity(31 [ABAX]) 52.74 \n", " Equity(39 [DDC]) 9.69 \n", "\n", " Percent Difference \\\n", "2017-01-03 00:00:00+00:00 Equity(2 [ARNC]) -0.022749 \n", " Equity(21 [AAME]) -0.005499 \n", " Equity(25 [ARNC_PR]) -0.000474 \n", " Equity(31 [ABAX]) -0.007665 \n", " Equity(39 [DDC]) -0.015436 \n", "\n", " Positive Percent Diff \n", "2017-01-03 00:00:00+00:00 Equity(2 [ARNC]) False \n", " Equity(21 [AAME]) False \n", " Equity(25 [ARNC_PR]) False \n", " Equity(31 [ABAX]) False \n", " Equity(39 [DDC]) False " ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results = run_pipeline(make_pipeline(),'2017-01-01','2017-01-01')\n", "results.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Combiner des Filtres" ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [], "source": [ "def make_pipeline():\n", " \n", " mean_close_10 = SimpleMovingAverage(inputs=[USEquityPricing.close],window_length=10)\n", " mean_close_30 = SimpleMovingAverage(inputs=[USEquityPricing.close],window_length=30)\n", " latest_close = USEquityPricing.close.latest\n", " \n", " percent_difference = (mean_close_10-mean_close_30) / mean_close_30\n", " \n", " perc_diff_check = percent_difference > 0 \n", " small_price = latest_close < 5\n", " \n", " final_filter = perc_diff_check & small_price\n", " \n", " return Pipeline(columns={\n", " 'Percent Difference':percent_difference,\n", " '30 Day Mean Close':mean_close_30,\n", " 'Latest Close':latest_close,\n", " 'Positive Percent Diff': perc_diff_check},\n", " screen=final_filter)" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "Pipeline Execution Time: 0.41 Seconds" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
30 Day Mean CloseLatest ClosePercent DifferencePositive Percent Diff
2017-01-03 00:00:00+00:00Equity(535 [ARTW])3.0977783.400.013271True
Equity(677 [AXAS])2.2653332.560.145527True
Equity(1144 [LCTX])3.5311673.620.065795True
Equity(1323 [CAW])2.5413332.600.016002True
Equity(1546 [CIF])2.5003702.570.015579True
\n", "
" ], "text/plain": [ " 30 Day Mean Close \\\n", "2017-01-03 00:00:00+00:00 Equity(535 [ARTW]) 3.097778 \n", " Equity(677 [AXAS]) 2.265333 \n", " Equity(1144 [LCTX]) 3.531167 \n", " Equity(1323 [CAW]) 2.541333 \n", " Equity(1546 [CIF]) 2.500370 \n", "\n", " Latest Close \\\n", "2017-01-03 00:00:00+00:00 Equity(535 [ARTW]) 3.40 \n", " Equity(677 [AXAS]) 2.56 \n", " Equity(1144 [LCTX]) 3.62 \n", " Equity(1323 [CAW]) 2.60 \n", " Equity(1546 [CIF]) 2.57 \n", "\n", " Percent Difference \\\n", "2017-01-03 00:00:00+00:00 Equity(535 [ARTW]) 0.013271 \n", " Equity(677 [AXAS]) 0.145527 \n", " Equity(1144 [LCTX]) 0.065795 \n", " Equity(1323 [CAW]) 0.016002 \n", " Equity(1546 [CIF]) 0.015579 \n", "\n", " Positive Percent Diff \n", "2017-01-03 00:00:00+00:00 Equity(535 [ARTW]) True \n", " Equity(677 [AXAS]) True \n", " Equity(1144 [LCTX]) True \n", " Equity(1323 [CAW]) True \n", " Equity(1546 [CIF]) True " ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results = run_pipeline(make_pipeline(),'2017-01-01','2017-01-01')\n", "results.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Fundamentals de Morningstar\n", "\n", "`Fundamentals` donne un accès à la base de données fondamentale quantopienne. Basée sur les données fournies par Morningstar, `Fundamentals` fournit plus de 600 mesures d'entreprise remontant à 2002 (pour correspondre aux données de tarification de Quantopian).\n", "\n", "Regardez la documentation de Fundamentals : https://www.quantopian.com/docs/data-reference/morningstar_fundamentals.\n" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [], "source": [ "from quantopian.pipeline.data.morningstar import Fundamentals" ] }, { "cell_type": "code", "execution_count": 79, "metadata": {}, "outputs": [], "source": [ "def make_pipeline():\n", " \n", " my_funds = Fundamentals.market_cap.latest\n", " \n", " return Pipeline(columns={'Market Cap':my_funds})" ] }, { "cell_type": "code", "execution_count": 80, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "Pipeline Execution Time: 0.12 Seconds" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "results = run_pipeline(make_pipeline(),'2017-01-03','2017-01-03')" ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "MultiIndex: 8356 entries, (2017-01-03 00:00:00+00:00, Equity(2 [ARNC])) to (2017-01-03 00:00:00+00:00, Equity(50569 [OUSM]))\n", "Data columns (total 1 columns):\n", "Market Cap 5040 non-null float64\n", "dtypes: float64(1)\n", "memory usage: 130.6+ KB\n" ] } ], "source": [ "results.info()" ] }, { "cell_type": "code", "execution_count": 82, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Market Cap
2017-01-03 00:00:00+00:00Equity(2 [ARNC])8.129387e+09
Equity(21 [AAME])8.370243e+07
Equity(24 [AAPL])6.175885e+11
Equity(25 [ARNC_PR])NaN
Equity(31 [ABAX])1.189172e+09
Equity(39 [DDC])8.039806e+08
Equity(41 [ARCB])7.084623e+08
Equity(52 [ABM])2.268896e+09
Equity(53 [ABMD])4.888170e+09
Equity(62 [ABT])5.655141e+10
Equity(64 [GOLD])1.862359e+10
Equity(66 [AB])2.221112e+09
Equity(67 [ADSK])1.647140e+10
Equity(69 [ACAT])1.959759e+08
Equity(70 [VBF])NaN
Equity(76 [TAP])2.090877e+10
Equity(84 [ACET])6.602278e+08
Equity(100 [IEP])8.490282e+09
Equity(106 [ACU])8.501910e+07
Equity(110 [RAMP])2.079641e+09
Equity(112 [ACY])1.480530e+07
Equity(114 [ADBE])5.090425e+10
Equity(117 [AEY])1.793760e+07
Equity(122 [ADI])2.237935e+10
Equity(128 [ADM])2.626700e+10
Equity(149 [ADX])NaN
Equity(153 [AE])1.672277e+08
Equity(154 [AEM])9.434941e+09
Equity(157 [AEG])1.166367e+10
Equity(161 [AEP])3.095816e+10
......
Equity(50534 [HGV])NaN
Equity(50535 [PK])NaN
Equity(50537 [WRD])1.734876e+09
Equity(50539 [TIG])2.339749e+09
Equity(50540 [TRVG])2.762639e+09
Equity(50541 [KEY_PRI])NaN
Equity(50542 [JHMD])NaN
Equity(50543 [COWZ])NaN
Equity(50544 [KEG])2.618865e+07
Equity(50546 [NURE])NaN
Equity(50547 [YTRA])3.297637e+08
Equity(50548 [PHIO_W])NaN
Equity(50549 [BMLP])NaN
Equity(50550 [WBIY])NaN
Equity(50552 [FIV])NaN
Equity(50554 [HEBT])8.415000e+07
Equity(50555 [UUUU_WS])NaN
Equity(50556 [SAB_CL])NaN
Equity(50558 [INFR])NaN
Equity(50559 [VVPR])5.894486e+07
Equity(50560 [XK])NaN
Equity(50561 [XE])NaN
Equity(50562 [XH])NaN
Equity(50563 [XM])NaN
Equity(50564 [XD])NaN
Equity(50565 [XI])NaN
Equity(50566 [XU])NaN
Equity(50567 [XF])NaN
Equity(50568 [XS])NaN
Equity(50569 [OUSM])NaN
\n", "

8356 rows × 1 columns

\n", "
" ], "text/plain": [ " Market Cap\n", "2017-01-03 00:00:00+00:00 Equity(2 [ARNC]) 8.129387e+09\n", " Equity(21 [AAME]) 8.370243e+07\n", " Equity(24 [AAPL]) 6.175885e+11\n", " Equity(25 [ARNC_PR]) NaN\n", " Equity(31 [ABAX]) 1.189172e+09\n", " Equity(39 [DDC]) 8.039806e+08\n", " Equity(41 [ARCB]) 7.084623e+08\n", " Equity(52 [ABM]) 2.268896e+09\n", " Equity(53 [ABMD]) 4.888170e+09\n", " Equity(62 [ABT]) 5.655141e+10\n", " Equity(64 [GOLD]) 1.862359e+10\n", " Equity(66 [AB]) 2.221112e+09\n", " Equity(67 [ADSK]) 1.647140e+10\n", " Equity(69 [ACAT]) 1.959759e+08\n", " Equity(70 [VBF]) NaN\n", " Equity(76 [TAP]) 2.090877e+10\n", " Equity(84 [ACET]) 6.602278e+08\n", " Equity(100 [IEP]) 8.490282e+09\n", " Equity(106 [ACU]) 8.501910e+07\n", " Equity(110 [RAMP]) 2.079641e+09\n", " Equity(112 [ACY]) 1.480530e+07\n", " Equity(114 [ADBE]) 5.090425e+10\n", " Equity(117 [AEY]) 1.793760e+07\n", " Equity(122 [ADI]) 2.237935e+10\n", " Equity(128 [ADM]) 2.626700e+10\n", " Equity(149 [ADX]) NaN\n", " Equity(153 [AE]) 1.672277e+08\n", " Equity(154 [AEM]) 9.434941e+09\n", " Equity(157 [AEG]) 1.166367e+10\n", " Equity(161 [AEP]) 3.095816e+10\n", "... ...\n", " Equity(50534 [HGV]) NaN\n", " Equity(50535 [PK]) NaN\n", " Equity(50537 [WRD]) 1.734876e+09\n", " Equity(50539 [TIG]) 2.339749e+09\n", " Equity(50540 [TRVG]) 2.762639e+09\n", " Equity(50541 [KEY_PRI]) NaN\n", " Equity(50542 [JHMD]) NaN\n", " Equity(50543 [COWZ]) NaN\n", " Equity(50544 [KEG]) 2.618865e+07\n", " Equity(50546 [NURE]) NaN\n", " Equity(50547 [YTRA]) 3.297637e+08\n", " Equity(50548 [PHIO_W]) NaN\n", " Equity(50549 [BMLP]) NaN\n", " Equity(50550 [WBIY]) NaN\n", " Equity(50552 [FIV]) NaN\n", " Equity(50554 [HEBT]) 8.415000e+07\n", " Equity(50555 [UUUU_WS]) NaN\n", " Equity(50556 [SAB_CL]) NaN\n", " Equity(50558 [INFR]) NaN\n", " Equity(50559 [VVPR]) 5.894486e+07\n", " Equity(50560 [XK]) NaN\n", " Equity(50561 [XE]) NaN\n", " Equity(50562 [XH]) NaN\n", " Equity(50563 [XM]) NaN\n", " Equity(50564 [XD]) NaN\n", " Equity(50565 [XI]) NaN\n", " Equity(50566 [XU]) NaN\n", " Equity(50567 [XF]) NaN\n", " Equity(50568 [XS]) NaN\n", " Equity(50569 [OUSM]) NaN\n", "\n", "[8356 rows x 1 columns]" ] }, "execution_count": 82, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results" ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [], "source": [ "def make_pipeline():\n", " \n", " my_funds = Fundamentals.market_cap.latest\n", " \n", " # Entreprises d'une valeur de 500 milliards ou plus ;)\n", " cap_filter = my_funds > 500000000000\n", " \n", " return Pipeline(columns={'Market Cap':my_funds},\n", " screen = cap_filter)" ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "Pipeline Execution Time: 0.12 Seconds" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "results = run_pipeline(make_pipeline(),'2017-01-03','2017-01-03')" ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Market Cap
2017-01-03 00:00:00+00:00Equity(24 [AAPL])6.175885e+11
Equity(26578 [GOOG_L])5.461871e+11
Equity(46631 [GOOG])5.319681e+11
\n", "
" ], "text/plain": [ " Market Cap\n", "2017-01-03 00:00:00+00:00 Equity(24 [AAPL]) 6.175885e+11\n", " Equity(26578 [GOOG_L]) 5.461871e+11\n", " Equity(46631 [GOOG]) 5.319681e+11" ] }, "execution_count": 85, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Masques\n", "\n", "Parfois, nous voulons ignorer certains atouts lors du calcul des expressions des pipelines. Il y a deux cas courants où il est utile d'ignorer des actifs :\n", "* Nous voulons calculer une expression qui est coûteuse en termes de calcul, et nous savons que nous ne nous soucions que des résultats pour certains actifs.\n", "* Nous voulons calculer une expression qui effectue des comparaisons entre des actifs, mais nous voulons que ces comparaisons soient effectuées uniquement par rapport à un sous-ensemble de tous les actifs. " ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [], "source": [ "def make_pipeline():\n", " \n", " # Créer d'abord les masques pour les filtres\n", " latest_close = USEquityPricing.close.latest\n", " small_price = latest_close < 5\n", " \n", " # Passer dans le masque\n", " mean_close_10 = SimpleMovingAverage(inputs=[USEquityPricing.close],window_length=10,mask=small_price)\n", " mean_close_30 = SimpleMovingAverage(inputs=[USEquityPricing.close],window_length=30,mask=small_price)\n", " \n", " \n", " percent_difference = (mean_close_10-mean_close_30) / mean_close_30\n", " \n", " perc_diff_check = percent_difference > 0 \n", " \n", " \n", " final_filter = perc_diff_check\n", " \n", " return Pipeline(columns={\n", " 'Percent Difference':percent_difference,\n", " '30 Day Mean Close':mean_close_30,\n", " 'Latest Close':latest_close,\n", " 'Positive Percent Diff': perc_diff_check},\n", " screen=final_filter)" ] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "Pipeline Execution Time: 0.42 Seconds" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
30 Day Mean CloseLatest ClosePercent DifferencePositive Percent Diff
2017-01-03 00:00:00+00:00Equity(535 [ARTW])3.0977783.400.013271True
Equity(677 [AXAS])2.2653332.560.145527True
Equity(1144 [LCTX])3.5311673.620.065795True
Equity(1323 [CAW])2.5413332.600.016002True
Equity(1546 [CIF])2.5003702.570.015579True
\n", "
" ], "text/plain": [ " 30 Day Mean Close \\\n", "2017-01-03 00:00:00+00:00 Equity(535 [ARTW]) 3.097778 \n", " Equity(677 [AXAS]) 2.265333 \n", " Equity(1144 [LCTX]) 3.531167 \n", " Equity(1323 [CAW]) 2.541333 \n", " Equity(1546 [CIF]) 2.500370 \n", "\n", " Latest Close \\\n", "2017-01-03 00:00:00+00:00 Equity(535 [ARTW]) 3.40 \n", " Equity(677 [AXAS]) 2.56 \n", " Equity(1144 [LCTX]) 3.62 \n", " Equity(1323 [CAW]) 2.60 \n", " Equity(1546 [CIF]) 2.57 \n", "\n", " Percent Difference \\\n", "2017-01-03 00:00:00+00:00 Equity(535 [ARTW]) 0.013271 \n", " Equity(677 [AXAS]) 0.145527 \n", " Equity(1144 [LCTX]) 0.065795 \n", " Equity(1323 [CAW]) 0.016002 \n", " Equity(1546 [CIF]) 0.015579 \n", "\n", " Positive Percent Diff \n", "2017-01-03 00:00:00+00:00 Equity(535 [ARTW]) True \n", " Equity(677 [AXAS]) True \n", " Equity(1144 [LCTX]) True \n", " Equity(1323 [CAW]) True \n", " Equity(1546 [CIF]) True " ] }, "execution_count": 87, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results = run_pipeline(make_pipeline(),'2017-01-01','2017-01-01')\n", "results.head()" ] }, { "cell_type": "code", "execution_count": 88, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "391" ] }, "execution_count": 88, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(results)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Classificateurs\n", "\n", "Un classificateur est une fonction d'un actif et d'un moment dans le temps à une sortie catégorielle telle qu'une chaîne de caractères ou un label d'entier." ] }, { "cell_type": "code", "execution_count": 89, "metadata": {}, "outputs": [], "source": [ "from quantopian.pipeline.data import morningstar\n", "from quantopian.pipeline.classifiers.morningstar import Sector" ] }, { "cell_type": "code", "execution_count": 90, "metadata": {}, "outputs": [], "source": [ "morningstar_sector = Sector()" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [], "source": [ "exchange = morningstar.share_class_reference.exchange_id.latest" ] }, { "cell_type": "code", "execution_count": 92, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Latest([share_class_reference.exchange_id], 1)" ] }, "execution_count": 92, "metadata": {}, "output_type": "execute_result" } ], "source": [ "exchange" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Méthodes Classificateur\n", "\n", "* eq (equals)\n", "* isnull\n", "* startswith" ] }, { "cell_type": "code", "execution_count": 93, "metadata": {}, "outputs": [], "source": [ "nyse_filter = exchange.eq('NYS')" ] }, { "cell_type": "code", "execution_count": 94, "metadata": {}, "outputs": [], "source": [ "def make_pipeline():\n", " \n", " # Créer d'abord les masques pour les filtres\n", " latest_close = USEquityPricing.close.latest\n", " small_price = latest_close < 5\n", " \n", " # Classificateur\n", " nyse_filter = exchange.eq('NYS')\n", " \n", " # passer dans le masque\n", " mean_close_10 = SimpleMovingAverage(inputs=[USEquityPricing.close],window_length=10,mask=small_price)\n", " mean_close_30 = SimpleMovingAverage(inputs=[USEquityPricing.close],window_length=30,mask=small_price)\n", " \n", " \n", " percent_difference = (mean_close_10-mean_close_30) / mean_close_30\n", " \n", " perc_diff_check = percent_difference > 0 \n", " \n", " \n", " final_filter = perc_diff_check & nyse_filter\n", " \n", " return Pipeline(columns={\n", " 'Percent Difference':percent_difference,\n", " '30 Day Mean Close':mean_close_30,\n", " 'Latest Close':latest_close,\n", " 'Positive Percent Diff': perc_diff_check},\n", " screen=final_filter)" ] }, { "cell_type": "code", "execution_count": 95, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "Pipeline Execution Time: 1.07 Seconds" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
30 Day Mean CloseLatest ClosePercent DifferencePositive Percent Diff
2017-01-03 00:00:00+00:00Equity(2586 [EQS])1.9605332.0200.022120True
Equity(3265 [GLF])1.5763671.7250.162420True
Equity(3645 [HOV])2.4066672.7350.176939True
Equity(4577 [LUB])4.2923334.2700.004116True
Equity(4971 [RT])3.2440003.2400.009094True
\n", "
" ], "text/plain": [ " 30 Day Mean Close Latest Close \\\n", "2017-01-03 00:00:00+00:00 Equity(2586 [EQS]) 1.960533 2.020 \n", " Equity(3265 [GLF]) 1.576367 1.725 \n", " Equity(3645 [HOV]) 2.406667 2.735 \n", " Equity(4577 [LUB]) 4.292333 4.270 \n", " Equity(4971 [RT]) 3.244000 3.240 \n", "\n", " Percent Difference \\\n", "2017-01-03 00:00:00+00:00 Equity(2586 [EQS]) 0.022120 \n", " Equity(3265 [GLF]) 0.162420 \n", " Equity(3645 [HOV]) 0.176939 \n", " Equity(4577 [LUB]) 0.004116 \n", " Equity(4971 [RT]) 0.009094 \n", "\n", " Positive Percent Diff \n", "2017-01-03 00:00:00+00:00 Equity(2586 [EQS]) True \n", " Equity(3265 [GLF]) True \n", " Equity(3645 [HOV]) True \n", " Equity(4577 [LUB]) True \n", " Equity(4971 [RT]) True " ] }, "execution_count": 95, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results = run_pipeline(make_pipeline(),'2017-01-01','2017-01-01')\n", "results.head()" ] }, { "cell_type": "code", "execution_count": 96, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "66" ] }, "execution_count": 96, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(results)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Pipelines dans l'IDE Quantopian" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from quantopian.pipeline import Pipeline\n", "from quantopian.algorithm import attach_pipeline, pipeline_output\n", "\n", "def initialize(context):\n", " my_pipe = make_pipeline()\n", " attach_pipeline(my_pipe, 'my_pipeline')\n", "\n", "def make_pipeline():\n", " return Pipeline()\n", "\n", "def before_trading_start(context, data):\n", " # Stocker les résultats de notre pipeline DataFrame dans la variable context.\n", " context.output = pipeline_output('my_pipeline')" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3.5", "language": "python", "name": "py35" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.9" } }, "nbformat": 4, "nbformat_minor": 2 }