Comercio cuantitativo de acciones de Python (6) --- use TA-Lib para calcular indicadores técnicos

Asegúrese de saber lo que está mal todos los días y cambie todos los días; si no sabe lo que está mal todos los días, estará contento con usted mismo todos los días; si no cambia un día, no podrá progresar todos los días. día, hay mucha gente inteligente y guapa en el mundo, por eso la moral no se modifica, los que no amplían su karma solo retrasarán su vida por seguir la palabra.

¿Qué es TA-Lib?

TA-Lib (Technical Analysis Library) es una biblioteca de análisis técnico de código abierto proporcionada por Python. Desde su lanzamiento, tiene una historia de más de 20 años. Contiene funciones de cálculo para aproximadamente 200 indicadores técnicos y funciones de reconocimiento de patrones de K-line, como MACD, RSI, KDJ, indicadores de impulso, etc.

Del análisis de las publicaciones anteriores del blog, si no comprende esta biblioteca y analizamos acciones directamente, debe recordar las fórmulas de cálculo de todos los indicadores. Es realmente hostil para las personas que no son muy buenas en matemáticas. Pero después de tener la biblioteca TA-Lib, podemos obtener fácilmente algunos parámetros del dibujo del indicador, lo que puede ahorrarnos mucho tiempo de análisis.

Por lo tanto, esta publicación de blog explicará todos los indicadores técnicos anteriores, calculados a través de la biblioteca TA-Lib. Entonces, en primer lugar, necesitamos importar esta biblioteca en el archivo de Python, el código específico es el siguiente:

import talib

Cálculo del indicador SMA

SMA es la media móvil explicada en la publicación anterior del blog, que es la abreviatura de media móvil simple. La biblioteca TA-Lib nos proporciona directamente talib.SMA () para calcular SMA.

Hay dos parámetros para usar la función SMA ():

(1) timeperiod: el tiempo para calcular la media móvil. Por ejemplo, escriba 5 para una media móvil de 5 días, escriba 10 para una media móvil de 10 días, y así sucesivamente.

(2) Cierre: precio de cierre, puede importar directamente la columna del precio de cierre a través de pandas.

A continuación, usemos la función SMA () para calcular los promedios móviles de 10, 20 y 30 días. El código específico es el siguiente:

import pandas as pd
import talib
df = pd.read_excel("牧原股份.xlsx")
df["SMA10"]=talib.SMA(df['close'],timeperiod=10)
df["SMA20"]=talib.SMA(df['close'],timeperiod=20)
df["SMA30"]=talib.SMA(df['close'],timeperiod=30)

Pero aquí debemos prestar atención a que al calcular la media móvil, los n días antes de la media móvil deben ser nulos. Por ejemplo, si aquí se calcula el promedio móvil de 10 días, los primeros 9 días no tienen valor. Si no hay ningún valor, NaN se completará de forma predeterminada. Para que los datos sean hermosos al dibujar, debemos asignar el valor en blanco de los N días anteriores al valor efectivo de la media móvil del primer día, de modo que haya ser una curva en blanco. El código específico es el siguiente:

df['SMA10'].fillna(method="bfill",inplace=True)
df['SMA20'].fillna(method="bfill",inplace=True)
df['SMA30'].fillna(method="bfill",inplace=True)

En la actualidad, existen muchos métodos de cálculo diferentes para nuestra media móvil. Por ejemplo, cuando se calcula la media móvil exponencial, se utiliza el método EMA, y cuando se calcula la media móvil ponderada, se utiliza el método WMA. Sin embargo, estos cálculos tienen un método general MA, que distingue si calcular EMA, WMA o SMA a través del último tipo de parámetro. P.ej:

df['ma10']=talib.MA(df['close'],timeperiod=10,matype=0)
df['ma20']=talib.MA(df['close'],timeperiod=20,matype=1)
df['ma30']=talib.MA(df['close'],timeperiod=30,matype=2)

0 significa SMA, 1 significa EMA, 2 significa WMA, otros valores de parámetros, los presentaremos cuando expliquemos otros indicadores más adelante, estos tres son los métodos más utilizados y deben recordarse.

El código para dibujar la media móvil es el siguiente:

import pandas as pd
import talib
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111)
df = pd.read_excel("牧原股份.xlsx")
df['date'] = pd.to_datetime(df['date'])
df['date'] = df['date'].apply(lambda x: x.strftime('%Y-%m-%d'))
df["SMA10"]=talib.SMA(df['close'],timeperiod=10)
df["SMA20"]=talib.SMA(df['close'],timeperiod=20)
df["SMA30"]=talib.SMA(df['close'],timeperiod=30)
df['SMA10'].fillna(method="bfill",inplace=True)
df['SMA20'].fillna(method="bfill",inplace=True)
df['SMA30'].fillna(method="bfill",inplace=True)
ax.plot(np.arange(0, len(df)), df['SMA10'])  # 绘制5日均线
ax.plot(np.arange(0, len(df)), df['SMA20'])  # 绘制10日均线
ax.plot(np.arange(0, len(df)), df['SMA30'])  # 绘制30日均线
ax.xaxis.set_major_locator(ticker.MaxNLocator(20))


def format_date(x, pos=None):
    if x < 0 or x > len(df['date']) - 1:
        return ''
    return df['date'][int(x)]


ax.xaxis.set_major_formatter(ticker.FuncFormatter(format_date))
plt.setp(plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right')
plt.show()

Después de ejecutar, el efecto de visualización es como se muestra en la siguiente figura:
Inserte la descripción de la imagen aquí

Cálculo del indicador MACD

Dado que la biblioteca TA-Lib proporciona directamente el método SMA () para calcular el promedio móvil, definitivamente habrá un método MACD que le proporcionará los parámetros para calcular el MACD. El método de uso específico es el siguiente:

dif, dea, bar = talib.MACD(df['close'].values, fastperiod=12, slowperiod=26, signalperiod=9)

Se puede ver que al calcular los parámetros MACD, calcularemos EMA1 (media móvil del precio de cierre el día 12) y EMA2 (media móvil del precio de cierre de 26) correspondientes a los 12, 26 anteriores. De manera similar, el intervalo de la fórmula para calcular DEA también es 9, que se sustituye en el último valor.

Sin embargo, su implementación interna es en realidad el mismo paso que nuestra propia operación de acuerdo con la fórmula, pero la biblioteca TA-Lib omite directamente los pasos y nos da el método directamente, de modo que si solo se usa para análisis, la mayoría de los desarrolladores no lo hacen. Necesito entender el principio.

Aunque nos proporciona directamente el método de cálculo MACD (), pero calculamos de acuerdo con la fórmula anterior, no hay valor nulo, y el código directo aquí provocará un valor nulo. Entonces necesitamos un paso adicional para reemplazar el valor nulo, el código específico es el siguiente:

dif[np.isnan(dif)],dea[np.isnan(dea)],bar[np.isnan(bar)]=0,0,0

El código de dibujo completo es el siguiente:

import pandas as pd
import talib
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111)
df = pd.read_excel("牧原股份.xlsx")
df['date'] = pd.to_datetime(df['date'])
df['date'] = df['date'].apply(lambda x: x.strftime('%Y-%m-%d'))
dif, dea, bar = talib.MACD(df['close'].values, fastperiod=12, slowperiod=26, signalperiod=9)
dif[np.isnan(dif)], dea[np.isnan(dea)], bar[np.isnan(bar)] = 0, 0, 0
ax.plot(np.arange(0, len(df)), dif)
ax.plot(np.arange(0, len(df)), dea)
red_bar = np.where(bar > 0, 2 * bar, 0)
blue_bar = np.where(bar < 0, 2 * bar, 0)
ax.bar(np.arange(0, len(df)), red_bar, color="red")
ax.bar(np.arange(0, len(df)), blue_bar, color="blue")

ax.xaxis.set_major_locator(ticker.MaxNLocator(20))


def format_date(x, pos=None):
    # 由于前面股票数据在 date 这个位置传入的都是int
    # 因此 x=0,1,2,...
    # date_tickers 是所有日期的字符串形式列表
    if x < 0 or x > len(df['date']) - 1:
        return ''
    return df['date'][int(x)]


ax.xaxis.set_major_formatter(ticker.FuncFormatter(format_date))
plt.setp(plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right')
plt.show()

Después de ejecutar, el efecto de visualización es el siguiente:
Inserte la descripción de la imagen aquí

Cálculo del indicador KDJ

Aunque los nombres de los métodos para calcular SMA y MACD son los mismos en la biblioteca TA-Lib, esta vez no es realmente una función KDJ. El método para calcular KDJ en la biblioteca TA-Lib es la función talib.STOCH. Primero, podemos calcular el valor de K y D a través de esta función, y luego calcular el valor de J a través de K y D. El método de cálculo específico es el siguiente:

df['K'], df['D'] = talib.STOCH(df['high'].values, df['low'].values, df['close'].values, fastk_period=9, slowk_period=3,
                               slowk_matype=0, slowd_period=3, slowd_matype=0)
df['K'].fillna(0,inplace=True)
df['D'].fillna(0,inplace=True)
df['J']=3*df['K']-2*df['D']

Aquí fastk_period = 9, slowk_period = 3, slowd_period = 3, aunque el método de cálculo es diferente, la idea central es la misma. De manera similar, el valor KD calculado utilizando la biblioteca TA-Lib también tiene un valor no válido y debe reemplazarse por 0.

El código completo para dibujar la curva KDJ es el siguiente:

import pandas as pd
import talib
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111)
df = pd.read_excel("牧原股份.xlsx")
df['date'] = pd.to_datetime(df['date'])
df['date'] = df['date'].apply(lambda x: x.strftime('%Y-%m-%d'))
df['K'], df['D'] = talib.STOCH(df['high'].values, df['low'].values, df['close'].values, fastk_period=9, slowk_period=3,
                               slowk_matype=0, slowd_period=3, slowd_matype=0)
df['K'].fillna(0,inplace=True)
df['D'].fillna(0,inplace=True)
df['J']=3*df['K']-2*df['D']
ax.plot(df["date"], df["K"], label ="K")
ax.plot(df["date"], df["D"], label ="D")
ax.plot(df["date"], df["J"], label ="J")
plt.legend()
ax.xaxis.set_major_locator(ticker.MaxNLocator(20))
def format_date(x, pos=None):
    # 由于前面股票数据在 date 这个位置传入的都是int
    # 因此 x=0,1,2,...
    # date_tickers 是所有日期的字符串形式列表
    if x < 0 or x > len(df['date']) - 1:
        return ''
    return df['date'][int(x)]


ax.xaxis.set_major_formatter(ticker.FuncFormatter(format_date))
plt.setp(plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right')
plt.show()

Después de ejecutar, el efecto de visualización es el siguiente:
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/liyuanjinglyj/article/details/113401385
Recomendado
Clasificación