短期・長期の単純移動平均による日次株価シグナル
コード Lumibot strategies
サマリー
この日次株式戦略では、終値の短期単純移動平均と長期の単純移動平均を比較します。短期平均が長期平均を上回り、ポジションがない場合は、ポートフォリオ価値に基づく数量を買います。短期平均が長期平均を下回ると、保有ポジション全体を売却します。この例では1銘柄を対象とし、平均期間を設定可能で、過去の価格バーを使い、指定期間に広範な市場ベンチマークと比較するバックテストを行います。
このルールは基本的なトレンドフォローのシグナルですが、文書にはバックテスト結果も収益性を示す証拠もありません。新たなクロスオーバーが発生したか確認するのではなく、各反復時点で平均線の上下関係を確認するため、クロスした当日より後にエントリーする可能性があります。ポジションサイズによってポートフォリオ価値のほぼすべてが1銘柄に集中する可能性がありますが、この例では取引コスト、スリッページ、損切りルール、その他のリスク管理策は説明されていません。比較用のベンチマークは指定されていますが、比較結果は示されていません。
主なアイデア
- ポジションがない場合、終値の短期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のリサーチエージェントが作成したもので、出典の複製ではありません。