Environment Variables¶
LumiBot supports configuring many behaviors via environment variables. This page documents the variables most commonly used for backtesting, ThetaData, and remote caching.
Important
Never commit secrets (API keys, passwords, AWS secret keys) into any repo or docs. Document variable names and semantics only.
Backtesting configuration¶
IS_BACKTESTING¶
Purpose: Signals backtesting mode for certain code paths.
Values:
True/False(string).
BACKTESTING_START / BACKTESTING_END¶
Purpose: Default date range used when dates are not passed in code.
Format:
YYYY-MM-DD
BACKTESTING_DATA_SOURCE¶
Purpose: Select the backtesting datasource even if your code passes a `datasource_class`.
Values (case-insensitive): -
thetadata,yahoo,polygon,alpaca,ccxt,databento-noneto disable the env override and rely on code.
Backtest artifacts + UX flags¶
SHOW_PLOT / SHOW_INDICATORS / SHOW_TEARSHEET¶
Purpose: Enable/disable artifact generation.
Values:
True/False(string).
BACKTESTING_QUIET_LOGS¶
Purpose: Reduce log noise during backtests.
Values:
true/false(string).
BACKTESTING_SHOW_PROGRESS_BAR¶
Purpose: Enable progress bar updates.
Values:
true/false(string).
Backtest progress file (BotSpot/BotManager UI)¶
LOG_BACKTEST_PROGRESS_TO_FILE¶
Purpose: When truthy, write
logs/progress.csvduring backtests so BotManager/BotSpot can show live progress.Values: truthy enables (
1,true,yes); unset/0disables.Notes: - On startup, LumiBot writes an initial
progress.csvrow immediately to reduce “time-to-first-progress” latency for short backtests. - In BotManager, a background thread watches/app/logs/*progress.csvand uploads the most recent row to DynamoDB.
BACKTESTING_PROGRESS_HEARTBEAT¶
Purpose: Enable periodic
progress.csvupdates while a ThetaData download is active (prevents the UI appearing stuck when simulation datetime is not advancing).Values:
true/false(string).Default: enabled (
true).
BACKTESTING_PROGRESS_HEARTBEAT_SECONDS¶
Purpose: Heartbeat interval (seconds) for writing
progress.csvwhile downloading.Values: float seconds (string).
Default:
2.0
Trade audit telemetry (accuracy investigations)¶
LUMIBOT_BACKTEST_AUDIT¶
Purpose: Emit per-fill audit telemetry into the trade-event CSV as
audit.*columns.Values:
1enables (any truthy value); unset/0disables.Output: - Writes a full trade-event export
*_trade_events.csvwithaudit.*columns (for example, quote bid/ask snapshots, bar OHLC, SMART_LIMIT inputs, and multileg linkage).Notes: - This increases CSV width and can add overhead; keep it enabled only when you need a full audit trail.
Profiling (performance + parity investigations)¶
BACKTESTING_PROFILE¶
Purpose: Enable profiling during backtests to attribute runtime (S3 IO vs compute vs artifacts).
Values: -
yappi(supported)Output: - Produces a
*_profile_yappi.csvartifact alongside other backtest artifacts.
ThetaData via remote downloader¶
DATADOWNLOADER_BASE_URL¶
Purpose: Points LumiBot at a remote downloader service that can fetch ThetaData on demand.
Example:
http://data-downloader.lumiwealth.com:8080
DATADOWNLOADER_API_KEY / DATADOWNLOADER_API_KEY_HEADER¶
Purpose: Authentication for the downloader service.
Values: provided by your runtime environment (do not hardcode).
DATADOWNLOADER_SKIP_LOCAL_START¶
Purpose: Prevent any local downloader/ThetaTerminal bootstrap logic from running (production backtests must use the remote downloader).
Values:
1/trueenable; unset/0disable.
ThetaData option-chain building (performance)¶
THETADATA_CHAIN_DEFAULT_MAX_DAYS_OUT¶
Purpose: Bounds the default option-chain expiration window for equity underlyings to reduce strike-list fanout in cold caches/backtests.
Values: integer days.
Default:
730(2 years).Notes: set to
0to disable the default bound (fetch all expirations).
THETADATA_CHAIN_DEFAULT_MAX_DAYS_OUT_INDEX¶
Purpose: Same as
THETADATA_CHAIN_DEFAULT_MAX_DAYS_OUT, but for index-like underlyings (SPX/NDX/VIX/etc) with dense expiration schedules.Values: integer days.
Default:
180.Notes: set to
0to disable the default bound.
THETADATA_CHAIN_RECENT_FILE_TOLERANCE_DAYS¶
Purpose: Local chain cache file reuse window (equities) when no chain hints are in effect.
Values: integer days.
Default:
7.
THETADATA_CHAIN_STRIKES_TIMEOUT¶
Purpose: Downloader wait timeout per strike-list request when building chains.
Values: seconds (float).
Default:
300.
THETADATA_CHAIN_STRIKES_BATCH_SIZE¶
Purpose: Number of in-flight strike-list requests when building chains.
Values: integer.
Default:
0(use queue client concurrency).
ThetaData corporate action normalization (accuracy)¶
THETADATA_APPLY_CORPORATE_ACTIONS_INTRADAY¶
Purpose: Apply split/dividend adjustments to intraday frames (minute/second/hour) in backtests so intraday prices match daily split-adjusted prices and option-chain strike normalization stays consistent.
Values:
1/trueenable;0/falsedisable.Default: - enabled when
IS_BACKTESTINGis truthy - disabled otherwiseNotes: - Disabling can break options strike selection around splits (example: NVDA 10-for-1 split on 2024-06-10).
Remote cache (S3)¶
LUMIBOT_CACHE_BACKEND / LUMIBOT_CACHE_MODE¶
Purpose: Enable remote cache mirroring (for example, mirroring parquet cache files to S3).
Common values: -
LUMIBOT_CACHE_BACKEND=s3-LUMIBOT_CACHE_MODE=readwrite(orreadonly)
LUMIBOT_CACHE_FOLDER¶
Purpose: Override the local cache folder (useful to simulate a fresh container/task).
LUMIBOT_CACHE_S3_BUCKET / LUMIBOT_CACHE_S3_PREFIX / LUMIBOT_CACHE_S3_REGION¶
Purpose: S3 target configuration.
LUMIBOT_CACHE_S3_VERSION¶
Purpose: Namespace/version the remote cache without deleting anything.
Practical use: set a unique version to simulate a “cold S3” run safely.
LUMIBOT_CACHE_S3_ACCESS_KEY_ID / LUMIBOT_CACHE_S3_SECRET_ACCESS_KEY / LUMIBOT_CACHE_S3_SESSION_TOKEN¶
Purpose: Credentials for S3 access when not using an instance/task role.
Values: provided by your runtime environment (do not hardcode).
For cache key layout and validation workflow, see Backtesting and the engineering notes in docs/remote_cache.md.
Strategy configuration¶
STRATEGY_NAME¶
Purpose: Name for the strategy to be used in database logging and identification.
Values: Any string.
MARKET¶
Purpose: Market to be traded (used for market calendar selection).
Values:
NYSE,NASDAQ,24/7(crypto), etc.
HIDE_TRADES / HIDE_POSITIONS¶
Purpose: Hide trade and position information in logs/output.
Values:
true/false(string).Default:
false.
DISCORD_WEBHOOK_URL¶
Purpose: Discord webhook URL for notifications.
Values: Full Discord webhook URL (do not hardcode in public repos).
Database configuration¶
DB_CONNECTION_STR¶
Purpose: PostgreSQL connection string for account history and strategy persistence.
Values:
postgresql://user:password@host:port/database(do not hardcode).Note: Replaces deprecated
ACCOUNT_HISTORY_DB_CONNECTION_STR.
LOG_BACKTEST_PROGRESS_TO_FILE¶
Purpose: Log backtest progress to a file instead of stdout.
Values:
true/false(string).
Broker selection¶
TRADING_BROKER¶
Purpose: Explicitly specify which broker to use for live trading.
Values (case-insensitive): -
alpaca,tradier,ccxt,coinbase,kraken-ib,interactivebrokers,ibrest,interactivebrokersrest-tradovate,schwab,bitunix-projectx,projectx-topstepx,projectx-topone, etc.Note: If not set, broker is auto-detected based on available credentials.
DATA_SOURCE¶
Purpose: Explicitly specify which data source to use.
Values (case-insensitive): -
alpaca,tradier,polygon,yahoo,thetadata,databento-ccxt,coinbase,kraken,schwab,bitunix,projectxNote: If not set, uses broker’s default data source.
Alpaca broker¶
ALPACA_API_KEY / ALPACA_API_SECRET¶
Purpose: Alpaca API credentials for trading.
Values: Obtain from Alpaca dashboard (do not hardcode).
ALPACA_OAUTH_TOKEN¶
Purpose: OAuth token (alternative to API key/secret).
Values: OAuth token (do not hardcode).
Note: Either OAuth token OR API key/secret must be provided, not both.
ALPACA_IS_PAPER¶
Purpose: Toggle between paper and live trading.
Values:
true(paper) /false(live).Default:
true(paper trading).
Tradier broker¶
TRADIER_ACCESS_TOKEN¶
Purpose: Tradier API access token.
Values: Obtain from Tradier dashboard (do not hardcode).
TRADIER_ACCOUNT_NUMBER¶
Purpose: Tradier account number for trading.
Values: Your Tradier account number.
TRADIER_IS_PAPER¶
Purpose: Toggle between paper and live trading.
Values:
true(paper) /false(live).Default:
true(paper trading).
Interactive Brokers¶
INTERACTIVE_BROKERS_PORT¶
Purpose: Socket port for IB Gateway/TWS connection.
Values: Integer (e.g.,
7497for paper,7496for live).
INTERACTIVE_BROKERS_CLIENT_ID¶
Purpose: Client ID for IB connection (must be unique per connection).
Values: Integer.
INTERACTIVE_BROKERS_IP¶
Purpose: IP address of IB Gateway/TWS.
Values: IP address string.
Default:
127.0.0.1.
IB_SUBACCOUNT¶
Purpose: Sub-account identifier for IB multi-account setups.
Values: Account identifier string.
Interactive Brokers REST¶
IB_USERNAME / IB_PASSWORD¶
Purpose: Credentials for IB REST API authentication.
Values: IB credentials (do not hardcode).
IB_ACCOUNT_ID¶
Purpose: Account ID for IB REST API.
Values: Account identifier string.
IB_API_URL¶
Purpose: Base URL for IB REST API endpoint.
Values: URL string.
Schwab broker¶
SCHWAB_ACCOUNT_NUMBER¶
Purpose: Schwab account number (required).
Values: Account number string.
SCHWAB_APP_KEY / SCHWAB_APP_SECRET¶
Purpose: Schwab API application credentials.
Values: Obtain from Schwab developer portal (do not hardcode).
SCHWAB_TOKEN¶
Purpose: Optional pre-existing OAuth token.
Values: Token string (do not hardcode).
SCHWAB_BACKEND_CALLBACK_URL¶
Purpose: OAuth callback URL for authentication flow.
Values: URL string.
Tradovate broker¶
TRADOVATE_USERNAME / TRADOVATE_DEDICATED_PASSWORD¶
Purpose: Tradovate credentials.
Values: Tradovate credentials (do not hardcode).
TRADOVATE_APP_ID / TRADOVATE_APP_VERSION¶
Purpose: Application identification for Tradovate API.
Values: String identifiers.
Default:
Lumibot/1.0.
TRADOVATE_CID / TRADOVATE_SECRET¶
Purpose: Client credentials for Tradovate OAuth.
Values: Obtain from Tradovate (do not hardcode).
TRADOVATE_IS_PAPER¶
Purpose: Toggle between paper and live trading.
Values:
true(paper) /false(live).Default:
true.
TRADOVATE_MD_URL¶
Purpose: Market data URL override.
Values: URL string.
Default:
https://md.tradovateapi.com/v1.
Crypto brokers (CCXT)¶
KRAKEN_API_KEY / KRAKEN_API_SECRET¶
Purpose: Kraken exchange API credentials.
Values: Obtain from Kraken (do not hardcode).
COINBASE_API_KEY_NAME / COINBASE_PRIVATE_KEY¶
Purpose: Coinbase Advanced Trade API credentials.
Values: Obtain from Coinbase (do not hardcode).
COINBASE_API_PASSPHRASE¶
Purpose: API passphrase (if required by Coinbase).
Values: Passphrase string (do not hardcode).
COINBASE_SANDBOX¶
Purpose: Use Coinbase sandbox environment.
Values:
true/false.Default:
false.
Bitunix broker¶
BITUNIX_API_KEY / BITUNIX_API_SECRET¶
Purpose: Bitunix exchange API credentials.
Values: Obtain from Bitunix (do not hardcode).
BITUNIX_TRADING_MODE¶
Purpose: Trading mode selection.
Values:
FUTURES/SPOT.Default:
FUTURES.
ProjectX brokers¶
ProjectX supports multiple prop trading firms. Each firm uses a unique prefix pattern.
PROJECTX_FIRM¶
Purpose: Select which ProjectX firm to use.
Values:
TOPSTEPX,TOPONE,TICKTICKTRADER,BULENOX,E8X, etc.
PROJECTX_{FIRM}_API_KEY¶
Purpose: API key for the specified firm.
Example:
PROJECTX_TOPSTEPX_API_KEY,PROJECTX_TOPONE_API_KEYValues: Obtain from firm’s platform (do not hardcode).
PROJECTX_{FIRM}_USERNAME¶
Purpose: Username for the specified firm.
Example:
PROJECTX_TOPSTEPX_USERNAMEValues: Your username on the firm’s platform.
PROJECTX_{FIRM}_PREFERRED_ACCOUNT_NAME¶
Purpose: Preferred account name when multiple accounts exist.
Example:
PROJECTX_TOPSTEPX_PREFERRED_ACCOUNT_NAMEValues: Account name string.
Data source credentials¶
POLYGON_API_KEY¶
Purpose: Polygon.io API key for market data.
Values: Obtain from Polygon.io (do not hardcode).
POLYGON_MAX_MEMORY_BYTES¶
Purpose: Hard limit on memory Polygon can use for caching.
Values: Integer (bytes).
THETADATA_USERNAME / THETADATA_PASSWORD¶
Purpose: ThetaData API credentials.
Values: Obtain from ThetaData (do not hardcode).
Note: Required for ThetaData backtesting and live data.
DATABENTO_API_KEY¶
Purpose: DataBento API key for market data.
Values: Obtain from DataBento (do not hardcode).
DATABENTO_TIMEOUT¶
Purpose: Request timeout for DataBento API calls.
Values: Integer (seconds).
Default:
30.
DATABENTO_MAX_RETRIES¶
Purpose: Maximum retry attempts for failed DataBento requests.
Values: Integer.
Default:
3.
LUMIWEALTH_API_KEY¶
Purpose: LumiWealth platform API key (for enterprise features).
Values: Obtain from LumiWealth (do not hardcode).