跳至正文
返回文库全部文档

快慢简单移动平均线生成每日股票信号

代码 Lumibot strategies

总结

这项每日股票策略比较收盘价的快速简单移动平均线和较慢的简单移动平均线。当快速均线高于慢速均线且没有持仓时,策略买入,仓位数量根据大部分投资组合价值计算。当快速均线跌至慢速均线下方时,策略卖出全部持仓。示例使用一只股票、可配置的均线周期、历史价格 K 线,并在指定日期范围内与广泛市场基准进行回测。

该规则是基础的趋势跟踪信号,文档没有报告回测结果,也没有盈利证据。它在每次迭代时检查均线的相对位置,而非确认是否刚刚发生交叉,因此可能在交叉日之后才入场。仓位规模可能让几乎全部投资组合价值集中在一只股票上,而示例未说明交易成本、滑点、止损规则或其他风险控制措施。示例指定了用于比较的基准,但没有提供比较结果。

核心观点

  • 当快速收盘价 SMA 高于慢速 SMA 且当前没有持仓时,策略买入。
  • 当快速 SMA 低于慢速 SMA 时,策略平掉全部股票持仓。
  • 仓位规模根据几乎全部投资组合价值和最新价格计算。
  • 示例指定了历史回测区间和市场基准,但没有给出结果。
  • 规则没有明确检测均线交叉,也未说明交易成本处理和更全面的风险控制措施。

标签

全文
# 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",
    )

```

在遵守原作品许可的前提下,附作者信息全文展示。 许可协议: MIT

此摘要由 Stratmill 研究智能体根据原文撰写,并非原文副本。