Señales diarias de acciones con medias móviles simples
Resumen
Esta estrategia diaria para acciones compara una media móvil simple rápida de los precios de cierre con otra más lenta. Compra cuando la media rápida está por encima de la lenta y no hay ninguna posición abierta, usando una cantidad calculada a partir de la mayor parte del valor de la cartera. Vende toda la posición cuando la media rápida cae por debajo de la lenta. El ejemplo usa una acción, periodos de cálculo configurables, barras de precios históricos y un backtest frente a un índice de mercado amplio durante un periodo especificado.
La regla es una señal básica de seguimiento de tendencia, y el documento no informa de resultados de backtest ni aporta pruebas de rentabilidad. En cada iteración comprueba el orden de las medias, en lugar de verificar que haya ocurrido un cruce nuevo, por lo que puede entrar después del día del cruce. El tamaño de la posición puede concentrar casi todo el valor de la cartera en una acción, y el ejemplo no explica los costes de transacción, el slippage, las reglas de stop ni otros controles de riesgo. Se especifica un índice de referencia para la comparación, pero no se ofrece ningún resultado comparativo.
Ideas clave
- La estrategia compra cuando la SMA rápida de los precios de cierre está por encima de la SMA lenta y no hay ninguna posición abierta.
- Cierra toda la posición en acciones cuando la SMA rápida está por debajo de la SMA lenta.
- El tamaño de la posición se calcula a partir de casi todo el valor de la cartera y del último precio.
- El ejemplo especifica un periodo histórico de backtest y un índice de referencia de mercado, pero no ofrece resultados.
- Las reglas omiten la detección explícita de cruces, el tratamiento de los costes de transacción y controles de riesgo más amplios.
Etiquetas
Texto completo
# sma_crossover.py
```py
"""
SMA Crossover
Asset class: Stocks
Data source: Yahoo Finance (free)
Description: Classic moving average crossover strategy. Buys when fast SMA
crosses above slow SMA, sells when it crosses below.
"""
from datetime import datetime
from lumibot.strategies import Strategy
from lumibot.backtesting import YahooDataBacktesting
class SmaCrossover(Strategy):
parameters = {
"symbol": "AAPL",
"fast_period": 10,
"slow_period": 30,
}
def initialize(self):
self.sleeptime = "1D"
def on_trading_iteration(self):
symbol = self.parameters["symbol"]
fast = self.parameters["fast_period"]
slow = self.parameters["slow_period"]
bars = self.get_historical_prices(symbol, slow + 5)
if bars is None:
return
df = bars.df
sma_fast = df["close"].rolling(fast).mean().iloc[-1]
sma_slow = df["close"].rolling(slow).mean().iloc[-1]
has_position = self.get_position(symbol) is not None
if sma_fast > sma_slow and not has_position:
price = self.get_last_price(symbol)
quantity = int(self.portfolio_value * 0.95 // price)
if quantity > 0:
order = self.create_order(symbol, quantity, "buy")
self.submit_order(order)
self.log_message(f"BUY {quantity} {symbol} (fast SMA {sma_fast:.2f} > slow SMA {sma_slow:.2f})")
elif sma_fast < sma_slow and has_position:
self.sell_all()
self.log_message(f"SELL ALL {symbol} (fast SMA {sma_fast:.2f} < slow SMA {sma_slow:.2f})")
if __name__ == "__main__":
SmaCrossover.backtest(
YahooDataBacktesting,
datetime(2020, 1, 1),
datetime(2024, 1, 1),
benchmark_asset="SPY",
)
```Se muestra íntegramente con atribución según la licencia de la fuente. Licencia: MIT
Este resumen lo redactó el agente de investigación de Stratmill a partir del original; no es una copia de la fuente.