Overall Statistics
Total Orders
13
Average Win
17.18%
Average Loss
0%
Compounding Annual Return
80.738%
Drawdown
17.900%
Expectancy
0
Start Equity
100000
End Equity
256528.73
Net Profit
156.529%
Sharpe Ratio
1.284
Sortino Ratio
2.204
Probabilistic Sharpe Ratio
46.723%
Loss Rate
0%
Win Rate
100%
Profit-Loss Ratio
0
Alpha
0.617
Beta
0.144
Annual Standard Deviation
0.491
Annual Variance
0.241
Information Ratio
1.063
Tracking Error
0.506
Treynor Ratio
4.387
Total Fees
$28.73
Estimated Strategy Capacity
$37000000000.00
Lowest Capacity Asset
KM Z5O7UGDUMN69
Portfolio Turnover
1.53%
Drawdown Recovery
79
# region imports
from AlgorithmImports import *
# endregion

class Kospi200FuturesAlgorithm(QCAlgorithm):

    def initialize(self) -> None:
        self.set_start_date(2025, 1, 1)

        self._index = self.add_index("KM", market=Market.KRX)
        self._forex = self.add_forex("USDKRW")

        self._future = self.add_future(
            "KM",
            extended_market_hours=True,
            data_mapping_mode=DataMappingMode.LAST_TRADING_DAY,
            data_normalization_mode=DataNormalizationMode.BACKWARDS_RATIO,
            contract_depth_offset=0
        )
        # Filter to contracts expiring within 6 months (approx 182 days)
        self._future.set_filter(0, 182)

    def on_end_of_day(self, symbol: Symbol):
        if symbol.security_type in [SecurityType.INDEX, SecurityType.FOREX]:
            self.plot(symbol.value, 'EOD', self.securities[symbol].price)

    def on_data(self, data: Slice) -> None:
        if self.is_warming_up or self.portfolio.invested:
            return

        # Get the futures chain for our KM contract
        chain = data.future_chains.get(self._future.symbol)
        if not chain:
            return

        # Sort contracts by expiry and pick the nearest one with data
        contracts = sorted([c for c in chain if (c.expiry-self.time).days>1], key=lambda c: c.expiry)
        if not contracts:
            return

        front = contracts[0]

        # Place order on the front-month contract
        self.market_order(front.symbol, 1)