| 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)