Python implementa el aprendizaje avanzado de comercio cuantitativo de acciones (1) construcción de biblioteca básica (preparación de conocimientos)

1. Escribe al frente

A partir de este artículo, voy a escribir un blog en serie sobre el comercio cuantitativo de acciones, centrándome en registrar mi ruta de aprendizaje para la realización de la plataforma de comercio cuantitativo, y hacer una nota para algunas bibliotecas clave de terceros y conocimientos clave.
El marco comercial cuantitativo que quiero implementar es solo una función para la adquisición, limpieza, integración de datos financieros y la realización de algunas estrategias cuantitativas, backtesting y otras funciones. No realizará las funciones comerciales programáticas reales de las acciones. Todos los marcos comerciales cuantitativos primero debe dominarse Algunos conocimientos de bibliotecas de terceros, las bibliotecas relacionadas involucradas se dan aquí, que deben instalarse con anticipación y el uso del conocimiento de la biblioteca está reservado con anticipación.

1.1, instalación de la biblioteca Numpy

NumPy (Python numérico) es una biblioteca extendida del lenguaje Python, que admite una gran cantidad de matrices dimensionales y operaciones de matriz, y también proporciona una gran cantidad de bibliotecas de funciones matemáticas para operaciones de matriz.
Puede instalar NumPy, Pandas y otras bibliotecas básicas instalando Anaconda3, o puede usar el siguiente comando para instalar Numpy:

pip3 install numpy scipy matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple

De forma predeterminada, se utilizan líneas extranjeras. Los países extranjeros son demasiado lentos, por lo que utilizamos la imagen de espejo de Tsinghua.
Para el tutorial de Numpy, puede hacer clic en el enlace "Tutorial de Numpy" para aprender.

1.2, la instalación de la biblioteca Pandas

Pandas es la biblioteca de soporte de análisis de datos central de Python. Proporciona una estructura de datos rápida, flexible y clara, y tiene como objetivo manejar datos relacionales y etiquetados de manera simple e intuitiva. El objetivo de Pandas es convertirse en una herramienta avanzada indispensable para la práctica del análisis de datos de Python y el combate real. Su objetivo a largo plazo es convertirse en la herramienta de análisis de datos de código abierto más potente y flexible que pueda admitir cualquier idioma.
Del mismo modo, Pandas se puede instalar de manera uniforme instalando Anaconda3. Si necesita instalarlo por separado, puede usar el siguiente comando:

  • Instalar usando conda
conda install Pandas

Si desea instalar la versión especificada de pandas, use el siguiente comando

conda install Pandas=0.20.3
  • Instalar usando pip
pip3 install Pandas

1.3. Adquisición de datos financieros

Obtengo principalmente datos financieros del mercado de valores a través de dos plataformas, una es tushare y la otra es Jukuan. Ambas plataformas se pueden usar de forma gratuita después del registro. La biblioteca de comercio cuantitativo de Guotai Junan es también la biblioteca jqdata de la plataforma Jukuan. Si estás interesado, Ahora, si tiene una cuenta comercial, puede implementar directamente la parte comercial programática usted mismo.

pip3 install tushare

Tenga en cuenta que la plataforma tiene dos documentos de interfaz, la interfaz antigua y la nueva. La nueva interfaz ha migrado algunas funciones de la interfaz anterior. Preste atención a la documentación cuando la utilice.
Nuevo enlace de documento de interfaz
Método de importación de paquete

import tushare as ts
 pip3 install jqdatasdk 

O lo siguiente, que puede ser más rápido:

pip3 install jqdatasdk -i https://mirrors.aliyun.com/pypi/simple/

potenciar:

pip3 install -U jqdatasdk

Importar método de paquete jqdatasdk
importar jqdatasdk como jq

1.4, instalación de la biblioteca financiera talib y enlace de documentos

TA-Lib, el nombre completo "Technical Analysis Library", es la biblioteca de análisis técnico, que es una biblioteca avanzada para la cuantificación financiera de Python, que cubre más de 150 acciones y software de negociación de futuros indicadores de análisis técnico de uso común, como MACD, RSI, KDJ, indicadores de impulso, Bandas de Bollinger, etc. TA-Lib se puede dividir en 10 subsecciones: Estudios de superposición, Indicadores de impulso, Indicadores de volumen, Indicadores de ciclo, Transformación de precios, Índice de tasa de indicadores de volatilidad), Reconocimiento de patrones (reconocimiento de patrones), Funciones estadísticas (función estadística), Transformación matemática ( transformación matemática) y Operadores matemáticos (operación matemática), consulte la figura siguiente.
Inserte la descripción de la imagen aquí
Instalación y uso

Instalación: El uso del comando "pip install talib" en cmd generalmente informará un error. El método de instalación correcto es ingresar https://www.lfd.uci.edu/~gohlke/pythonlibs/, desplegar y seleccionar TA_Lib-0.4 .19-cp38- cp38-win_amd64.whl (sistema win de 64 bits, versión python3.8, seleccione el paquete de instalación correspondiente de acuerdo con su sistema y la versión de python), coloque el paquete de descarga en una ruta determinada y luego en Anaconda Prompt (o Windows cmd) ingrese el comando:

pip install [文件全路径名]

Efecto de instalación (el archivo TA_Lib-0.4.19-cp38-cp38-win_amd64.whl se coloca en la ruta C: \ Users \ ml \ Desktop \ Python)
Inserte la descripción de la imagen aquíInicie sesión en la prueba de Python después de la instalación:
Inserte la descripción de la imagen aquí
ya que la biblioteca talib no tiene un documento chino , aquí hay dos enlaces de referencia, busque un estudio en profundidad. Enlace uno , enlace dos .
La segunda conexión es un documento de traducción relativamente completo.

1.5, instalación de la biblioteca Matplotlib y enlace de documentos

Matplotlib es una biblioteca de trazado para Python. Se puede utilizar con NumPy y proporciona una alternativa de código abierto eficaz a MatLab.

Se puede instalar a través de anaconda3 o de la siguiente manera:

pip3 install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple

Utilice la dirección del espejo para instalar el bloque de velocidad.
Enlaces a documentos de aprendizaje.

2. Análisis de indicadores técnicos bursátiles

2.1, análisis de media móvil

El promedio móvil se refiere a la conexión del promedio aritmético del precio de las acciones dentro de un cierto período de negociación, que refleja el precio de costo promedio de los accionistas durante un período de tiempo. Por ejemplo, la media móvil de 5 días son los últimos 5 días de negociación.Precio de cierreSuma y divide por 5 para obtener el promedio aritmético de 5 días.

En talib, la serie de indicadores de media móvil incluye: media móvil simple SMA, media móvil exponencial EMA, media móvil ponderada WMA, media móvil doble DEMA, media móvil exponencial triple TEMA, media móvil triangular TRIMA, prueba KAMA, media móvil adaptativa Fuman, MAMA es la media móvil adaptativa de MESA, media móvil exponencial triple T3.
Nombre de la función general:
código de llamada MA : ta.MA (close, timeperiod = 30, matype = 0)
Descripción del parámetro:

  • cercaTipo Numpy.ndarray o tipo pandas.Series para precio de cierre
  • periodo de tiempoEl intervalo de cálculo promedio, el predeterminado es 30 días, ingrese 5, que es el promedio de 5 días, y así sucesivamente.
  • matypeTipo de indicador promedio, el valor predeterminado es SMA, si ingresa un número, entonces: 0 = SMA, 1 = EMA, 2 = WMA, 3 = DEMA, 4 = TEMA, 5 = TRIMA, 6 = KAMA, 7 = MAMA, 8 = T3; También puede usar MA_Type en talib e ingresar directamente de acuerdo con el método MA_Type.SMA después de la importación.
    Los diferentes tipos de medias móviles también tienen sus propias funciones de llamada correspondientes:
    Inserte la descripción de la imagen aquíEjemplo de código 1:
import numpy as np
import talib as ta
from talib import MA_Type
import pandas as pd
close = np.array([1, 2, 3, 4, 5, 6], dtype='f8')
se = pd.Series(close, dtype='f8')
# 方法一使用通用函数MA计算5日算术均线,传入matype参数调用简单移动平均线
# 如果调用指数移动平均线则参数matype=MA_Type.EMA
# 第一个参数可以传入close,也可以传入se
output = ta.MA(se, timeperiod=5, matype=MA_Type.SMA)
print(output)
# 方法二 直接调用SMA函数,传入计算时间间隔计算5日均线
output = ta.SMA(se, timeperiod=5)
print(output)

Resultado de la producción:
Inserte la descripción de la imagen aquí La media móvil es uno de los indicadores más utilizados en la teoría del análisis técnico. Se utiliza principalmente para confirmar, rastrear y juzgar tendencias, generar señales de compra y venta y captar mejor las oportunidades de mercado en condiciones de mercado unilaterales y evitar riesgos. Sin embargo, los promedios móviles se utilizan generalmente en combinación con otros indicadores técnicos o fundamentales, especialmente cuando el mercado está en un mercado de consolidación, sus señales de compra y venta aparecerán con frecuencia y se distorsionarán fácilmente.
Ejemplo de código dos:
Calcule el promedio móvil aritmético de 5 días (promedio simple y fácil de entender) del precio de las acciones entre 2021-01-01 y 2021-01-20 en el pase transfronterizo. Utilice la
plataforma Jukuan para obtener datos de acciones.

import numpy as np
import talib as ta
from talib import MA_Type
import pandas as pd
import jqdatasdk as jq
# 聚宽平台权限验证
jq.auth('*******', '********')
# 聚宽平台获取股价
close = jq.get_price('002640.XSHE',
                     start_date='2021-01-01',
                     end_date='2021-01-20',
                     frequency='1d',
                     fq='pre')
# 方法一使用通用函数MA计算5日算术均线,传入matype参数0等同于MA_Type.SMA
close['5MA'] = ta.MA(close['close'], timeperiod=5, matype=0)
close['10MA'] = ta.MA(close['close'], timeperiod=10, matype=MA_Type.SMA)
# 由于日期间隔短,无法计算20日、30日、60日的均线
'''close['20MA'] = ta.MA(close['close'], timeperiod=20, matype=MA_Type.SMA)
close['30MA'] = ta.MA(close['close'], timeperiod=30, matype=MA_Type.SMA)
close['60MA'] = ta.MA(close['close'], timeperiod=60, matype=MA_Type.SMA)'''
print(close)

Resultado de salida:
Inserte la descripción de la imagen aquíEjemplo de código tres:
Mejorar el ejemplo anterior para lograr una salida gráfica.

import numpy as np
import talib as ta
from talib import MA_Type
import pandas as pd
import jqdatasdk as jq
from matplotlib import pyplot as plt
from pylab import mpl
# 聚宽平台权限验证
jq.auth('******', '*******')
# 聚宽平台获取股价
close = jq.get_price('002640.XSHE',
                     start_date='2020-11-01',
                     end_date='2021-01-20',
                     frequency='1d',
                     fq='pre')

mpl.rcParams['font.sans-serif'] = [
    'SimHei'
]  # 使图形中的中文正常编码显示,其中,sans-serif 表示字体中的无衬线体,SimHe是黑体

mpl.rcParams['axes.unicode_minus'] = False  # 使坐标轴刻度表签不显示正负号

types = ['SMA', 'EMA', 'WMA', 'DEMA', 'TEMA', 'TRIMA', 'KAMA', 'MAMA', 'T3']
for i in range(len(types)):
    close[types[i]] = ta.MA(close['close'], timeperiod=5, matype=i)
#close.tail()
# 使用loc[]获取局部行和列的切片
'''
iloc:即index locate 用index索引进行定位,所以参数是整型,如:df.iloc[10:20,3:5]
loc:则可以使用column名和index名进行定位,如:df.loc['image1':'image10','age':'score']
df['col1']取得第一列或df[['col1','col2','col3']]获取三列
'''

# 使用DataFrame的plot方法绘制图像会按照数据的每一列绘制一条曲线
# figsize=(16, 6)图片尺寸大小16*6
close.loc['2020-12-16':,'SMA':].plot(figsize=(16, 6))
# 获取当前坐标轴
ax = plt.gca()
# 设置右侧框线无颜色(隐藏)
ax.spines['right'].set_color('none')
# 设置顶部框线无颜色(隐藏)
ax.spines['top'].set_color('none')
# 设置图形标题
plt.title('上证指数各种类型移动平均线',fontsize=15)
# 设置X轴标签文字为空
plt.xlabel('')
# plt.ylabel('y轴') # y轴标签文字设置
plt.show()

Resultado de salida:

Inserte la descripción de la imagen aquíDesde el resultado de salida, el eje de coordenadas no se dibuja desde el origen, modifique el código

2.1.1, obtener el eje actual

ax = plt.gca()
# spines是指坐标图四周的框
# 获取你想要挪动的坐标轴,这里只有顶部、底部、左、右四个方向参数
ax.xaxis.set_ticks_position('bottom')  #  要挪动底部的X轴,所以先目光锁定底部!
# 在这里,position位置参数有三种,这里用到了“按Y轴刻度位置挪动”
# 'data'表示按数值挪动,其后数字代表挪动到Y轴的刻度值
ax.spines['bottom'].set_position(('data', 0))

Por defecto, hay un borde alrededor del sistema de coordenadas. Este borde se llama espinas. La línea negra seleccionada por el cuadro rojo en la figura siguiente se llama borde.
Inserte la descripción de la imagen aquíEstos cuatro bordes se pueden ocultar por color. Configure el color como incoloro para esconder

ax.spines['right'].set_color('none')

El código no usa pyplot de matplotlib para dibujar, pero usa el método pandas.DataFrame.plot () para dibujar
método de dibujo plt

plt.figure(figsize = (5,5))
plt.plot()  # 画个只有坐标系的图(因为没有传参数,所以显示空白)

Introducción a pandas.DataFrame.plot () El
uso del método de trazado de DataFrame para dibujar una imagen dibujará una curva de acuerdo con cada columna de los datos. De forma predeterminada, la leyenda se muestra en la posición adecuada de acuerdo con el nombre de la columna, lo que ahorra tiempo que el dibujo de matplotlib, y los datos en formato DataFrame son más estandarizados, convenientes para la vectorización y el cálculo.
Función DataFrame.plot ():

DataFrame.plot(x=None, y=None, kind='line', ax=None, subplots=False, 
                sharex=None, sharey=False, layout=None, figsize=None, 
                use_index=True, title=None, grid=None, legend=True, 
                style=None, logx=False, logy=False, loglog=False, 
                xticks=None, yticks=None, xlim=None, ylim=None, rot=None, 
                fontsize=None, colormap=None, position=0.5, table=False, yerr=None, 
                xerr=None, stacked=True/False, sort_columns=False, 
                secondary_y=False, mark_right=True, **kwds)

Nota: Cada tipo de gráfico tiene un método correspondiente
df.plot (kind = 'line') es equivalente a df.plot.line ()
Introducción de parámetros

  • x: etiqueta o posición, por defecto Ninguno # se refiere a la etiqueta o parámetro de posición de la columna de datos

  • y: etiqueta, posición o lista de etiquetas, posiciones, predeterminado Ninguno

  • kind: str #
    Tipo de dibujo 'línea': gráfico de líneas (predeterminado) # Gráfico de líneas'bar ': gráfico de
    barras verticales # Gráfico de barras. Cuando apilado es Verdadero, es un histograma apilado
    'barh': gráfico de barra horizontal # gráfico de barra horizontal 'hist':
    histograma # histograma (distribución de frecuencia numérica)
    'caja': diagrama de caja # diagrama de caja
    ' kde ': gráfico de estimación de densidad del núcleo # Gráfico de densidad, principalmente agregue la línea de densidad de probabilidad del núcleo
    ' densidad ' al histograma : igual que
    'kde''area': gráfico de área # y el gráfico de área (gráfico de área) encerrado por el eje x. Cuando apilada = Verdadero, cada columna debe
    contener valores positivos o negativos. Cuando apilada = Falso, no hay ningún requisito para data'pie ': gráfico circular # gráfico circular. El valor debe ser un valor positivo y es necesario especificar el eje Y o las subparcelas = True'scatter
    ': scatter plot # scatter plot. Es necesario especificar el eje X del eje
    Y'hexbin ': hexbin plot # Honeycomb map. Es necesario especificar el eje X eje Y eje
    : objeto de ejes matplotlib, predeterminado Ninguno # Subgrafo (ejes, también se puede entender como eje) El objeto de la subparcela matplotlib sobre el que se dibujará. Si no se establece, se usa la subparcela actual de matplotlibEntre ellos, las variables y funciones describen la figura y los ejes juntos cambiando los elementos en la figura y los ejes (por ejemplo: título, etiqueta, punto y línea, etc.), es decir, dibujar en el lienzo.

  • subparcelas: booleano, predeterminado Falso # Si se deben hacer subtramas para las columnas por separado

  • sharex: booleano, predeterminado Verdadero si ax es Ninguno más Falso # Si ax es Ninguno, el valor predeterminado es Verdadero, de lo contrario es Falso

  • sharey: booleano, predeterminado Falso # Si hay un subgrafo, el subgrafo comparte la escala del eje y, etiqueta

  • figsize: una tupla (ancho, alto) en pulgadas # Tamaño de imagen

  • use_index: booleano, predeterminado True # Use el índice como eje x por defecto

  • title: string # La cadena de título de la imagen

Lo anterior es una introducción a algunos de los parámetros del extracto Para el contenido específico de la función, puede hacer clic en el enlace para consultar el resumen de otros.

2.2, Convergencia y divergencia de la media móvil MACD

Nombre de la función: Nombre MACD
: Suavización de la media móvil de convergencia y divergencia
Introducción: Utilice la agregación y separación entre la media móvil exponencial a corto plazo (normalmente 12 días) del precio de cierre y la media móvil exponencial a largo plazo (normalmente 26 días) promedio de compra Indicadores técnicos para emitir juicios sobre el momento de compra y venta.
Método de llamada de función:

macd, macdsignal, macdhist = MACD(close, fastperiod=12, slowperiod=26, signalperiod=9)

MACD es la línea DIFF y su respuesta será más rápida.

MACDsinal es la línea DEA y su respuesta será más lenta.

Y MACDhist es una columna en el eje x.
Ejemplo uno

import numpy as np
import talib as ta
from talib import MA_Type
import pandas as pd
import jqdatasdk as jq
from matplotlib import pyplot as plt
from pylab import mpl
# 聚宽平台权限验证
jq.auth('19935162681', 'ByKy19935162681')
# 聚宽平台获取股价
close = jq.get_price('601899.XSHG',
                     start_date='2020-10-14',
                     end_date='2021-01-20',
                     frequency='1d',
                     fq='pre')
# macd为DIFF线,macdsignal为DEA线,macdhist为MACD柱状线
macd, macdsignal, macdhist = ta.MACD(close["close"],
                                     fastperiod=12,
                                     slowperiod=26,
                                     signalperiod=9)
close['DIFF'] = macd
close['DEA'] = macdsignal
close['hists'] = macdhist
# 画线,由于三条线是两种类型,需要单画
df=close.loc['2020-11-30':'2021-01-21', 'DIFF':]
with pd.plotting.plot_params.use('x_compat', True): #方法一
  df.DIFF.plot(figsize=(16, 6))
  df.DEA.plot()
  #df.hists.plot.bar(width=0.1)
  df.hists.plot()
print(df)
mpl.rcParams['font.sans-serif'] = [
    'SimHei'
]  # 使图形中的中文正常编码显示,其中,sans-serif 表示字体中的无衬线体,SimHe 是 黑体

ax = plt.gca()

ax.spines['right'].set_color('none')

ax.spines['top'].set_color('none')

plt.title('MACD平滑异同移动平均线', fontsize=15)

plt.xlabel('')

plt.show()

Resultado de salida:
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/u011930054/article/details/112944314
Recomendado
Clasificación