9
votes

Calculer une série de retour composé en python

Salutations Toutes, j'ai deux séries de données: prix quotidien des actions de stock cru (flotteurs positifs ou négatifs) et des signaux commerciaux (Achetez = 1, Vendre = -1, pas de commerce = 0).

Le prix de prix brut Sont simplement le journal du prix d'aujourd'hui divisé par le prix d'hier: p> xxx pré>

exemple: p> xxx pré>

la série de signaux commerciaux comme ceci: p> xxx pré>

pour obtenir les rendements quotidiens en fonction des signaux commerciaux: p> xxx pré>

Ces rendements quotidiens pourraient ressembler à Ceci: p>

[0.0, 0.0, 0.0023, 0.0, 0.0, -0.0024, 0.0031, 0.0] # (notice the 0s)


6 commentaires

@ strimp099: Ce type de compréhensions commence facilement à regarder un désordre. Puis-je suggérer des outils plus appropriés, tels que scipy.org . Merci


@aix La méthode que j'ai besoin d'utiliser est ((1 + [I] [I]) * (1 + composé [I-1])) - 1. L'objectif final est de créer un parcelle des rendements cumulatifs composés. La méthode que vous mentionnez est juste que: des retours simples cumulatifs - il n'inclut pas les retours précédents (c'est-à-dire des retours ne sont pas réinvestis)


@eat je ne suis pas sûr de ce que tu veux dire ...


@ strimp099: juste qu'il existe des packages dans Python comme SCIPY \ NUMPY Pour gérer ce type de calcul des calculs très simples. Si vous travaillez sérieusement avec ce type de série, je vous recommanderai simplement de connaître des moyens «plus avancés» de les gérer que «cru» python . Merci


@eat oh je vois. J'ai examiné les paquets scieurs et numpus et source pour une méthode pour ce calcul. NUMPY a le forfait financier mais n'inclut pas une méthode de calcul de la série de revenus composée (au moins ce que je pouvais trouver).


@ strimp099: C'est bien d'entendre que vous êtes au courant de scipy \ numpy . Si quelque chose dont vous avez besoin n'existe pas, vous serez toujours libre d'implémenter (pièces manquantes) en fonction de vos propres besoins, mais d'utiliser des types de données plus raisonnables que ce que «RAW ' Python peut fournir. Vous pouvez étiqueter et modifier votre question pour indiquer que les solutions SCIPY \ NUMPY sont également éligibles. Merci


3 Réponses :


8
votes

Il y a un module fantastique appelé Pandas qui a été écrit par un gars à AQR (un fonds de couverture) qui Excels à des calculs comme celui-ci ... Ce dont vous avez besoin est un moyen de gérer des "données manquantes" ... comme une personne mentionnée ci-dessus, les bases utilisent les capacités NAN (pas un nombre) de Scipy ou NUMPY; Cependant, même ces bibliothèques ne font pas de calculs financiers qui sont beaucoup plus faciles ... Si vous utilisez des pandas, vous pouvez marquer les données que vous ne souhaitez pas considérer comme nan code>, puis les calculs futurs seront Rejeterez-le, tout en effectuant des opérations normales sur d'autres données.

J'ai utilisé Pandas sur ma plate-forme de trading pour Environ 8 mois ... j'aimerais avoir commencé à l'utiliser plus tôt. P>

WES (l'auteur) a donné une conversation sur Pycon 2010 sur les capacités du module ... Voir les diapositives et la vidéo sur la page Web PYCON 2010 . Dans cette vidéo, il démontre comment obtenir des retours quotidiens, exécuter 1000 minutes de régressions linéaires sur une matrice de retours (en une fraction d'une seconde), des données d'horodatage / graphique ... tout fait avec ce module. Combiné avec PSYCO, il s'agit d'une bête d'un outil d'analyse financière. P>

L'autre grande chose qu'il gère est des données transversales ... de sorte que vous puissiez saisir des prix rapprochés quotidiens, leurs moyens de roulement, etc. . Puis Timestamp chaque em> Calculez et obtenez tout cela stocké dans quelque chose de similaire à un dictionnaire Python (voir le pandas.dataframe code> classe) ... alors vous accédez aux tranches des données comme simplement comme suit: p> xxx pré>

voir Les Pandas Rolling Moments Doc pour plus d'informations sur le calcul du roulement STDEV (c'est une doublure). P>

WES est sorti de son chemin pour accélérer le module avec Cyron, bien que je concède que je «M envisagez de mettre à niveau mon serveur (un Xeon plus âgé), en raison de mes exigences d'analyse. P>

Modifier pour la question de Strimp: strong> Une fois que vous avez converti votre code pour utiliser des structures de données Pandas, il n'est toujours pas clair pour moi comment vous indexez vos données dans un fichier Dataframe Pandas et les exigences de la fonction de composition pour la gestion des données manquantes (ou dans ce domaine des conditions pour un retour de 0,0 ... ou si vous utilisez nan code> en pandas ..). Je démontrerai l'utilisation de mon indexation de données ... une journée a été choisie au hasard ... df code> est un fichier de données avec es-à-tête de cotes à contrats à terme ... indexé par seconde ... Les citations manquantes sont remplies avec numpy.nan code>. Les index de DataFrame sont des objets DateTime CODE>, décalés par les objets de fuseau horaire PYTZ> PYTZ CODE> PYTZ P>

>>> df['fut'].fill(method='pad')/df['fut'].fill(method='pad').shift(600)


10 commentaires

(+1) pour indiquer pandas . Quel type de volumes de données est-il conçu pour gérer? Pourrait-il être utile de manière réaliste sur des barres d'une minute pour 1 000 instruments de plus d'un an (environ 100 000 observations par instrument) ou est-elle conçue pour des trucs de fréquence inférieure?


Je suis grignotant des données de tick sur les contrats à terme d'index (ES, NQ, YM) ... Je résume les données à des intervalles et de processus de faible seconde pendant ... Jusqu'à présent, mes plus grands fichiers de tiques sont ESM10 (S & P 500 Futures) Citations du 6 mai (crash flash), 7 mai et 20 mai de l'année dernière ... Mes simulations (y compris tous les calculs) pour ceux qui courent environ 5 à 10 minutes pour un seul instrument. Mon fichier 6 mai a environ 1,2 million d'entrées de tick individuelles et que le temps de traitement comprend la résumée à des intervalles et plus de 15 analyses différentes par trading-sec. Mon serveur est un cache-noyau de 2Ghz Xeon (512 Ko cache) avec DRAM de 4 Go


Jamais pensé à utiliser des pandas même si je le connaissibles et cela est inclus dans ma distribution de Python (guichet). Je vais lui donner un coup et faire un coup de retour, merci.


@Mike Pennington: à coup sûr pandas est bien plus spécifique au domaine de l'OP. Cependant, IMHO s'il existe encore une fonctionnalité manquante nécessaire, alors de créer une telle fonctionnalité (par vous-même), on peut posséder des chances beaucoup plus élevées de mettre en œuvre une manière compétente si seulement une personne est aussi «assez familière» avec Scipey \ Numpy . Merci


En effet, vous devez être familier avec Numpy pour obtenir le plus grand nombre de pandas, mais je n'ai pas beaucoup trouvé cela nécessite une extension directe ... Pour la plupart, je combine les sorties de diverses méthodes de pandas pour obtenir ce dont j'ai besoin , si ce n'est pas déjà intégré. La plupart de mes problèmes tournent autour de l'optimisation de la vitesse ... que cela a tendance à impliquer davantage de travail avec Cyron que les pandas ou les numpus.


@Mike Pennington: J'ai donc pu convertir facilement mon programme de 1 000 lignes pour utiliser des pandas. Excellent appel ... une idée de la façon dont je pourrais obtenir ma série de retour composé créée? Je pensais utiliser une fonction Lambda dans la méthode d'application de Datamatrix, mais j'ai des défis ... merci


@Strimp ... Voir la modification à ma réponse ci-dessus ... sans savoir plus de détails, le meilleur que je puisse faire est de donner un exemple avec mes données.


@Mike Pennington: Merci, vois mon commentaire.


La vidéo Wes 'est maintenant ici: pyvideo.org/pycon -US-2010 / ...


Crazy C'était ma première intro to pandas. À ce stade, c'était la version 0.03. Je ne peux pas compter combien de lignes de pandas que j'ai écrites depuis. Il y a dix ans, à quel point le temps vole !!



1
votes

Imaginez que j'ai un datamatrix avec des prix de fermeture, une valeur indicatrice et un signal commercial comme celui-ci: xxx pré>

J'utilise le signal pour créer une DataMatrix de retours basé sur le signal commercial: P>

def get_compounded_indicator_cumulative(self):

    indicator_dm = self.get_indicator_returns()
    dates = indicator_dm.index

    indicator_returns = indicator_dm['indicator_returns']
    compounded = array(zeros(size(indicator_returns)))

    compounded[1] = indicator_returns[1]

    for i in range(2, len(indicator_returns)):

        compounded[i] = (1 + compounded[i-1]) * (1 + indicator_returns[i]) - 1

    data = {
        'compounded_returns': compounded
    }

    return DataMatrix(data, index=dates)


3 commentaires

@Strimp ... veuillez le tester au lieu du pour boucle et dites-moi si cela fonctionne ... composé = (1 + composé.Shift (1)) * (1 + indicateur_returne ) - 1 . Vous devrez peut-être réaffecter composé [1] après la fin, mais cela devrait être plus rapide que celui itératant sur la matrice ligne-by-ligne ...


Ok, y a-t-il autre chose que je puisse vous aider?


@Mike Pennington: Done, désolé, nouveau à empiler :)



3
votes

La partie de retour cumulatif de cette question est traitée dans l'excellent "Python d'analyse de données" de WES McKinney et utilise cumprod () de Pandas pour créer un retour cumulatif refasé / indexé des changements de prix calculés.

Exemple de livre: xxx


0 commentaires