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.







Newsletter

Vous voulez suivre ce blog ?

Saisissez votre adresse email :

Flux RSS