Python Cuantitativo

Python Cuantitativo se refiere al proceso de utilizar el lenguaje de programación Python, junto con bibliotecas y herramientas relacionadas, para realizar análisis de datos del mercado financiero, desarrollo de estrategias y ejecución de operaciones.

Python, debido a su simplicidad, facilidad de aprendizaje, poderoso ecosistema y ricas bibliotecas financieras, se ha convertido en uno de los lenguajes de programación preferidos para el comercio cuantitativo.

El comercio cuantitativo se utiliza ampliamente en el ámbito financiero; permite a los operadores formular y ejecutar estrategias de trading mediante métodos sistemáticos, mejorando la eficiencia de las operaciones y la cientificidad de las decisiones.

La cuantificación consiste principalmente en utilizar métodos matemáticos y estadísticos, junto con tecnología informática, para realizar análisis cuantitativos del mercado financiero, y así formular y ejecutar estrategias de trading.

Puedes ver más contenido sobre Python cuantitativo en:Trading cuantitativo con Python。


Ejemplos de aplicación

A continuación, veamos un ejemplo simple de aplicación de Python cuantitativo; podemos usar la estrategia de media móvil y los datos financieros de Yahoo para implementarlo.

La idea básica de esta estrategia es generar señales de compra y venta comparando medias móviles a corto y largo plazo.

Antes de realizar este ejemplo simple, es necesario instalar tres paquetes:

pip install pandas yfinance matplotlib

Descripción de paquetes:

  • Pandas es una biblioteca de código abierto poderosa para el procesamiento y análisis de datos, diseñada específicamente para realizar análisis y operaciones de datos de manera eficiente.
  • yfinance es una biblioteca para obtener datos financieros, que admite la obtención de acciones, índices y otros datos del mercado financiero desde Yahoo Finance.
  • Matplotlib es una biblioteca de trazado 2D utilizada para crear gráficos de visualización de datos estáticos, animados e interactivos.

Obtener datos históricos de acciones

Usando yfinance para obtener datos históricos de acciones, a continuación se muestra un ejemplo simple:

Ejemplo

import yfinance as yf

# Obtener datos de acciones
symbol = "600519.SS"
start_date = "2022-01-01"
end_date = "2023-01-01"

data = yf.download(symbol, start=start_date, end=end_date)
print(data.head())

El resultado de salida es el siguiente:

                  Open         High          Low        Close    Adj Close   Volume
Date                                                                               
2022-01-04  2055.00000  2068.949951  2014.000000  2051.229980  1973.508057  3384262
2022-01-05  2045.00000  2065.000000  2018.000000  2024.000000  1947.309937  2839551
2022-01-06  2022.01001  2036.000000  1938.510010  1982.219971  1907.112915  5179475
2022-01-07  1975.00000  1988.880005  1939.319946  1942.000000  1868.416870  2981669
2022-01-10  1928.01001  1977.000000  1917.550049  1966.000000  1891.507446  2962670

Análisis de datos simple y visualización

Usa pandas para el análisis de datos y matplotlib para la visualización:

Ejemplo

import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt

# Obtener datos de acciones
symbol = "600519.SS"
start_date = "2022-01-01"
end_date = "2023-01-01"

data = yf.download(symbol, start=start_date, end=end_date)
# Análisis de datos simple
print(data.describe())

# Trazar el gráfico de tendencia del precio de las acciones
data['Close'].plot(figsize=(10, 6), label=symbol)
plt.title(f"{symbol} Stock Price")
plt.xlabel("Date")
plt.ylabel("Price")
plt.legend()
plt.show()

El gráfico de tendencia se muestra a continuación:

Backtesting de estrategia de cruce de medias móviles

El backtesting es el proceso de simular y evaluar una estrategia de trading en datos históricos del mercado.

El siguiente es un código de ejemplo de backtesting de una estrategia simple de cruce de medias móviles. La estrategia compra cuando la media móvil de 50 días cruza por encima de la media móvil de 200 días, y vende cuando cruza por debajo. El rendimiento de la estrategia muestra métricas como rendimiento total, rendimiento anualizado y drawdown máximo.

Ejemplo

import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt

# Obtener datos de acciones
symbol = "600519.SS"
start_date = "2021-01-01"
end_date = "2023-01-01"

data = yf.download(symbol, start=start_date, end=end_date)

# Calcular media móvil
data['SMA_50'] = data['Close'].rolling(window=50).mean()
data['SMA_200'] = data['Close'].rolling(window=200).mean()

# Inicializar columna de señales de cruce
data['Signal'] = 0

# Calcular señales de cruce
data.loc[data['SMA_50'] > data['SMA_200'], 'Signal'] = 1
data.loc[data['SMA_50'] < data['SMA_200'], 'Signal'] = -1

# Calcular rendimiento diario
data['Daily_Return'] = data['Close'].pct_change()

# Calcular el rendimiento de la señal de la estrategia (shift(1) es para evitar el sesgo de datos futuros)
data['Strategy_Return'] = data['Signal'].shift(1) * data['Daily_Return']

# Calcular rendimiento acumulado
data['Cumulative_Return'] = (1 + data['Strategy_Return']).cumprod()

# Mostrar rendimiento de la estrategia
strategy_performance = {
    'Total Return': data['Cumulative_Return'].iloc[-1] - 1,
    'Annualized Return': (data['Cumulative_Return'].iloc[-1] ** (252 / len(data))) - 1,
    'Max Drawdown': (data['Cumulative_Return'] / data['Cumulative_Return'].cummax() - 1).min(),
}

print("Rendimiento de la estrategia:")
for key, value in strategy_performance.items():
    print(f"{key}: {value:.4f}")

# Trazar la curva de rendimiento acumulado
plt.figure(figsize=(10, 6))
plt.plot(data['Cumulative_Return'], label='Strategy Cumulative Return', color='b')
plt.plot(data['Close'] / data['Close'].iloc[0], label='Stock Cumulative Return', color='g')
plt.title("Cumulative Return of Strategy vs. Stock")
plt.xlabel("Date")
plt.ylabel("Cumulative Return")
plt.legend()
plt.show()

El gráfico se muestra a continuación:

Ten en cuenta que esto es solo un ejemplo simple; en aplicaciones reales se necesitan estrategias más complejas y más factores a considerar.

Otras extensiones