Open
Description
Bug Report
BacktestNode fails using Remote Catalog (AWS S3). I was able to store the data in the S3 Bucket using ParquetDataCatalog
with the configuration:
ParquetDataCatalog(path="",fs_protocol='s3',show_query_paths=True, fs_storage_options={
"key": os.environ.get("DATA_CATALOG_API_KEY"),
"secret": os.environ.get("DATA_CATALOG_API_SECRET"),
"client_kwargs": {
"endpoint_url": os.environ.get("DATA_CATALOG_ENDPOINT")
}
})
Code Snippets or Logs
Strategy:
import datetime as dt
from nautilus_trader.common.enums import LogColor
from nautilus_trader.model.data import Bar
from nautilus_trader.model.data import BarType
from nautilus_trader.trading.strategy import Strategy
from nautilus_trader.config import StrategyConfig
class DemoStrategyConfig(StrategyConfig, frozen=True):
bar_type: str
# This is a trivial demo strategy that simply counts all processed 1-minute bars.
class DemoStrategy(Strategy):
def __init__(self, config: DemoStrategyConfig):
super().__init__()
self.primary_bar_type = BarType.from_str(config.bar_type)
self.bars_processed = 0
self.start_time = None
self.end_time = None
def on_start(self):
# Remember and log start time of strategy
self.start_time = dt.datetime.now()
self.log.info(f"Strategy started at: {self.start_time}")
# Subscribe to bars
self.subscribe_bars(self.primary_bar_type)
def on_bar(self, bar: Bar):
self.bars_processed += 1
self.log.info(f"Processed bars: {self.bars_processed}", color=LogColor.YELLOW)
def on_stop(self):
# Remember and log end time of strategy
self.end_time = dt.datetime.now()
self.log.info(f"Strategy finished at: {self.end_time}")
# Log count of processed bars
self.log.info(f"Total bars processed: {self.bars_processed}")
Backtest:
data = [
BacktestDataConfig(
data_cls=Bar,
bar_types=["BTCUSDT-PERP.BINANCE-1-HOUR-LAST-EXTERNAL"],
catalog_path="",
catalog_fs_protocol="s3",
catalog_fs_storage_options={
"key": os.environ.get("DATA_CATALOG_API_KEY"),
"secret": os.environ.get("DATA_CATALOG_API_SECRET"),
"client_kwargs": {
"endpoint_url": os.environ.get("DATA_CATALOG_ENDPOINT")
}
}
)
]
venues = [
BacktestVenueConfig(
name="BINANCE",
oms_type="HEDGING",
account_type="MARGIN",
base_currency="USD",
starting_balances=["1000000 USD"],
# fill_model=fill_model, # TODO: Implement
)
]
strategies = [
ImportableStrategyConfig(
strategy_path="demo_strategy:DemoStrategy",
config_path="demo_strategy:DemoStrategyConfig",
config={
"bar_type": "BTCUSDT-PERP.BINANCE-1-HOUR-LAST-EXTERNAL",
},
),
]
run_config = BacktestRunConfig(
engine=BacktestEngineConfig(
strategies=strategies
),
data=data,
venues=venues,
chunk_size=5_000,
)
configs = [run_config]
node = BacktestNode(configs=configs)
results = node.run()
print(results)
node.dispose()
Error:
BACKTESTER-001.BacktestNode: Error running backtest
AssertionError(Only file:// protocol is supported for Rust queries)
Traceback (most recent call last):
File "/workspace/.venv/lib/python3.12/site-packages/nautilus_trader/backtest/node.py", line 214, in run
result = self._run(
^^^^^^^^^^
File "/workspace/.venv/lib/python3.12/site-packages/nautilus_trader/backtest/node.py", line 268, in _run
self._run_streaming(
File "/workspace/.venv/lib/python3.12/site-packages/nautilus_trader/backtest/node.py", line 397, in _run_streaming
session = catalog.backend_session(
^^^^^^^^^^^^^^^^^^^^^^^^
File "/workspace/.venv/lib/python3.12/site-packages/nautilus_trader/persistence/catalog/parquet.py", line 640, in backend_session
assert self.fs_protocol == "file", "Only file:// protocol is supported for Rust queries"
Specifications
- OS platform: Using devcontainer (docker) python:3.12-slim
- Python version: 3.12
nautilus_trader
version: 1.217.0
Metadata
Metadata
Assignees
Labels
No labels