Commit Graph

88 Commits

Author SHA1 Message Date
Bu5hm4nn
269745cd3e fix: address PR review feedback for validation functions
1. Fix Friday logic edge case comment
   - Clarified get_default_backtest_dates() docstring
   - Removed confusing 'at least a week old' comment
   - Explicitly documented Friday behavior

2. Reorder validation checks in validate_date_range_for_symbol()
   - Now checks start > end first (most fundamental)
   - Then checks end > today (future dates)
   - Finally checks symbol-specific bounds
   - Users get most actionable error first

3. Add server-side numeric bounds validation
   - New validate_numeric_inputs() function
   - Validates units > 0, loan >= 0, 0 < LTV < 1
   - Called in run_backtest() before service call

4. Add boundary tests
   - Test start_date exactly at SYMBOL_MIN_DATES boundary
   - Test same-day date range (start == end)
   - Test end_date exactly today
   - Test end_date tomorrow (future)
   - Test validation order returns most actionable error
   - Test near-zero and large values for units calculation
   - Test LTV at boundaries (0, 1, 0.01, 0.99)

5. Add tests for validate_numeric_inputs
   - Valid inputs, zero/negative values
   - LTV boundary conditions
2026-03-29 19:29:46 +02:00
Bu5hm4nn
f9ea7f0b67 fix: address PR review issues for event comparison and backtests
Critical fixes:
- Add validate_and_calculate_units() helper with proper error handling
- Handle division by zero for entry_spot in refresh_preview() and render_report()
- Add server-side validation for initial_value > 0
- Add try/except for derive_entry_spot() to handle fixture source limitations

Important improvements:
- Add dynamic default dates with get_default_backtest_dates()
- Add validate_date_range_for_symbol() for symbol-specific date bounds
- Add SYMBOL_MIN_DATES validation for backtests
- Update date_range_hint based on selected symbol

Tests:
- Add test_page_validation.py with 21 tests for:
  - validate_and_calculate_units edge cases
  - validate_date_range_for_symbol bounds checking
  - get_default_backtest_dates dynamic generation
  - SYMBOL_MIN_DATES constant verification
2026-03-29 18:45:29 +02:00
Bu5hm4nn
c2af363eef feat(backtests): expand default date range to full Databento availability
- Changed default date range from 5 days (Jan 2024) to 2 years (2022-2023)
- Added SYMBOL_MIN_DATES constant documenting data availability per symbol
- GLD minimum date: 2004-11-18 (ETF launch)
- GC futures minimum date: 1974-01-01
- XAU index minimum date: 1970-01-01
- Added UI hint showing GLD data availability from ETF launch
- Users can now run backtests across the full historical range
2026-03-29 17:53:03 +02:00
Bu5hm4nn
853c80d3a2 feat(event-comparison): use initial portfolio value instead of underlying units
- Changed UI input from 'Underlying units' to 'Initial portfolio value ($)'
- Underlying units are now calculated as initial_value / entry_spot
- Updated default value to workspace gold_value instead of gold_ounces * entry_spot
- Result summary now shows both 'Initial value' and 'Underlying units'
- This allows users to specify how much they invest on day 1, and the system
  automatically calculates the maximum purchasable shares/contracts
2026-03-29 16:12:33 +02:00
Bu5hm4nn
7f347fa2a6 fix(tests): fix BacktestSettingsRepository.load() and workspace seeding tests
- BacktestSettingsRepository.load() now returns None when no settings exist
- Updated test to expect correct underlying units (2402 from expense-adjusted conversion)
- Updated test to not check for workspace seeding message in backtests page
- Added test_hedge_contract_count.py and test_backtest_settings.py to CI test suite
- Build job now depends on lint and test passing
2026-03-29 15:34:49 +02:00
Bu5hm4nn
dc4ee1f261 feat(CONV-001): add GLD launch date validation, feat(DATA-DB-003): add cache CLI
CONV-001:
- Add GLD_LAUNCH_DATE constant (November 18, 2004)
- Validate reference_date in gld_ounces_per_share()
- Raise ValueError for dates before GLD launch
- Update docstring with valid date range
- Add comprehensive test coverage for edge cases

DATA-DB-003:
- Create scripts/cache_cli.py with three commands:
  - vault-dash cache stats: Show cache statistics
  - vault-dash cache list: List cached entries
  - vault-dash cache clear: Clear all cache files
- Add Makefile targets: cache-stats, cache-list, cache-clear
- Integrate with DatabentoHistoricalPriceSource methods
2026-03-29 12:00:30 +02:00
Bu5hm4nn
9a3b835c95 feat(DATA-DB-004): add Databento settings UI and independent scenario config
- Updated backtests page with Data Source card
  - Data source selector (databento/yfinance/synthetic)
  - Dataset dropdown (XNAS.BASIC, GLBX.MDP3)
  - Resolution dropdown (ohlcv-1d, ohlcv-1h)
  - Cost estimate display (placeholder for now)

- Added Scenario Configuration card
  - Underlying symbol selector (GLD/GC/XAU)
  - Start/end date inputs
  - Start price input (0 = auto-derive)
  - Underlying units, loan amount, margin call LTV

- BacktestPageService updates:
  - get_historical_prices() with data_source parameter
  - get_cost_estimate() for Databento cost estimation
  - get_cache_stats() for cache status display
  - Support for injected custom provider identity
  - DataSourceInfo for provider metadata

- BacktestSettingsRepository integration:
  - Load/save settings per workspace
  - Default values from BacktestSettings.create_default()

- Test update: TLT validation message changed to reflect
  new multi-symbol support (GLD, GC, XAU)
2026-03-29 11:12:11 +02:00
Bu5hm4nn
43067bb275 feat(DATA-DB-002): add BacktestSettings model and repository
- BacktestSettings dataclass with all configuration fields
- BacktestSettingsRepository for persistence per workspace
- Settings independent of portfolio configuration
- Full validation for dates, symbols, LTV, etc.
- 16 comprehensive tests

Fields:
- settings_id, name: identification
- data_source: databento|yfinance|synthetic
- dataset, schema: Databento configuration
- start_date, end_date: date range
- underlying_symbol, start_price, underlying_units: position config
- loan_amount, margin_call_ltv: LTV analysis
- template_slugs: strategies to test
- cache_key, data_cost_usd: caching metadata
- provider_ref: provider configuration
2026-03-29 10:46:25 +02:00
Bu5hm4nn
bf13ab5b46 feat(DATA-DB-001): add Databento historical price source for backtesting
- Add DatabentoHistoricalPriceSource implementing HistoricalPriceSource protocol
- Smart caching with Parquet storage and metadata tracking
- Auto symbol-to-dataset resolution (GLD→XNAS.BASIC, GC=F→GLBX.MDP3)
- Cache management with age threshold invalidation
- Cost estimation via metadata.get_cost()
- Add databento>=0.30.0 to requirements.txt
- Add DATABENTO_API_KEY to .env.example
- Full test coverage with 16 tests
2026-03-29 09:58:02 +02:00
Bu5hm4nn
bb06fa7e80 feat(PORTFOLIO-003): add premium and spread for physical gold positions 2026-03-28 23:53:46 +01:00
Bu5hm4nn
0e972e9dd6 feat(PORTFOLIO-002): add position storage costs 2026-03-28 23:48:41 +01:00
Bu5hm4nn
63a8482753 feat(DISPLAY-002): GLD mode shows real share prices 2026-03-28 21:59:15 +01:00
Bu5hm4nn
dac0463d55 feat(DISPLAY-002): GLD mode shows real share prices 2026-03-28 21:45:00 +01:00
Bu5hm4nn
20f5086507 feat(DISPLAY-001): add underlying mode switching 2026-03-28 21:44:32 +01:00
Bu5hm4nn
1a39956757 feat(PORTFOLIO-001): add position-level portfolio entries 2026-03-28 21:29:30 +01:00
Bu5hm4nn
3b98ebae69 feat(DATA-004): add underlying instrument selector 2026-03-28 16:40:18 +01:00
Bu5hm4nn
3bf3774191 Merge branch 'feature/PRICING-002-basis-display' 2026-03-28 09:18:29 +01:00
Bu5hm4nn
9d06313480 feat(PRICING-002): add GLD/GC=F basis display on overview 2026-03-28 09:18:26 +01:00
Bu5hm4nn
966cee7963 feat(PRICING-003): use true GLD backing for hedge contract count 2026-03-28 09:18:26 +01:00
Bu5hm4nn
894d88f72f feat(PRICING-001): add GLD expense ratio decay correction 2026-03-28 09:04:35 +01:00
Bu5hm4nn
4620234967 feat(EXEC-001): add hedge strategy builder 2026-03-27 22:33:20 +01:00
Bu5hm4nn
554a41a060 refactor(BT-001C): share historical fixture provider 2026-03-27 21:41:50 +01:00
Bu5hm4nn
477514f838 feat(BT-002): add historical snapshot provider 2026-03-27 18:31:28 +01:00
Bu5hm4nn
1a6760bee3 feat(PORT-003): add historical ltv charts 2026-03-27 16:39:33 +01:00
Bu5hm4nn
3c9ff201e1 feat(BT-003B): add event comparison drilldown 2026-03-26 22:05:31 +01:00
Bu5hm4nn
bdf56ecebe fix(CORE-001D): close boundary review gaps 2026-03-26 17:34:09 +01:00
Bu5hm4nn
94f3c1ef83 feat(CORE-001D): close remaining boundary cleanup slices 2026-03-26 17:27:44 +01:00
Bu5hm4nn
99d22302ee fix(CORE-001D3B): validate alert history entry types 2026-03-26 15:19:42 +01:00
Bu5hm4nn
65da5b8f1d fix(CORE-001D3B): reject malformed alert history entries 2026-03-26 15:16:21 +01:00
Bu5hm4nn
ff76e326b1 feat(CORE-001D3B): surface alert history degraded state 2026-03-26 15:12:04 +01:00
Bu5hm4nn
09e03f96a8 chore(settings): drop unused last-saved helper 2026-03-26 15:05:28 +01:00
Bu5hm4nn
38d244356c refactor(settings): separate preview validation from internal failures 2026-03-26 15:00:53 +01:00
Bu5hm4nn
e860c40567 fix(settings): reject fractional refresh intervals 2026-03-26 14:05:49 +01:00
Bu5hm4nn
2759d9a36f fix(settings): track dirty state across all inputs 2026-03-26 13:59:56 +01:00
Bu5hm4nn
cfa3cfcc08 fix(settings): clarify last-saved status state 2026-03-26 13:54:56 +01:00
Bu5hm4nn
f7c134a709 fix(settings): preserve whole-dollar loan formatting 2026-03-26 13:34:34 +01:00
Bu5hm4nn
ea3b384103 fix(settings): fail closed on blank loan input 2026-03-26 13:28:30 +01:00
Bu5hm4nn
753e9d3146 fix(CORE-001D3A): accept decimal boundary inputs 2026-03-26 13:19:18 +01:00
Bu5hm4nn
bb557009c7 feat(CORE-001D3A): normalize alerts and settings service boundaries 2026-03-26 13:10:30 +01:00
Bu5hm4nn
91f67cd414 fix(pre-alpha): preserve injected provider identity 2026-03-26 12:32:52 +01:00
Bu5hm4nn
52d943e614 fix(pre-alpha): preserve injected template services 2026-03-26 12:26:38 +01:00
Bu5hm4nn
d7117bb6a3 fix(pre-alpha): preserve injected backtest services 2026-03-26 12:18:39 +01:00
Bu5hm4nn
18fd0681ca refactor(pre-alpha): align preview and runtime fixture validation 2026-03-26 12:11:45 +01:00
Bu5hm4nn
68275c4d18 refactor(pre-alpha): fail closed on historical fixture bounds 2026-03-26 12:04:42 +01:00
Bu5hm4nn
f38d0a53a9 refactor(pre-alpha): fail closed on historical preview fallbacks 2026-03-26 11:55:45 +01:00
Bu5hm4nn
4eec0127da fix(UX-001): reconcile preview validation behavior 2026-03-26 10:39:03 +01:00
Bu5hm4nn
82e52f7162 fix(UX-001): tighten historical stale state handling 2026-03-26 10:32:05 +01:00
Bu5hm4nn
78de8782c4 fix(UX-001): address layout review findings 2026-03-26 10:24:52 +01:00
Bu5hm4nn
a60c5fb1f2 feat(UX-001): add full-width two-pane dashboard layout 2026-03-25 23:19:09 +01:00
Bu5hm4nn
695f3d07ed fix(CORE-002C): explain undercollateralized historical seeds 2026-03-25 21:44:30 +01:00