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
・ 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
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. 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. 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
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.
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. 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. 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.
・ 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.
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