Skip to content

Release: merge dev into main#475

Merged
MDUYN merged 20 commits into
mainfrom
dev
Apr 24, 2026
Merged

Release: merge dev into main#475
MDUYN merged 20 commits into
mainfrom
dev

Conversation

@MDUYN
Copy link
Copy Markdown
Collaborator

@MDUYN MDUYN commented Apr 24, 2026

MDUYN added 20 commits April 22, 2026 17:06
- Add YahooOHLCVDataProvider class for stocks, ETFs, indices, forex, and crypto
- Support market='YAHOO' in DataSource to auto-select Yahoo provider
- Implement has_data, get_data, prepare_backtest_data, get_backtest_data, copy
- Map framework TimeFrame values to yfinance intervals
- Register as default data provider alongside CCXT
- Add comprehensive unit tests with mocked yfinance
- Add AlphaVantageOHLCVDataProvider (market='ALPHA_VANTAGE') with API key via MarketCredential
- Add PolygonOHLCVDataProvider (market='POLYGON') with API key via MarketCredential
- Both follow same pattern as Yahoo/CCXT: auto-selected based on market value
- Add alpha_vantage and polygon-api-client dependencies
- Register both as default data providers
- Add comprehensive unit tests (32 tests with mocked external calls)
Introduce an intermediate base class OHLCVDataProviderBase that handles
all shared OHLCV data provider logic:
- Constructor, copy(), get_data(), prepare_backtest_data(), get_backtest_data()
- CSV storage helpers, date range resolution, number of data points
- Fixes bug: create_start_date was missing from Yahoo/AV/Polygon providers

Concrete providers now only implement:
- market_name, timeframe_map (class attributes)
- _download_ohlcv() (API-specific download)
- _validate_symbol() (optional, Yahoo only)

Reduces Yahoo/AlphaVantage/Polygon from ~1,851 lines to ~1,033 total (44% reduction).
CCXT intentionally excluded (different pattern: exchange-based detection, pagination, ticker support).
- Remove unused imports (F401) in alpha_vantage, polygon, yahoo, ohlcv_base
- Fix CSVOHLCVDataProvider __init__ docstring placement
- Fix PandasOHLCVDataProvider docstring: 'CSV file' -> 'pandas DataFrame'
- Add custom data providers documentation
- Update data sources docs with market info and links
- Move yfinance, alpha_vantage, polygon-api-client from required to optional deps
- Add poetry extras: [yahoo], [alpha_vantage], [polygon], [all]
- Use lazy imports with placeholder classes that raise helpful ImportError
- Only include available providers in get_default_data_providers()
- Update installation docs with extras install commands
- Add install hints to each provider section in data-sources docs
The metrics module imported yfinance at module level, which broke
the entire framework when yfinance was not installed (now optional).
Move import inside get_risk_free_rate_us() with graceful fallback.
Instead of returning None, fall back to a 4% default rate so
metrics like Sortino/Sharpe ratios work without yfinance installed.
…a-provider

feat: add Yahoo Finance OHLCV data provider
- Add BaseURLDataProvider with shared caching, refresh intervals,
  date parsing, and pre/post-processing logic
- Add CSVURLDataProvider, JSONURLDataProvider, ParquetURLDataProvider
- Add DataSource.from_csv(), from_json(), from_parquet() factory methods
- Add context.fetch_csv(), fetch_json(), fetch_parquet() on-demand methods
- Fix cache path resolution for cloud deployments (AWS Lambda / Azure Functions)
- Add 43 tests covering all three providers
- Add external-data.md documentation page
- Update README with external data capabilities

Closes #458
…viders

feat: add CSV, JSON, and Parquet URL data providers
…ement

- Add Blotter ABC with place_order, cancel_order, batch_order, and transaction recording
- Add SimulationBlotter with configurable slippage and commission models
- Add SlippageModel (NoSlippage, PercentageSlippage, FixedSlippage)
- Add CommissionModel (NoCommission, PercentageCommission, FixedCommission)
- Add Transaction data class for trade documentation
- Integrate blotter into App (set_blotter/get_blotter) and Context (batch_order/get_transactions)
- Add 43 unit tests

Closes #457
…e docs

- Add DefaultBlotter as pass-through blotter for live trading
- Refactor SimulationBlotter to call order_service.create() directly
- Route all Context order methods through the Blotter
- Refactor create_limit_buy/sell_order to delegate to create_limit_order
- Remove conditional blotter checks (always set via App)
- Auto-set DefaultBlotter (live) or SimulationBlotter (backtest)
- Remove unused OrderType import (flake8)
- Add Blotter documentation page (Advanced Concepts)
- Update sidebar navigation
- Update tests (48 passing)
…fix cancel_order - Delete dead BacktestOrderExecutor (was never called) - Route TradeOrderEvaluator SL/TP orders through blotter via _create_order() - Pass blotter+context to TradeOrderEvaluator in App and BacktestService - Fix cancel_order tests to match delegate-to-order_service pattern - Fix OrderBacktestService.cancel_order pre-existing bug - Clean up commented BacktestOrderExecutor refs in test_eventloop - 1423 passed, 42 skipped
- Move slippage/commission from order creation to fill time in
  SimulationBlotter, eliminating double-counting
- Add VolumeImpactSlippage model (power-law market impact)
- Add FillModel ABC with FullFill and VolumeBasedFill for partial
  fill simulation
- Refactor BacktestTradeOrderEvaluator to delegate to blotter
  methods (get_fill_price, get_fill_commission, get_fill_amount,
  on_fill) with TradingCost fallback
- Record transactions at fill time via blotter.on_fill()
- Clean test_eventloop.py: remove ~500 lines of commented-out code
- Update test_blotter.py for new fill-time architecture
feat: Blotter System for Trade Documentation and Order Book Management
- Add FXRateProvider ABC and StaticFXRateProvider implementation
- Wire FX rate provider and base currency into App and Context
- Add context.get_fx_rate(), convert_to_base_currency(), get_portfolio_value()
- Auto-convert multi-market portfolio values to base currency
- StaticFXRateProvider supports inverse rates and case-insensitive lookups
- Add 17 unit tests for FX models
- Add docs page for FX conversion (Advanced Concepts)
@MDUYN MDUYN merged commit 8b39aad into main Apr 24, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant