Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Fetch historical OHLC chart data from yfinance (stocks) or ccxt (crypto) and load it onto the chart.
.claude/skills/spyderweb47-data-fetcher/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | -17% | 0% |
| case-08 | ✗→✓ | ▲ Improved | -21% | 0% |
| case-10 | ✗→✓ | ▲ Improved | -69% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 8% | 0% |
| case-13 | ✗→✓ | ▲ Improved | -12% | 0% |
Pull historical (and near-realtime) OHLC market data from external sources and load it directly onto the Vibe Trade chart canvas. Once loaded, every other skill — Pattern detection, Strategy generation, backtesting — can operate on the new dataset without the user having to upload a CSV.
This skill is the bridge between "I want to analyze X" and the rest of the platform's tooling.
Vibe Trade should dispatch to the Data Fetcher when the user wants to:
"Load TSLA hourly for the last month")
"Pull DOGE 5m last 24 hours")
data for Apple")
| Source | Asset class | Examples | API key? | |---|---|---|---| | yfinance | US/HK stocks, ETFs, indices, forex | AAPL, SPY, ^GSPC, EURUSD=X | No | | ccxt (default: binance) | Crypto spot pairs | BTC/USDT, ETH-USD, SOL | No |
The skill auto-detects the right provider from the symbol shape:
/ or - with crypto quote) → ccxt^INDEX or =X → yfinanceBTC, ETH, ...) → ccxt with USDT quoteyfinance| Key | Type | Meaning | |---|---|---| | message | string | Natural-language fetch request | | context.dataset_id | string | Existing dataset (ignored — this skill creates new ones) |
Returns a SkillResponse with:
reply — short confirmation ("Loaded 1000 bars of BTC/USDT 1h from binance.")data.dataset — the full fetched payload (symbol, source, interval, bars, metadata)tool_calls:data.dataset.add with the fetched payload — registers the dataset in thestore and switches the chart to it
notify.toast with a success messagebottom_panel.activate_tab if a downstream skill has matching tabs| Tool | When | Payload | |---|---|---| | data.fetch_market | Always — the actual fetch call | {symbol, source, interval, limit, exchange} | | data.dataset.add | Always after a successful fetch | The fetched payload | | chart.set_timeframe | After loading | The fetched native timeframe | | notify.toast | Confirmation or error | {level, message} |
Crypto pair > "Fetch BTC/USDT hourly data, last 500 bars."
→ Calls data.fetch_market(symbol="BTC/USDT", interval="1h", limit=500), auto-routes to ccxt:binance, returns 500 hourly bars, emits data.dataset.add to load them onto the chart.
Stock > "Get AAPL daily for the last 2 years."
→ Calls data.fetch_market(symbol="AAPL", interval="1d", limit=504) (504 ≈ 2 trading years), auto-routes to yfinance, loads onto the chart.
Bare crypto base > "Pull ETH 4h."
→ Auto-completes to ETH/USDT, fetches via ccxt:binance at 4h timeframe, default 1000 bars.
Wired through core/agents/processors.py::_data_fetcher_processor, which:
core.data.fetcher.parse_query() to extractsymbol, interval, and limit
core.data.fetcher.fetch() to pull bars from the right providerSkillResponse with the right tool_callsThe fetcher in turn uses:
Both libraries are pip-installable, key-less, and ship with the backend.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 10,116 | 3,318 | -67% | 1 | 1 | 0% | 2,034 | 1,685 | -17% | 0 | 0 | — |
case-02 | pass→fail | 5,653 | 4,689 | -17% | 1 | 1 | 0% | 1,106 | 1,916 | +73% | 0 | 0 | — |
case-03 | fail→fail | 7,618 | 2,533 | -67% | 1 | 1 | 0% | 1,460 | 1,561 | +7% | 0 | 0 | — |
case-04 | pass→pass | 10,207 | 11,421 | +12% | 1 | 1 | 0% | 1,979 | 3,383 | +71% | 0 | 0 | — |
case-05 | pass→fail | 6,874 | 5,249 | -24% | 1 | 1 | 0% | 1,294 | 2,065 | +60% | 0 | 0 | — |
case-06 | pass→pass | 12,663 | 4,925 | -61% | 1 | 1 | 0% | 3,014 | 2,026 | -33% | 0 | 0 | — |
case-07 | fail→fail | 5,427 | 3,063 | -44% | 1 | 1 | 0% | 1,080 | 1,666 | +54% | 0 | 0 | — |
case-08 | fail→pass | 12,730 | 2,694 | -79% | 1 | 1 | 0% | 2,057 | 1,622 | -21% | 0 | 0 | — |
case-09 | pass→pass | 8,369 | 3,009 | -64% | 1 | 1 | 0% | 1,781 | 1,612 | -9% | 0 | 0 | — |
case-10 | fail→pass | 25,056 | 3,470 | -86% | 1 | 1 | 0% | 5,942 | 1,844 | -69% | 0 | 0 | — |
case-11 | fail→pass | 13,043 | 3,560 | -73% | 1 | 1 | 0% | 1,539 | 1,667 | +8% | 0 | 0 | — |
case-12 | pass→pass | 11,237 | 4,377 | -61% | 1 | 1 | 0% | 1,388 | 1,915 | +38% | 0 | 0 | — |
case-13 | fail→pass | 9,468 | 3,173 | -66% | 1 | 1 | 0% | 1,988 | 1,749 | -12% | 0 | 0 | — |
case-14 | pass→pass | 12,899 | 2,085 | -84% | 1 | 1 | 0% | 2,750 | 1,495 | -46% | 0 | 0 | — |
case-15 | fail→pass | 16,246 | 3,678 | -77% | 1 | 1 | 0% | 3,822 | 1,872 | -51% | 0 | 0 | — |
case-16 | fail→pass | 7,537 | 2,940 | -61% | 1 | 1 | 0% | 1,790 | 1,727 | -4% | 0 | 0 | — |
case-17 | fail→fail | 5,284 | 2,105 | -60% | 1 | 1 | 0% | 1,103 | 1,468 | +33% | 0 | 0 | — |
case-18 | pass→pass | 6,422 | 3,604 | -44% | 1 | 1 | 0% | 1,181 | 1,748 | +48% | 0 | 0 | — |
case-19 | pass→pass | 5,768 | 2,959 | -49% | 1 | 1 | 0% | 1,176 | 1,665 | +42% | 0 | 0 | — |
case-20 | fail→pass | 23,790 | 3,155 | -87% | 1 | 1 | 0% | 6,170 | 1,790 | -71% | 0 | 0 | — |
case-21 | fail→pass | 25,489 | 3,226 | -87% | 1 | 1 | 0% | 6,162 | 1,660 | -73% | 0 | 0 | — |
case-22 | fail→fail | 8,929 | 2,834 | -68% | 1 | 1 | 0% | 1,788 | 1,691 | -5% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +32 percentage points is the difference between those two pass rates over the 22 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.