Skip to content

BacktestNode fails using Remote Catalog (AWS S3) #2677

Open
@aleBurgos

Description

@aleBurgos

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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions