@livefolio/market
v0.3.1
Published
Market data provider for Livefolio. Fetches daily bars from Yahoo Finance (equities, ETFs, crypto) and FRED (Treasury rates), and streams live prices from Yahoo's WebSocket feed.
Downloads
487
Readme
@livefolio/market
Market data provider for Livefolio. Fetches daily bars from Yahoo Finance (equities, ETFs, crypto) and FRED (Treasury rates), and streams live prices from Yahoo's WebSocket feed.
Implements the MarketProvider and PriceStream interfaces from @livefolio/sdk.
Install
npm install @livefolio/marketRequires Node 20+.
Daily bars
import { createYahooFredMarket } from '@livefolio/market';
const market = createYahooFredMarket({ fredApiKey: process.env.FRED_API_KEY! });
await market.fetchBars('AAPL'); // Yahoo
await market.fetchBars('DGS10'); // FRED (10-year Treasury)
await market.fetchBars('SPY', '2020-01-01');Symbols are routed automatically: known FRED series (DGS3MO, DGS1, DGS10, DTB3, etc.) hit FRED; everything else goes to Yahoo.
Returns DailyBar[] where each bar is { date: 'YYYY-MM-DD', value: number }. Fetch failures throw MarketFetchError with the source and symbol attached.
Polling live quotes
fetchQuotes returns current prices for a mixed batch of Yahoo and FRED symbols. Each result is either { symbol, price, time } or { symbol, error } — the method itself never throws, and partial failures don't kill the batch.
import { createYahooFredMarket } from '@livefolio/market';
const market = createYahooFredMarket({ fredApiKey: process.env.FRED_API_KEY! });
const quotes = await market.fetchQuotes(['AAPL', 'SPY', 'DGS10', 'BOGUS']);
for (const q of quotes) {
if (q.error) console.warn(q.error.message);
else console.log(q.symbol, q.price, q.time);
}Yahoo times are tick-accurate ISO 8601 timestamps. FRED times are the observation date at T00:00:00.000Z since FRED observations are date-granular.
Live price stream
import { createYahooPriceStream } from '@livefolio/market/stream';
const stream = createYahooPriceStream();
stream.on('tick', (symbol, price, time) => {
console.log(symbol, price, time);
});
stream.on('status', (status) => console.log(status)); // 'connected' | 'reconnecting' | 'disconnected'
stream.on('error', (err) => console.error(err));
stream.subscribe('AAPL', 'MSFT');
// ...
stream.unsubscribe('MSFT');
stream.close();Connects to wss://streamer.finance.yahoo.com/, decodes Yahoo's protobuf ticker frames, and reconnects with exponential backoff (capped at 8s) until close() is called.
Development
npm run build
npm test
npm run lint