python-pour-finance/10-Plateforme-Quantopian/05-Solutions-Exercice-Algor...

93 lines
3.9 KiB
Plaintext
Raw Normal View History

2023-08-21 15:12:19 +00:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Solutions Exercice Algorithme Trading\n",
"\n",
"**Il s'agit d'un exercice extrêmement ouvert et il existe de nombreuses façons de le faire ! N'hésitez pas à passer directement aux solutions pour le traiter comme un exemple de code. Si vous tentez l'exercice, ne vous attendez pas à ce que l'exemple de solution corresponde exactement à votre solution. Vous avez peut-être obtenu de bien meilleurs résultats (ou de bien moins bons résultats) !**\n",
"\n",
"## Votre Tâche\n",
"\n",
"Votre responsable veut savoir si [les Bandes de Bollinger](https://fr.wikipedia.org/wiki/Bandes_de_Bollinger) sont toujours une stratégie d'analyse technique significative à eux seuls. Pour cet exercice, vous allez tester l'action *Johnson and Johnson* sid(4151). Plus précisément, votre gestionnaire a décidé qu'il veut que 100 % du portefeuille soit en position longue lorsque le prix de l'action est inférieur à 2 fois l'écart-type glissant sur 20 jours soustrait de la moyenne mobile sur 20 jours, et qu'il soit en position courte à 100 % du portefeuille sur cette action lorsque le prix actuel est supérieur à 2 fois l'écart-type glissant sur 20 jours ajouté à la moyenne mobile sur 20 jours. La vérification de cet événement signal ne doit avoir lieu qu'une fois par jour. C'est probablement une stratégie très déraisonnable, mais le point essentiel est d'exercer votre capacité à écrire des algorithmes de backtest avec Quantopian.\n",
"\n",
"## Fenêtre de Temps\n",
"\n",
"Vous devriez utiliser le calendrier suivant pour cet exercice (afin d'avoir au moins une comparaison raisonnable avec les solutions, mais n'hésitez pas à vous amuser avec ça !) - N'oubliez pas, peu importe les dates, on est en phase d'apprentissage :)\n",
"\n",
"#### BACKTEST START: Jul-20-2014\n",
"#### BACKTEST END: Jul-20-2017"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Définir nos variables\n",
"def initialize(context):\n",
" context.jj = sid(4151)\n",
"\n",
" schedule_function(check_bands,date_rules.every_day())\n",
" \n",
"def check_bands(context, data):\n",
" \n",
" cur_price = data.current(context.jj,'price')\n",
" \n",
" # Charger les données historiques pour les actions\n",
" prices = data.history(context.jj,'price', 20 , '1d')\n",
" \n",
" avg = prices.mean()\n",
" std = prices.std()\n",
" lower_band = avg - 2*std\n",
" upper_band = avg + 2*std\n",
" \n",
" if cur_price <= lower_band:\n",
" order_target_percent(context.jj, 1.0)\n",
" print('Achat')\n",
" print('Le prix actuel est: ' + str(cur_price))\n",
" print(\"La bande inférieure est: \"+str(lower_band))\n",
" \n",
" \n",
" elif cur_price >= upper_band:\n",
" order_target_percent(context.jj, -1.0)\n",
" print('Vente à découvert')\n",
" print('Le prix actuel est: ' + str(cur_price))\n",
" print(\"La bande supérieur est: \"+str(upper_band))\n",
" else:\n",
" pass\n",
" \n",
" record(upper=upper_band,\n",
" lower=lower_band,\n",
" mvag_20=avg,\n",
" price=cur_price)"
]
}
],
"metadata": {
"anaconda-cloud": {},
"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": 1
}