| Overall Statistics |
|
Total Trades 0 Average Win 0% Average Loss 0% Compounding Annual Return 0% Drawdown 0% Expectancy 0 Net Profit 0% Sharpe Ratio 0 Probabilistic Sharpe Ratio 0% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0 Annual Variance 0 Information Ratio -0.913 Tracking Error 0.17 Treynor Ratio 0 Total Fees $0.00 |
from typing import List, Dict
from datetime import timedelta
import pandas as pd
import numpy as np
from QuantConnect import Resolution
from QuantConnect.Algorithm import QCAlgorithm
from QuantConnect.Data import Slice
from QuantConnect.Data.Consolidators import TradeBarConsolidator, DataConsolidator
from QuantConnect.Securities import Futures
from QuantConnect.Securities.Future import Future
from QuantConnect.Data.Market import FuturesContract, FuturesChain, FuturesChains, FuturesContracts, TradeBar
class ParticleTachyonInterceptor(QCAlgorithm):
consolidator_by_symbol = {}
contract_to_parent_map = {}
parent_to_active_map = {}
contracts_info = {}
universe: Dict[str, Future]
universe = {}
db = pd.DataFrame(columns=["parent_symbol", "contract_symbol", "close", "oi", "end_time"])
continuous_futures = pd.DataFrame()
def Initialize(self):
self.SetStartDate(2020, 5, 31)
self.SetEndDate(2020, 10, 31)
self.SetCash(1000000) # Set Strategy Cash
self.universe = {symbol: self.AddFuture(symbol, Resolution.Minute) for symbol in self.tickers}
[future.SetFilter(timedelta(0), timedelta(90)) for future in self.universe.values()]
self.consolidator_by_symbol = {}
self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.At(6, 0), self.morning_routine)
def morning_routine(self):
self.update_continuous_prices()
self.Debug(f"Status update on {self.Time}")
if not self.continuous_futures.empty:
self.Debug(self.continuous_futures.describe().to_string())
def update_continuous_prices(self):
unique_futures = self.db.parent_symbol.unique()
continuous_data = []
if self.db.empty:
return
for symbol in unique_futures:
symbol_data = self.db.loc[self.db.parent_symbol == symbol]
oi = symbol_data.pivot_table(index="end_time", columns="contract_symbol", values="oi")
price = symbol_data.pivot_table(index="end_time", columns="contract_symbol", values="close")
weights = oi.divide(oi.sum(axis=1), axis=0)
combined = (price * weights).sum(axis=1).rename(symbol.Value)
continuous_data.append(combined)
if len(continuous_data) > 0:
self.continuous_futures = pd.concat(continuous_data, axis=1, sort=False)
def OnData(self, data: Slice):
chain: FuturesChain
contracts: FuturesContracts
contract: FuturesContract
sorted_by_oi_contracts: List[FuturesContract]
for chain in data.FutureChains.Values:
contracts = chain.Contracts
if len(contracts) == 0:
continue
sorted_by_oi_contracts = sorted(contracts.Values, key=lambda k: k.OpenInterest, reverse=True)
popular_contracts = sorted_by_oi_contracts[:3]
active_contract = sorted_by_oi_contracts[0]
# Record active contract
self.parent_to_active_map[chain.Symbol] = active_contract.Symbol
# Record popular contracts map
for contract in popular_contracts:
if contract.Symbol not in self.contract_to_parent_map:
self.contract_to_parent_map[contract.Symbol] = chain.Symbol
if contract.Symbol not in self.consolidator_by_symbol:
self.consolidate_future(contract)
self.contracts_info[contract.Symbol] = contract
def consolidate_future(self, contract):
dailyConsolidator = TradeBarConsolidator(timedelta(days=1))
dailyConsolidator.DataConsolidated += self.DailyHandler
self.SubscriptionManager.AddConsolidator(contract.Symbol, dailyConsolidator)
self.consolidator_by_symbol[contract.Symbol] = dailyConsolidator
def DailyHandler(self, sender: DataConsolidator, bar: TradeBar):
contract_symbol = sender.Consolidated.Symbol
parent_symbol = self.contract_to_parent_map[contract_symbol]
end_time = bar.EndTime
close = bar.Close
oi = self.contracts_info[contract_symbol].OpenInterest
data = pd.Series({
"parent_symbol": parent_symbol,
"contract_symbol": contract_symbol,
"close": close,
"oi": oi,
"end_time": end_time
})
self.db = self.db.append(data, ignore_index=True)
@property
def tickers(self):
indices = [
Futures.Indices.SP500EMini,
Futures.Indices.SP400MidCapEmini,
Futures.Indices.Dow30EMini,
Futures.Indices.Russell2000EMini,
Futures.Indices.Nikkei225Dollar,
Futures.Indices.USDDenominatedIbovespa,
Futures.Indices.SPGSCICommodity,
Futures.Indices.BloombergCommodityIndex,
Futures.Indices.VIX,
]
metals = [
Futures.Metals.Gold,
Futures.Metals.Silver,
Futures.Metals.Platinum,
Futures.Metals.Palladium,
Futures.Metals.Copper,
]
grains = [
Futures.Grains.Wheat,
Futures.Grains.Corn,
Futures.Grains.Soybeans,
Futures.Grains.Oats,
]
tickers = indices + metals + grains
return tickers