Hoe je een zwevend gemiddelde uitvoert in Python

Beste antwoord

Ik heb een artikel geschreven over Medium waarin de verschillende soorten voortschrijdende gemiddelden worden gepresenteerd en hun functies in Python worden gecodeerd (volledig link voor de code aangezien het formatteren moeilijk is: Hoe verschillende soorten voortschrijdende gemiddelden in Python te coderen. ). Hier is het artikel:

Handelssoftware wordt geleverd met verschillende soorten voortschrijdende gemiddelden die al vooraf zijn geïnstalleerd en klaar om in kaart te worden gebracht. Maar het kan interessant zijn om te begrijpen hoe u deze voortschrijdende gemiddelden berekent, zodat u ze kunt gebruiken wanneer u potentiële strategieën backtest.

Als u een doe-het-zelf-methode wilt, dan het onderstaande zal u zeker interesseren. Het enige dat nodig is, is een python-interpreter zoals SPYDER. De verschillende “bekende” typen voortschrijdende gemiddelden zijn:

  • Eenvoudig voortschrijdend gemiddelde.
  • Exponentieel voortschrijdend gemiddelde.
  • Afgevlakt voortschrijdend gemiddelde.
  • Lineair gewogen voortschrijdend gemiddelde.

We zal ze allemaal doorlopen, definiëren, coderen en in kaart brengen.

GBPUSD Dagelijkse grafiek. In zwart, 200 dagen MA, in karmozijnrood, 200 dagen EMA, in geel 200 dagen afgevlakte MA, en in roze, 200 dagen lineair gewogen MA.

Eenvoudig voortschrijdend gemiddelde

Zoals de naam al doet vermoeden, is dit je gewone, eenvoudige gemiddelde dat overal in de statistieken wordt gebruikt en eigenlijk elk ander onderdeel in ons leven. Het zijn gewoon de totale waarden van de waarnemingen gedeeld door het aantal waarnemingen.

Wiskundig gezien kan het worden opgeschreven als:

In python kunnen we een functie definiëren die voortschrijdende gemiddelden als volgt berekent:

[Python-code komt hier, alstublieft verwijs naar de originele artikellink hierboven, want het plakken van de code is tijdrovend]

De functie neemt uw datastructuur over die wordt weergegeven door de Data variabele, de zwevend gemiddelde periode (20, 60, 200, etc.) vertegenwoordigd door de periode variabele, waarop wil je deze toepassen ( op OHLC-datastructuren, kies 3 voor sluitingskoersen omdat python-indexering begint bij nul) weergegeven door de onwhat variabele, en de waar variabele is waar wil je dat de zwevend gemiddelde kolom verschijnt. Houd er rekening mee dat u een array van meer dan 4 kolommen moet hebben om dit te laten werken, omdat het niet automatisch een nieuwe kolom maakt, maar deze gewoon vult.

EURUSD Dagelijkse tijdshorizon met 200-dagen eenvoudig voortschrijdend gemiddelde.

Exponentieel voortschrijdend gemiddelde

In tegenstelling tot het eenvoudig voortschrijdend gemiddelde dat aan alle waarnemingen gelijke gewichten geeft, geeft het exponentiële voortschrijdend gemiddelde meer gewicht aan de meer recente waarnemingen. Het reageert meer dan het simpele voortschrijdend gemiddelde met betrekking tot recente bewegingen.

Wiskundig gezien kan het worden opgeschreven als:

De afvlakkingsfactor is vaak 2. Merk op dat als we de afvlakkingsfactor (ook bekend als alfa) verhogen, de meer recente waarnemingen meer gewicht zullen hebben.

In python-taal , kunnen we een functie definiëren die de EMA als volgt berekent:

[Python-code komt hier, raadpleeg de originele artikellink hierboven terwijl u de code plakt is tijdrovend]

De functie spreekt voor zich aangezien het slechts de hierboven gepresenteerde EMA-functie reproduceert.

EURUSD dagelijkse tijdshorizon met 200-dagen exponentieel voortschrijdend gemiddelde.

Afgevlakt voortschrijdend gemiddelde

Dit voortschrijdend gemiddelde houdt rekening met het algemene beeld en wordt minder beïnvloed door recente bewegingen. Het is mijn favoriete trendvolgende indicator. Wiskundig gezien kan het worden gevonden door simpelweg de Days-variabele in de EMA-functie te vermenigvuldigen met 2 en af ​​te trekken. Dit betekent dat om een ​​exponentieel voortschrijdend gemiddelde om te zetten in een afgevlakte, we deze vergelijking in python-taal volgen, die de exponentiële verplaatsing transformeert gemiddelde in een afgevlakte:

smoothed = (exponential * 2) - 1 # From exponential to smoothed

EURUSD dagelijkse tijdshorizon met afgevlakt voortschrijdend gemiddelde van 200 dagen.

Lineair gewogen voortschrijdend gemiddelde

Dat is een eenvoudig voortschrijdend gemiddelde dat meer gewicht hecht aan recente gegevens. De meest recente waarneming heeft het grootste gewicht en elke voorgaande heeft een geleidelijk afnemend gewicht.Intuïtief gezien heeft het minder vertraging dan de andere voortschrijdende gemiddelden, maar het wordt ook het minst gebruikt, en daarom verliest het aan populariteit wat het wint aan lagvermindering.

Wiskundig gezien kan het worden opgeschreven als:

In Python-taal kunnen we een functie definiëren die voortschrijdende gemiddelden als volgt berekent:

[Python-code komt hier, raadpleeg de originele artikellink hierboven aangezien het plakken van de code tijdrovend is]

EURUSD Dagelijkse tijdshorizon met 200-dagen gewogen voortschrijdend gemiddelde.

Kortom, als we een dataset hebben die bestaat uit twee getallen [1, 2] en we willen een lineair gewogen gemiddelde berekenen, dan doen we het volgende:

  • (2 x 2) + (1 x 1) = 5
  • 5/3 = 1.66

Hierbij wordt uitgegaan van een tijdreeks met nummer 2 als de meest recente waarneming.

Conclusie

Dus, welke moet je kiezen? Die vraag wordt overgelaten aan het risicoprofiel van de handelaar en haar bekendheid met het voortschrijdend gemiddelde. Sommigen geven de voorkeur aan eenvoudige, voortschrijdende gemiddelden, terwijl anderen dieper proberen te graven door combinaties van exponentiële en afgevlakte voortschrijdende gemiddelden te gebruiken. Het hangt allemaal van jou af om je favoriete te vinden. Mijn advies? Overweeg voortschrijdende gemiddelden op langere termijn.

Antwoord

Waarom noemde niemand pandas? Python-gegevensanalysebibliotheek

import pandas as pd, numpy as np

np.random.seed(1)

random\_walk = pd.Series(

np.random.randn(100)

).cumsum() # dummy data

random\_walk.ewm(span=10).mean() # ema

random\_walk.rolling(20).mean() # simple moving average

random\_walk.expanding().mean() # expanding average

index = pd.bdate\_range("2012","2013",freq="1h") # time series

series = pd.Series(

np.random.randn(index.shape[0]),index

)

series.rolling("100h").mean() # 100 hours, time based window

series.rolling(pd.Timedelta(hours=30)).mean() # You may use any offset compatible with index

series.rolling(10, win\_type="triang").mean() # triangle weights

series.rolling(10,center=True).mean() # value in the middle of window

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *