[PYTHON] [Systre] Kaufen und verkaufen mit mobilem Durchschnitts-MACD ♬

Letztes Mal schrieb ich über STC (Stocastic Oscilator) als Einführung in Systre. Dieses Mal möchte ich MACD (Moving Average Convergence Divergence) reproduzieren, das in Python genauer ist (das Handelssignal kommt schneller heraus), und eine Zerlegung vornehmen, um ein leicht verständliches Urteil zu fällen. Sie erhalten eine Grafik wie die folgende.

【Referenz】 ① Was ist MACD? Evolutionäres System der gleitenden Durchschnittslinie, bei der Handelssignale früh auftreten !?Vergleich des in Python geschriebenen EMA-Codes (Exponential Moving Average)Gleitender Durchschnitt @wikipedia

Was ich getan habe

・ Ich habe versucht, es zu einer Weiterentwicklung des Stocastic Oscilator zu machen ・ Informationen zu EMA, die bei der Berechnung des MACD angezeigt werden ・ Erklärung des MACD-Codes

・ Ich habe versucht, es zu einer Weiterentwicklung des Stocastic Oscilator zu machen

Letztes Mal habe ich, obwohl es nach der Einführung von Decompose leicht zu erkennen war, ein Urteil gefällt, indem ich aus der folgenden Grafik gelesen habe. stc_%K%D_9437.JP_now.png Während hier beurteilt wird, dass 20% oder weniger überverkauft und 80% oder mehr überkauft sind, ist der Änderungspunkt, an dem die blaue Linie erscheint, das Kaufzeichen, und umgekehrt, wenn die orange Linie auftaucht. Richter als Verkaufszeichen. Um dies systematisch zu beurteilen und diese 20% - und 80% -Elemente einzuschließen, kann (% K-% D) /% K durch die folgende Funktion berechnet und beurteilt werden.

def calc_dff(dK,dD):
    dff= dK.copy()
    for j in range(len(dK)):
        #print(j)
        if dK[j]-dD[j]>0:
            dff[j]=100*(dK[j]-dD[j])/(abs(dK[j])+1)
        else:
            dff[j]=100*(dK[j]-dD[j])/(100-abs(dK[j])+1)
    return dff

Die Berechnung mit dieser Funktion ergibt das folgende untere Diagramm. In diesem Diagramm wird das Signal stärker unterdrückt und die Zeit zum Verkaufen und Kaufen ist klar. Dies scheint die Grenze eines normalen einfachen gleitenden Durchschnitts zu sein. close_stc_%K%D_9437.JP_trendnow2020-01-01.png Daher zeigt die obige Grafik:

Trend=Observed-Cycle
5-Tage-SMA (einfacher gleitender Durchschnitt), 25-Tage-SMA
Kauf- / Verkaufssignal = 100*(5 Tage SMA-25 Tage SMA)/5 Tage SMA

・ Informationen zu EMA, die bei der Berechnung des MACD angezeigt werden

Schreiben wir über EMA (Exponential Moving Average). Die Definition ist wie folgt, wie in Referenz shown gezeigt Die Formel zur Berechnung der EMA bei t ≧ 3 lautet wie folgt.

S_{{t}}=\alpha \times Y_{{t-1}}+(1-\alpha )\times S_{{t-1}}

Hier ist $ S_ {{t}} $ die EMA zu einem Zeitpunkt t, und $ Y_ {{t-1}} $ ist der beobachtete Wert zu einem Zeitpunkt t in der Zeitreihe. Außerdem ungefähr $ \ alpha = {2 \ über {N + 1}} $. Mit dieser EMA werden MACD usw. wie folgt definiert.

MACD = 12-Tage-EMA-26-Tage-EMA
Signal = MACD 9-Tage-EMA
Histogramm = Signal-MACD

Daher kann im Vergleich zu dem obigen stokastischen Oszillator angenommen werden, dass der einfache gleitende Durchschnitt durch den exponentiellen gleitenden Durchschnitt ersetzt wird und die Anzahl der Tage des langfristigen und kurzfristigen gleitenden Durchschnitts geringfügig geändert wird. Das Histogramm entspricht dem unteren Diagramm oben.

・ Erklärung des MACD-Codes

Ich denke, der folgende Code ist das Endergebnis dieses Systems. Ich werde das leicht verständliche anhand des Referenzcodes ② erklären.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import datetime as dt
from pandas_datareader import data
import statsmodels.api as sm
from statsmodels.tsa.seasonal import STL

Das Folgende ist die Datenerfassungsfunktion.

def get_stock(stock,start,end):
    df = data.DataReader(stock, 'stooq',start)["Close"]
    df = df.iloc[::-1]
    return df[start:end]

Stellen Sie die Parameter ein.

stock0 = '9437'
stock = stock0 + '.JP'
bunseki = "series"
start = dt.date(2020,1,1)
end = dt.date(2020,6,5)
df = pd.DataFrame(get_stock(stock, start, end))
series=df['Close']
cycle, trend = sm.tsa.filters.hpfilter(series, 144)
df['Close']=trend

Speichern Sie die Daten in der Liste mit df ['Close'] .values.tolist ().

gwalk = df['Close'].values.tolist()
print(gwalk[0:3])

Daten wie "[2978.67, 3016.01, 2972.77]" werden ausgegeben. Berechnen Sie die n-Tage-EMA unten. In Referenz (2) wurde a auf 0,15 festgelegt, aber hier ist es wichtig, a zu berechnen.

def EMA1(x, n):
    a= 2/(n+1)
    return pd.Series(x).ewm(alpha=a).mean()

Mit der obigen Funktion kann eine 12-Tage-EMA usw. leicht berechnet werden. Darüber hinaus können MACD und Signal wie folgt einfach berechnet werden.

y12 = EMA1(gwalk, 12)
y26 = EMA1(gwalk, 26)
MACD = y12 -y26
signal = EMA1(MACD, 9)
hist_=MACD-signal

Hier wird die horizontale Achse durch eine numerische Zeichenfolge dargestellt. Sie können es explizit als horizontale Plotachse beschreiben, dies ist hier jedoch nicht erforderlich. Sie müssen lediglich ein Diagramm zeichnen. Ax2.bar (ind, hist_) ist vorerst ein problematischer Ort.

ind = np.arange(len(signal))
fig, (ax1,ax2) = plt.subplots(2,1,figsize=(1.6180 * 12, 4*2),dpi=200)
ax1.plot(gwalk,label="series")
ax1.plot(y12,label="y12")
ax1.plot(y26,label="y26")
ax2.plot(MACD,label="MACD")
ax2.plot(signal,label="signal")
ax2.bar(ind,hist_)
ax1.legend()
ax2.legend()
ax1.grid()
ax2.grid()
plt.show()
plt.savefig("ema_.png ")
plt.close()

Das Ergebnis wird wie folgt ausgegeben. ema_decompose_%5K%25D_9437.JP_seriesnow2020-01-01.png Das Ergebnis der Zerlegung ist so einfach wie unten. Das Folgende ist das Ergebnis von 9437 NTT Docomo, aber es scheint bald plattenförmig zu sein. Figure_1.png Mit anderen Worten, unabhängig davon, ob es Rauschen gibt oder nicht, ist der Punkt, dass der Teil, in dem sich das Histogramm von Minus nach Plus ändert, gekauft wird, und umgekehrt der Teil, in dem es von Plus nach Minus wechselt, verkauft wird, so dass es fast in der tatsächlichen Bewegung ist. Es sieht so aus. ** Es stellt sich heraus, dass es ein effektiver Index für den langfristigen Kauf und Verkauf ist. ** ** ** Ich werde die andere horizontale Achse nach Datum als Bonus erklären.

Zusammenfassung

・ Ich habe versucht, Stocastic Oscilator mit einem leicht verständlichen Index auszudrücken. ・ Indikatoren, die MACD verwenden, scheinen für den langfristigen Handel effektiv zu sein.

・ Immerhin ist es so leicht zu verstehen, dass ich es auf die sogenannte Systole anwenden möchte.

Bonus

Es ändert sich nicht viel in Bezug auf den Code, aber es war sehr schwierig, die horizontale Achse auf das Datum einzustellen, also werde ich es veröffentlichen. Wenn Sie es sorgfältig lesen, werden Sie es genießen.

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import datetime as dt
from pandas_datareader import data
import statsmodels.api as sm
from statsmodels.tsa.seasonal import STL

def get_stock(stock,start,end):
    df = data.DataReader(stock, 'stooq',start)["Close"]
    df = df.iloc[::-1]
    return df[start:end]

from numba import jit
@jit(nopython=True)
def EMA3(x, n):
    alpha = 2/(n+1)
    y = np.empty_like(x)
    y[0] = x[0]
    for i in range(1,len(x)):
        y[i] = alpha*x[i] + (1-alpha)*y[i-1]
    return y

def EMA1(x, n):
    a= 2/(n+1)
    return pd.Series(x).ewm(alpha=a).mean()

def calc_dff(dK,dD):
    dff= dK.copy()
    for j in range(len(dK)):
        dff[j]=100*(dK[j]-dD[j])/(abs(dK[j])+abs(dD[j])+1)
    return dff

stock0 = '9437'
stock = stock0 + '.JP'
start = dt.date(2020,1,1)
end = dt.date(2020,6,5)
df = pd.DataFrame(get_stock(stock, start, end))
date_df=df['Close'].index.tolist() #Das ist der Punkt
print(date_df[0:30])
series = df['Close'].values.tolist()

bunseki = "trend" #series" #cycle" #trend
cycle, trend = sm.tsa.filters.hpfilter(series, 144)
series2 = trend

y12 = EMA3(series2, 12)
y26 = EMA3(series2, 26)
MACD = y12 -y26
signal = EMA3(MACD, 9)
hist_=MACD-signal

ind3=date_df[:]
print(len(series),len(ind3))

fig, (ax1,ax2) = plt.subplots(2,1,figsize=(1.6180 * 8, 4*2),dpi=200)
ax1.plot(ind3,series,label="series")
ax1.plot(ind3,series2,label="series2")
ax1.plot(ind3,y12,label="y12")
ax1.plot(ind3,y26,label="y26")
ax2.plot(ind3,MACD,label="MACD")
ax2.plot(ind3,signal,label="signal")
ax2.bar(ind3,hist_)
ax1.legend()
ax2.legend()
ax1.grid()
ax2.grid()
plt.savefig("./stock/{}/ema_decompose_%5K%25D_{}_{}now{}.png ".format(stock0,stock,bunseki,start))
plt.pause(1)
plt.close()

df['Close']=series  #series" #cycle" #trend
df['series2']=series2
df['y12'] = EMA1(df['Close'], 12)
df['y26'] =  EMA1(df['Close'], 26)
df['MACD'] = df['y12'] -df['y26']
df['signal'] = EMA1(df['MACD'], 9)
df['hist_']=df['MACD']-df['signal']
date_df=df['Close'].index.tolist()
print(df[0:30])

fig, (ax1,ax2) = plt.subplots(2,1,figsize=(1.6180 * 8, 4*2),dpi=200)
ax1.plot(df['Close'],label="series")
ax1.plot(df['series2'],label="series2")
ax1.plot(df['y12'],label="y12")
ax1.plot(df['y26'],label="y26")
ax2.plot(df['MACD'],label="MACD")
ax2.plot(df['signal'],label="signal")
ax2.bar(date_df,df['hist_'])
ax1.legend()
ax2.legend()
ax1.grid()
ax2.grid()
plt.savefig("./stock/{}/ema_df_decompose_%5K%25D_{}_{}now{}.png ".format(stock0,stock,bunseki,start))
plt.pause(1)
plt.close()

Recommended Posts

[Systre] Kaufen und verkaufen mit mobilem Durchschnitts-MACD ♬
Gleitender Durchschnitt mit Numpy
Kerzenbalkendiagramm und gleitender Durchschnittsliniendiagramm
Schneiden Sie und nehmen Sie einen gewichteten gleitenden Durchschnitt
Zipline Funktion zum Kaufen und Verkaufen von Aktien
Ich habe den gleitenden Durchschnitt des IIR-Filtertyps mit Pandas und Scipy verglichen
[Cistre] überschreitet MACD ♬