Negociación cuantitativa de acciones de Python (1) --- Gráfico de línea K, media móvil y dibujo de volumen de negociación

Pensando lejos de la virtud de los antepasados, pensando en el dolor de los padres; pensando en la gracia de retribuir al país, pensando en la bendición de hacer una familia; pensando en la urgencia de ayudar a la gente de afuera, pensando en el mal del ocio y yo adentro.

Prefacio

Se dice que 2020 es el punto de partida del mercado alcista. Obviamente, para los datos, los programadores tienen una ventaja absoluta, porque la mayoría de los programadores han estado manejando datos toda su vida, y los programadores solo necesitan dominar el procesamiento de datos y el dibujo de gráficos. puede hacer un buen trabajo en el mercado de valores.

Sin embargo, la columna de negociación cuantitativa de acciones no es una introducción a los conceptos básicos, sino solo al conocimiento relacionado con las acciones. Por lo tanto, para el dibujo de gráficos de matplotlib y numpy, biblioteca de pandas, no haremos demasiada introducción, necesitamos leer este tipo de blog, pero también necesitamos estos 3 conocimientos básicos. A continuación, vamos directamente al tema.

Obtener datos de stock

Para el lenguaje Python, hay muchas bibliotecas para obtener acciones, como las bibliotecas akshare, baostock y tushare. Y estas tres bibliotecas de adquisición de datos de stock son similares, por lo que los siguientes capítulos del editor aquí se basan en la biblioteca akshare para la adquisición de datos de stock. No hay mucho que decir, echemos un vistazo a cómo obtener datos de existencias durante el último mes. El código es el siguiente:

import akshare as ak
def get_codeData(code="sz002241"):
    df = ak.stock_zh_a_daily(symbol=code, start_date="20201203", end_date="20210115",
                                                          adjust="qfq")
    df.to_excel("歌尔股份k.xlsx")

Como se muestra en el código anterior, utilizamos el método stock_zh_a_daily para obtener datos durante un período de tiempo. La fecha aquí se puede ajustar según sus necesidades. Por ejemplo, configure start_date = "20200101" y end_date = "20210101" para obtener existencias por un período de datos de un año.

El código de acciones se divide en sh y sz. Sz significa acciones de Shenzhen. Todas las acciones de Shenzhen deben ir acompañadas de sz. Por ejemplo, la acción de Goertek aquí es sz002241. De manera similar, el pescado es una acción en la Bolsa de Valores de Shanghai, y todas las acciones en la Bolsa de Valores de Shanghai deben llevar pescado delante de ellas.

Aquí, echemos un vistazo al formato de datos de acciones obtenido, como se muestra en la figura siguiente:
Inserte la descripción de la imagen aquí
fecha : fecha de la transacción
apertura: representa el precio de apertura
máximo: el precio más alto del
día mínimo: el precio más bajo del día
cierre: el cierre precio del
día volumen: el volumen de negociación del día (yuanes)
acciones pendientes: capital actual (acciones)
volumen de negocios: tasa de rotación

Ahora que tenemos los datos, dibujemos un gráfico de líneas K.

Dibujar gráfico de velas

En Python, dibujar un gráfico de línea K requiere la biblioteca mpl_finance, y esta biblioteca proporciona 4 formas de dibujar un gráfico de línea K, aquí presentamos una de ellas, el código es el siguiente:

import mpl_finance as mpf
import matplotlib.pyplot as plt
import pandas as pd

#创建绘图的基本参数
fig=plt.figure(figsize=(12, 8))
ax=fig.add_subplot(111)

#获取刚才的股票数据
df = pd.read_excel("歌尔股份k.xlsx")
mpf.candlestick2_ochl(ax, df["open"], df["close"], df["high"], df["low"], width=0.6, colorup='r',colordown='green',alpha=1.0)
#显示出来
plt.show()

Después de ejecutar este fragmento de código, se mostrarán las siguientes representaciones:
Gráfico de velas sin tiempo
Hay un problema con este gráfico de velas, es decir, el eje de coordenadas X no es el tiempo mostrado, sino el número. Esto se debe al método para dibujar el gráfico de velas. no proporciona el eje X El parámetro, entonces, ¿cómo reemplazar el siguiente número con el tiempo? Primero veamos un fragmento de código:

import matplotlib.ticker as ticker
#将股票时间转换为标准时间,不带时分秒的数据
def date_to_num(dates):
    num_time = []
    for date in dates:
        date_time = datetime.strptime(date, '%Y-%m-%d')
        num_date = date2num(date_time)
        num_time.append(num_date)
    return num_time

#创建绘图的基本参数
fig=plt.figure(figsize=(12, 8))
ax=fig.add_subplot(111)

#获取刚才的股票数据
df = pd.read_excel("歌尔股份k.xlsx")
mpf.candlestick2_ochl(ax, df["open"], df["close"], df["high"], df["low"], width=0.6, colorup='r',colordown='green',alpha=1.0)
df['date'] = pd.to_datetime(df['date'])
df['date'] = df['date'].apply(lambda x: x.strftime('%Y-%m-%d'))
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()

Aquí, hemos definido 2 métodos: el primer método date_to_num se usa principalmente para convertir los datos de tiempo adquiridos en datos de fecha estándar; el segundo método es reemplazar el valor de tiempo de acuerdo con el valor de X.

Entre ellos, el método set_major_formatter es una biblioteca de operaciones que reemplaza el valor con el valor de tiempo, y la función de plt.setup es establecer la inclinación de la etiqueta del eje X 45 grados y la alineación a la derecha. Después de ejecutar, nuestro gráfico de línea K se muestra perfectamente, como se muestra en la siguiente figura:
Gráfico de velas perfecto

Gráfico de media móvil

Aunque hemos implementado el gráfico de línea K, ¿ha descubierto que, de hecho, la mayoría de los gráficos de línea K del software de negociación de acciones están marcados con promedios móviles, como el promedio móvil de 5 días, el promedio móvil de 10 días y 30 de media móvil. Por lo tanto, debemos agregar la media móvil a nuestro gráfico de velas. La forma de calcular la media móvil es la siguiente:

df["SMA5"] = df["close"].rolling(5).mean()
df["SMA10"] = df["close"].rolling(10).mean()
df["SMA30"] = df["close"].rolling(30).mean()

Puede obtener el valor promedio móvil de las acciones con 3 líneas de código. Luego, podemos usar el eje anterior para dibujar la media móvil, el código agregado es el siguiente:

ax.plot(np.arange(0, len(df)), df['SMA5'])  # 绘制5日均线
ax.plot(np.arange(0, len(df)), df['SMA10'])  # 绘制10日均线
ax.plot(np.arange(0, len(df)), df['SMA30'])  # 绘制30日均线

Aquí, el eje X también se establece en un número, y estos dos fragmentos de código se agregan al código del gráfico de líneas K anterior, y el eje X naturalmente se reemplazará con el tiempo. Después de ejecutar, el efecto de visualización es como se muestra en la siguiente figura:
Gráfico de línea K y gráfico de media móvil
Aquí el promedio móvil de 5 días es azul, el promedio móvil de 10 días es naranja y el promedio móvil de 30 días es verde. Si necesita establecer el color usted mismo, puede agregar el parámetro de color al método de dibujo de cada media móvil.

Los lectores atentos deben encontrar que la media móvil de 30 días solo tiene el último segmento. Esto se debe a que los 29 días anteriores son menos de 30 días y la media móvil no se puede calcular. Lo mismo ocurre con las medias móviles de 5 y 10 días. .

Volumen

Finalmente, también necesitamos trazar el volumen. En la mayoría de los programas de comercio de acciones, la parte superior es un gráfico de línea K, y la parte inferior generalmente corresponde al volumen de operaciones. De esta manera, puede ver visualmente los cambios en los datos cuando los compara.

Sin embargo, debido a que hay un gráfico de líneas K arriba, hay dos imágenes en el mismo lienzo y comparten el mismo eje X, entonces necesitamos cambiar los parámetros básicos, el código es el siguiente:

import mpl_finance as mpf
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.ticker as ticker
import numpy as np
#创建绘图的基本参数
fig, axes = plt.subplots(2, 1, sharex=True, figsize=(15, 10))
ax1, ax2 = axes.flatten()

#获取刚才的股票数据
df = pd.read_excel("歌尔股份k.xlsx")
mpf.candlestick2_ochl(ax1, df["open"], df["close"], df["high"], df["low"], width=0.6, colorup='r',colordown='green',alpha=1.0)
df['date'] = pd.to_datetime(df['date'])
df['date'] = df['date'].apply(lambda x: x.strftime('%Y-%m-%d'))
def format_date(x, pos=None):
    if x < 0 or x > len(df['date']) - 1:
        return ''
    return df['date'][int(x)]
df["SMA5"] = df["close"].rolling(5).mean()
df["SMA10"] = df["close"].rolling(10).mean()
df["SMA30"] = df["close"].rolling(30).mean()
ax1.plot(np.arange(0, len(df)), df['SMA5'])  # 绘制5日均线
ax1.plot(np.arange(0, len(df)), df['SMA10'])  # 绘制10日均线
ax1.plot(np.arange(0, len(df)), df['SMA30'])  # 绘制30日均线
ax1.xaxis.set_major_formatter(ticker.FuncFormatter(format_date))
plt.setp(plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right')
#显示出来
plt.show()

Aquí, configuramos el lienzo de dibujo en 2 filas y 1 columna. Al mismo tiempo, cambie todos los datos dibujados arriba a ax1, de modo que la media móvil y el gráfico de velas se dibujen en el primer subgráfico.

A continuación, necesitamos trazar el volumen, pero sabemos que el software de negociación de acciones general establece el volumen en el día ascendente en rojo y traza el volumen descendente en verde. Por tanto, lo primero que tenemos que hacer es clasificar los datos de stock adquiridos según las fluctuaciones del día. El código específico es el siguiente:

red_pred = np.where(df["close"] > df["open"], df["volume"], 0)
blue_pred = np.where(df["close"] < df["open"], df["volume"], 0)

Como se muestra en el código anterior, filtramos los datos por np.where (condición, x, y). Aquí, si se cumple la condición, se emite X, y si no se cumple, se emite Y. De esta manera, clasificamos los datos de volumen ascendente y descendente.

Finalmente, dibujamos el volumen directamente a través del método del histograma, el código específico es el siguiente:

ax2.bar(np.arange(0, len(df)), red_pred, facecolor="red")
ax2.bar(np.arange(0, len(df)), blue_pred, facecolor="blue")

Agregue todas estas 4 líneas de código al principio del código plt.show ().

Después de ejecutar, el gráfico de efectos de salida es el siguiente: el
Gráfico de línea K, media móvil y volumen
gráfico de líneas K, el gráfico de promedio móvil y el volumen de operaciones están aquí, el siguiente artículo presenta el conocimiento relevante del oscilador KDJ.

Supongo que te gusta

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