Overall Statistics
Total Orders
21
Average Win
1.87%
Average Loss
-0.46%
Compounding Annual Return
5.818%
Drawdown
3.600%
Expectancy
3.074
Start Equity
1000000
End Equity
1152464.18
Net Profit
15.246%
Sharpe Ratio
-0.209
Sortino Ratio
-0.293
Probabilistic Sharpe Ratio
1.226%
Loss Rate
20%
Win Rate
80%
Profit-Loss Ratio
4.09
Alpha
-0.015
Beta
0.01
Annual Standard Deviation
0.065
Annual Variance
0.004
Information Ratio
-0.762
Tracking Error
0.146
Treynor Ratio
-1.362
Total Fees
$39.46
Estimated Strategy Capacity
$160000000000.00
Lowest Capacity Asset
KM Z5O7UGDUMN69
Portfolio Turnover
0.20%
Drawdown Recovery
322
# region imports
from AlgorithmImports import *
# endregion

class Kospi200FuturesAlgorithm(QCAlgorithm):

    def initialize(self) -> None:
        self.set_start_date(2024,2,1)
        self.set_cash(1_000_000)

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

        self._future = self.add_future(Futures.Indices.KOSPI_200,
            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, tag=f'{self._future.mapped.value=}')