- Use ThreadPoolExecutor to fetch stock prices concurrently across multiple holdings
- Pre-fetch FX rates for unique non-GBP currencies before parallel price fetching
- Group price fetching and FX calculation into separate processing phases
- Reduce I/O wait time by executing network requests in parallel instead of sequentially
- Add `get_fx_rate()` function with caching to fetch foreign exchange rates from open.er-api.com
- Introduce `get_currency()` helper to map market codes to currency identifiers
- Update price parsing regex to support multiple currency symbols (£, $, €)
- Convert shares to float to accommodate fractional holdings
- Add currency, fx_rate, and total_value_gbp fields to output JSON
- Support fractional share counts (e.g., 3.6185 AAPL shares)