samedi 25 mars 2017

Keras 2.0: Suppression des NN MaxoutDense et Highway

Keras 2.0 Keras 2.0: Une bonne nouvelle ?

Notre ami frenchy François Chollet, vient de publier a version 2.0 du framework de deep learning keras.

Vous pouvez l'installer simplement mais pour les utilisateurs avancés, cette version reserve une mauvaise surprise, les layers Highway et MaxoutDense sont supprimés

Les sources de ces layers sont toujours disponibles, mais leur maintenance n'est plus assurée. C'est dommage parce que ces outils donnaient accès au pékin moyen à des travaux de recherche récents et prometteurs (. J'utilise pour ma part ces deux Layers et je pense qu'ils peuvent servir au plus grand nombre, alors pourquoi les supprimer ? Petit tour de ces deux essentiels.

Highway networks

Les Highway networks sont des réseaux qui tirent parti des avancées sur les réseaux récurrents à mémoire longue (LTSM) pour résoudre le problème des vanishing gradients sur des réseaux qui affectent les architectures avec de nombreux niveaux.

On connait depuis longtemps le résultat théorique qu'un réseau de neurones peut approximer n'importe quelle fonction, mais cette propriété théorique occulte le fait que les réseaux plus profonds convergent plus rapidement, et surtout qu'ils ont un pouvoir de généralisation beaucoup plus fort. Avoir la possibilité d'étendre son réseau sans encourir de pénalité est donc primordial, et la décision de Keras de reléguer cette fonctionnalité à la marge est surprenante.

En python avec keras, on avait le code suivant:
def get_Highway_model(l, n_highway=4):
    model = Sequential()
    model.add(Dense(3 * l, input_dim=l))
    model.add(Dropout(0.2))
    for i in range(n_highway):
        model.add(Highway())
        model.add(Dropout(0.2))
    model.add(Dense(1))
    model.compile(loss='mse', optimizer='rmsprop')
    return model

Max out Networks

Les Max Out networks sont une extension de la technique du Drop Out, une technique de régularisation des poids qui réduit effectivement le degré d'overfitting associé à une optimisation.

Les Maxout networks peuvent être assimilé à un moyennage de modèle, plusieurs versions d'un même réseau contribuant au résultat final.

def get_MaxOut_model(l):
    model = Sequential()
    model.add(MaxoutDense(3 * l, input_dim=l))
    model.add(Dropout(0.2))
    model.add(MaxoutDense(3 * l))
    model.add(Dropout(0.2))
    model.add(Dense(1))
    model.compile(loss='mse', optimizer='rmsprop')
    return model

Je suis en train  d’essayer de combiner ces deux layers... Mais pour l'instant, pas question de passer à la version 2.0 de Keras.

jeudi 23 mars 2017

Liens : superbe infographie de stitchfix

allez jeter un coup d'oeuil à Stitchfix. Vraiment.

mercredi 8 mars 2017

Backtests: determiner l'univers des solutions

algorithme de trading overfitting
Lorsque l'on se lance dans la réalisation d'un algorithme de trading, la première étape est de procéder à un backtest. Un backtest est un programme qui permet de simuler le comportement qu'un algorithme aurait eu dans le passé. Un backtest permet de répondre à al question: si j'avais fait tourner mon algorithme en 2016, en 2015 ou en 2008, que m'aurais-t-il apporté ?

Note: J'utilise le framework PyalgoTrade pour exécuter mes backtests.

Lorsque on souhaite optimiser un algorithme, il est tentant de le construire en maximisant le rendement des backtests sur la période d’intérêt. Mais attention, si la performance d'un backtest est indicative, il est déconseillé de choisir des paramètres uniquement selon ce critère, car en se faisant on adapte son algorithme à une période dans le passé sans le préparer pour les conditions qui prévaudrons dans le futur. On parle d'overfitting.

Il est souvent conseillé de procéder à des cross-validations pour éviter cet écueil. Mais avant d'en arriver là, il y a un test qui est rarement évoqué, qui consiste à comparer le backtest de l'algorithme avec un backtest complétement aléatoire, et inversement de comparer l'algorithme avec un algorithme qui aurait une connaissance parfaite et absolue du futur.

Ces deux tests sont purement théoriques, mais ils permettent de répondre aux questions suivantes:
  • Quelle est la performance maximale théorique avec les contraintes et modalités (fréquence, nombre d'actifs évalués, nombre d'actifs détenus, stop loss, coût de transaction...) de mon algorithme ?
  • Comment mon algorithme se compare avec un algorithme similaire mais qui choisit ses trades complétement au hasard ?

Résultat du test avec mon algorithme de trading


Je m'attache à tester la performance absolue et théorique d'un algorithme de trading qui suit les modalités suivantes:
  • Sélectionne tous les mois à date fixe 3 etf parmi 15 alternatives.
  • Les trois titres sont équi-pondérés et sont détenus pendant un mois complet date à date.
  • Cet algorithme est testé pendant 4 ans roulants de 2013 à 2017.
Selon ces modalités, un algorithme qui aurait une connaissance parfaite et absolue du future aurait la performance suivante:

backtest etf performance absolue
Ce dispositif hypothétique aurait multiplié par 19 fois (oui fois +1 800%) soit 109% par an. On est très clairement dans une croissance exponentielle.

Et inversent sur une cinquantaine de tests d'algorithmes aléatoires, on mesure une moyenne de performance de 38% en 4 ans. Pour donner une idée de ce que cela représente, un algorithme aléatoire aurait rapporté plus qu'un buy & hold sur le CAC 40.

Cette performance des algorithme totalement naifs est particulièrement surprenante. Actuellement d'ailleurs, la meilleure performance que j'ai obtenue sur un backtest est inférieure au meilleur résultat aléatoire que j'ai obtenu. Mon meilleur algorithme se situe à peine dans le 97eme percentile des résultats aléatoires

De manière générale, Ceci illustre deux points importants:
  • Il est très difficile au sens statistique de distinguer entre un résultat obtenu par chance et un résultat construit par une méthode. Il est facile de contruire des solutions aléatoires qui battent sur des intervalles restreint des solutions basés sur un raisonnement statistique de machine learning.
  • Il est vraisemblablement impossible de se rapprocher de la performance de l'algorithme omniscient. Ceci illustre le fait que dan la plupart des cas, les algorithme basé sur des raisonnements statistiques reposent sur des probabilités s'éloignant seulement très légèrement d'un jeté de dés. Au lieu de gagner 50% du temps, on gagne 51% du temps, et c'est de ce minsuscule 'edge' que l'on doit tirer parti. 

samedi 4 mars 2017

Mesure de la performance d'un algorithme de Machine learning pour le trading (partie 1/2)

neural network
La section qui va suivre est basée sur l'ouvrage de référence, Elements of Statistical Learning (PDF) de Hastie, Tibshirani & Friedman. 

Lorsque 'on essaie de prédire une série financière Y à partir d'un vecteur X=( (X1)t,..,(XN)t) de prédicteurs, le problème se réduit à déterminer une fonction f telle que:
Optimiation target, regression des prédiceurs
Le terme ε représente la part aléatoire du problème, il s'agit d'une variable aléatoire réelle d'espérance 0 et indépendante de X.  Dans le cas des séries financières de marché, il est prudent de supposer que ε n'est pas normale et exhibe skew (asymétrie) et une kurtosis (kurtoleptique).

La fonction f représente la partie déterministe des fluctuations de notre variable d’intérêt Y dont la variance peut être expliquée par notre algorithme de Machine learning. Cette fonction f n'est pas paramétrique, et n'est probablement pas exploitable si on la réduit à une fonction linéaire.

Dans les séries financières, l’expérience montre qu'une faible partie des fluctuations de Y peut être expliquée par notre fonction déterministe (voir aussi la performance de cette compétition kaggle). Dans la pratique, la prédiction des séries financières est rendu difficile pour au minimum les raisons suivantes:
  • Les prédicteurs sont tous très faibles quand ils sont pris individuellement.
  • Obtenir une relation générale à partir de données historiques est difficile car le bruit ε obscurcit la définition de notre fonction f.
  • Il est probablement nécessaire de combiner un nombre important de prédicteurs pour obtenir un pronostic de qualité ce qui réduit l’efficacité des algorithme de ML pour cause de malédiction de haute dimensionnalité
  • Les marchés financiers sont sujets à des changements de régimes, et les relation statistiques historiques peuvent disparaitre suite à des changements de cycles économique ou sociétaux.

Obtenir une Prédiction Exploitable

Un algorithme de trading utilisant le machine learning disposant de donnée de marché de qualité doit  pouvoir surmonter ces obstacles. Pour être exploitable dans la pratique, cet algorithme doit pouvoir donner un score à un ensemble d'actifs, pour permettre de sélectionner une allocation d'actif (comme celui-ci. Par exemple dans mon cas:

algorithme de prédiction d'ETF

Ici, chaque barre représente une score du rendement probable dans 20 jours de chaque actif en date du 03 mars 2017. Le meilleur score correspond à la meilleure espérance de gain. Si on veut interpréter cet algorithme, on voit qu'il recommande recommande d'investir sur les indices d'actions américains et émergents à l'exclusion de ceux dont l'économie dépend du secteur énergétique. Dans la pratique, toutes les prédictions ci-dessus ne sont pas exploitables. Notamment celles qui sont trop proches de 0 ne permettent pas d'avoir une marge de sécurité assez importante et doivent être donc ignorées. Les prédictions en dessous d'un certain seuil T sont considérées comme du bruit. Par exemple, on peut placer ce seuil à 4%, et ne passer un ordre d'achat que sur les deux meilleurs scores produit par l'algorithme (ici un GRU keras).

Dans la pratique, cet algorithme s'éloigne parfois très sensiblement des rendements réalisés historiquement:
prediction keras algorithme rendement

Ce qui nous amène au sujet de ce post: Une fois la prédiction réalisée, comment s'assurer qu'elle est exploitable ou à jeter ?

Les ouvrages de référence mentionnent bien sur plusieurs mesures de la précision d'un algorithme. Elles sont basées sur l'erreur quadratique moyenne  comme le coefficient de détermination R2 ou sur l'erreur absolue.

Mais elles sont difficiles à appliquer sur des séries financières à cause de leur forte composante aléatoire. Pour être concret, j'ai noté que lorsqu'on soumet des séries financières à un algorithme d'apprentissage (SVM, Gadient Boosting, NN, RNN, Random Forest,etc), les algorithmes ont tendances à converger vers une solution naïve qui est la moyenne des échantillons proposés à l'algorithme (pour les séries financières, souvent E(Y) tend vers  0...). Cette solution naïve a tendance à dominer d'autres solutions proposées par les algorithmes d'apprentissage quand on utilise les mesures d'erreur quadratiques, alors même que cette solution naïve n'a aucune valeur dans le cadre d'un algorithme d'allocation dynamique d'actif. Il existe pourtant d'autres mesures utilisées pour les problèmes de classification qui permettent  de surmonter ce problème.

Considérons un algorithme qui tous les mois fait une prédiction sur les actifs qui vont surperformer sur le mois suivant. Dans ce cas, comme on l'a dit plus haut, on exploitera pas les prédictions dont la valeur absolue est inférieure à un seuil arbitraire T correspondant à une marge de sécurité. Si par ailleurs, notre algorithme est long-only, les prédictions inférieures à notre seuil T ne devraient pas compter dans notre mesure d'erreur. Par exemple, si mon algorithme me produit un score -6% pour un actifs, je suis certain de ne pas investir sur ce titre. Si cet actif perd lors du mois suivant, -12% u -20% importe peu: Comme cet actif n'est pas investi, il ne contribue pas à notre résultat le mois suivant. Il y a donc une asymétrie qui doit nous permettre, si on l'exploite, de sélectionner des algorithmes qui ne convergent pas vers la moyenne arithmétique.

On veut comptabiliser toutes les prédictions dont le score est supérieur à T et qui se concrétise pas un investissement de rendement positif. Les prédictions supérieures à T qui aboutissent à un rendement négatif seront comptabilisées au détriment de la mesure précédente. Il existe des mesures pour atteindre cet objectif :le ROC.

Je détaillerai la semaine prochaine mes expérimentations sur ce sujet.







samedi 25 février 2017

Une introduction au deep learning pour le trading algorithmique


Une excellente introduction au sujet précéden par Siraj Raval:

Trading Algorithmique: retour d'expérience.

Trading algorithmique

Ce que je fais ces derniers temps

Ce blog est à l'abandon depuis un bout de temps. Il a néanmoins depuis sa création servi 280 000 pages, ce qui est une goutte d'eau dans l'océan du trafic internet mondial.

Je n'ai toutefois pas été totalement inactif pendant tout ce temps. Ces derniers temps, j'ai investi beaucoup de temps dans l'exploration du trading algorithmique dans un premier temps, et du machine learning par la suite.

On ne peut pas aborder ce sujet sans rentrer de pied ferme dans la technique. Le machine learning s'est relativement peu développé dans les environnements techniques les plus établis comme Java ou C++. Très rapidement les chercheurs ont favorisé des environnements techniques dédiés comme R, Python, Torch (lua) ou Julia. J'utilise pour ma part python, dont j'aime la facilité d’accès et la polyvalence, même si R offre plus de librairies statistiques et que Torch offre un meilleur support pour le deep learning.

Dans un premier temps, j'ai juste construit des automates de trading basés sur le momentum ou le trend. Dans cette phase, j'ai vraiment apprécié la plateforme quantopian. Elle offre des outils de back testing, de paper trading en python avec une totale facilité d’accès. Le seul pré-requis est de s'initier un minimum au python.

quantopian backtest
Les forums d'utilisateurs sont assez limités mais il permettent quand même de se familiariser avec les plus courantes commises par les débutants comme l'overfitting (voir le screeenshot ci-dessus pour une illustration.

Monter son propre système

La plateforme quantopian montre toutefois quelques limitations. Tout d'abord elle ne permet pas de trader des actifs européens (devises, obligations, actions, etfs,etc). Ensuite elle place des limites sur les outils accessible depuis la plateforme. Or, j'ai je l'avoue succombé à la hype du deep learning et des réseaux de neurones (en anglais neural network i.e: NN).  Impossible avec quantopian, d'autant plus que les capacités de calcul des serveurs distants sont limités pour des raisons évidentes.

Quand on parle de système de trading algorithmmique, on pense souvent immédiatement au haute fréquence, sur des serveurs en mode cloud, mais il n'y a aucun mal à mettre en place des systèmes beaucoup moins élaborés

A ce stade, mon système est essentiellement un système d'aide à  la décision pour  un investissement sur un horizon 1 mois. Il se présente sous la forme d'un outil graphique que j'appelle un dashboard, qui liste les options disponibles dans le cadre d'un système d'allocation d'actif stratégique. A tout moment cet outil peut me recommander sur quel actif allouer mes fonds.

Pour être plus précis, cet outil utilise le machine learning pour prédire à un horizon donné le rendement simple d'un investissement sur un actif donné. Plusieurs prédictions pour différents actifs sont mis en rapport pour sélectionner l'actif le plus pertinent.

Les données que j'utilise sont des données de clôture journaliers (Ouverture, plus haut, plus bas, volume, clôture ) et des indicateurs économiques issus de la banque fédérale américaine (VIX, Dividend yield, TED spread,...) ou de Quandl (EUR/USD).

A partir des données, je procède aux étapes suivantes:
  • Feature engineering: Je construit des indicateurs techniques et statistiques sur mes données: momentum, RSI, volatilité, ATR en utilisant la librairie TA-Lib. Je construit une cinquantaine d'indicateurs sur un historique qui démarre en 2005.
  • Normalization/scaling: Pour les NN, il est absolument impératifs de nettoyer (retirer les nan) et de  normaliser (moyenne à 0, ecart-type à 1.0) toutes les données.
  • Feature selection: Toutes les prédicteurs ne s'appliquent pas à tous les actifs. Chaque actif dépend d'un sous-ensemble des données, en mettre trop dégrade les performances. Il faut mettre en place un processus de selection des données significatives. J'utilise scikit-learn pour cette étape. J'utilise l'outil RFECV: Recursive Feature Elimination with Cross Validation avec un estimateur Extra-Trees. Je le combine avec un sélecteur de stabilité appelé Randomized Lasso. Enfin, je filtre ces sélections en utilisant un algorithme greedy basé sur les NN.
  • Je définis mon algorithme de machine learning. Pour l'instant, j'utilise la librairie Keras pour ce processus. J'utilise actuellement une Gated Recurrent Unit (GRU) avec dropout pour produire mes prédictions. Les NN récurrents sont particulièrement adaptés à la tâche que je leur assigne car ils capturent les dépendances temporelles. Chaque prédiction dépend de la prédiction précédente, ce qui des avantages et des inconvénients.
  • Cross validation: Je divise mon espace de données en intervalles imbriqués avec sklearn TimeSeriesSplit CV et je mesure des indicateurs de performance de régression comme le R2 ou en réduisant mes données à deux classes un ROC AUC.
  • Finalement, Je backtest mon outil avec la librairie PyalgoTrade. Le rendement annuel offert par un backtest ne représente rien, il permet seulement de sélectionner des alternatives.
 Voila, c'est tout pour aujourd’hui. Si je poursuis mon effort, mon éventuel prochain post sera sur la métrique que j'ai mis en place pour juger de la pertinence de mon approche.





lundi 15 juin 2015

Loi Alur et encadrement des loyers parisiens: une loi grossiére et crétine

Zonage loi alur encadrement des loyers
C'est arrivé ce vendredi, de manière discrète, le texte d'application de loi ALUR relatif à l'encadrement des loyers dans Paris intra-muros a été publié au journal officiel. Un zonage a été proposé par l'OLAP (voir image ci-dessus) et les loyers médians applicables sont aussi disponibles.

Nous allons montrer que cette loi est formidablement inadaptée à ses objectifs. Notre raisonnement tient en quelques lignes. J'en donne ici le résumé que je vais développer par la suite:

Suite à cette loi, les loyers vont être abaissés artificiellement de 20% dans paris intra-muros. Voyant leur rendement s'établir dans le négatif, les bailleurs vont déserter le marché de la location dans Paris. Aucun nouveau bail ne sera signé et le stock de biens locatifs va être vendu en masse, entrainant une baisse des prix de ventes. Cette baisse se propagera par contagion à la petite et à la grande couronne.
Voyant les prix baisser, les primo-accédants vont se retrouver seul sur le marché et vont enfin pouvoir envisager un achat, ce qui va réduire la part des logements voués à la location. En conséquence, le nombre de biens à la location dans Paris va se réduire, les postulants seront plus nombreux, et seuls les meilleurs dossiers trouveront une location, laissant les locataires pauvres qui étaient censés être les bénéficiaires de cette loi dans la mouise. CQFD.

En quoi ce dispositif aura-t-il contribué à réduire les inégalités sociales ? Pourquoi choisir Paris alors que les vraies inégalités sociales sont dans la grande couronne ? Faut-il pour résoudre le problème du logement en France mettre en concurrence sur la même zone limitée les foyers les plus riches et les plus pauvres ?

jeudi 11 juin 2015

Value at risk vs Expected Shortfall

VaR vs expected shortfall


Pourquoi le risque est-il si dur à mesurer ?


Jon Danielson et Chen Zhou de la London School of Economics viennent de publier en avril 2015 un white paper intitulé : Why risk is so hard to measure? qui remet en cause les idées préconçues sur la value-at-risk (VaR) et l'Expected Shortfall (ES). Contrairement à l'idée reçue, les auteurs tentent de démontrer que l'expected Shortfall n'est pas une meilleur mesure du risque que la VaR. Nous allons détailler les grands points de leur démonstration après avoir posé quelques définitions.

Rappelons que cet article s’inscrit dans une série sur les  mesures du risque financier:
- Introduction à la VaR
- Production de l'indicateur de VaR
- Risque de contrepartie: EEPE
- la CVA


Newsletter

Vous voulez suivre ce blog ?

Saisissez votre adresse email :

Flux RSS