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