Overall Statistics
Total Orders
2
Average Win
0%
Average Loss
0%
Compounding Annual Return
0.328%
Drawdown
0.000%
Expectancy
0
Start Equity
100000
End Equity
100039.32
Net Profit
0.039%
Sharpe Ratio
-42.2
Sortino Ratio
-54.579
Probabilistic Sharpe Ratio
63.429%
Loss Rate
0%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
-0.054
Beta
0.011
Annual Standard Deviation
0.001
Annual Variance
0
Information Ratio
-1.873
Tracking Error
0.101
Treynor Ratio
-4.779
Total Fees
$2.00
Estimated Strategy Capacity
$7500000.00
Lowest Capacity Asset
SPY R735QTJ8XC9X
Portfolio Turnover
0.03%
from AlgorithmImports import *

class KalmanFilterStatisticalArbitrageDemo(QCAlgorithm):
    
    def initialize(self) -> None:
        self.set_start_date(2025, 1, 1)
        self.spy = self.add_equity("SPY", extended_market_hours=True).symbol

        self.order_properties = InteractiveBrokersOrderProperties()
        self.order_properties.time_in_force = TimeInForce.DAY
        self.order_properties.outside_regular_trading_hours = True

    def on_data(self, slice):
        if not self.portfolio.invested \
        and self.spy in slice \
        and not self.is_market_open(self.spy) \
        and self.securities[self.spy].exchange.hours.is_open(self.time, extended_market_hours=True):
            self.limit_order(self.spy, 1, slice[self.spy].close, order_properties=self.order_properties)