AI自动研判,辅助投资交易
为Vibe-Trading打分
给出您宝贵的评分:
相关产品
手机端可长按上方图片保存到相册,或点击「下载/分享」分享到微信
使用 Vibe-Trading,你可以:
Vibe-Trading专属个人交易智能体,依托AI完成市场行情分析、策略研判,为投资者提供交易辅助参考。
用户评论 (0)
2026年08月04日
2026年08月04日
2026年04月18日
2026年08月10日
2026年07月20日
2026年07月18日
2026年07月17日
2026年07月16日
2026年07月13日
v0.1.15
2026年09月09日
Rolls up 551 commits / 162 merged pull requests since 0.1.14, from 35
contributors.
The theme of this cycle is data that says what it is. A price frame now
carries the adjustment caliber it was served under. A factor propagates the
gaps in its inputs instead of filling them. A loader that cannot serve a
market no longer claims it, and a source that fails to refresh is an error
rather than a smaller portfolio. Three of those were the same bug wearing
different clothes: a default that silently substitutes a plausible value for
a missing one, which is indistinguishable downstream from a real
observation. Three new markets, a fourteenth broker and fifteen Quant
Library additions land alongside.
Added
- UK equity market (#1206, thanks @cgycorey) — LSE
.Land.IL
symbols end to end: market data, Yahoo-backed financial statements and
indicators, trade-journal inference intouk_equity, and its own engine
path. SDRT is modelled as what it actually is — a 0.5% duty on the
purchase side only, not a symmetric round-trip cost. Charging both
sides overstated the cost of every round trip by half, which is exactly
the size of edge a mean-reversion strategy lives on. - Zerodha Kite Connect (#1193, thanks @ashutoshsinghpr7) — a fourteenth
broker connector for Indian equities. Kite exposes no runtime paper/live
discriminator — no account-id format, host separation, demo flag or trade
environment — so under the red line it is capped at paper plus read-only:
place_orderandcancel_orderhard-refuse any non-paper config at the
first line, and no*-live-tradeprofile exists to select. That now
covers Longbridge, Dhan, Shoonya and Zerodha; Trading212 goes further and
refuses all order placement including paper. - Read-only multi-broker portfolio (#1072, thanks @goatyyc; onboarding
contracts in #1250) — one aggregated snapshot across every enabled
connection instance, reachable four ways: the Web/portfoliopage, REST
underportfolio_routes.py, theportfolio_summaryagent tool, and
vibe-trading portfolio show | refresh | sources. Three design points
that are not incidental: a source that fails to refresh is an error
excluded from the totals (statuserror,last_success_at,
complete=false), never a carried-forward cache, so a partial snapshot
cannot read as a smaller portfolio; everyremote_mcpread passes
interactive_oauth=False, so aggregation can never pop an auth prompt;
andanalysis_context()carriesrisk_xray_argssoportfolio_risk_xray
is fed rather than reimplemented. Eligibility is one rule —
is_portfolio_connection_profilerequires readonly and account.read
and positions.read — under which the IBKR official-MCP profile, which
advertises only discovery, is correctly not a portfolio source. - Quant Library, fifteen additions (thanks @santhreal) — Heston (1993)
stochastic volatility option pricing (#1195); Hierarchical Risk Parity
allocation (#1196); Archimedean and Gaussian copula analytics (#1197);
market-microstructure analytics — VPIN, Roll spread, Amihud illiquidity,
Kyle's lambda (#1198); analytical single-barrier options with cash-rebate
handling (#1163) plus finite-difference sensitivity Greeks for them
(#1203); an ISDA standard-model single-name CDS valuation engine with
hazard-rate conversions (#1164); Key Rate Duration decomposition across
benchmark tenors (#1165); the Vasicek credit portfolio loss model and
spread DV01 (#1167); cross-sectional factor Information Coefficient time
series (#1166); Ornstein-Uhlenbeck exact calibration with half-life
(#1161); drawdown distribution analytics with the Ulcer and Pain indices
(#1162); Corrado rank and Cowan generalized sign non-parametric
event-study tests (#1160); multi-factor risk decomposition with Euler
marginal contributions, reportingunmatched_weightrather than
normalising it away (#1159); and group-purged k-fold cross-validation for
panel data (#1168). The layer's rule holds throughout: a formula has
exactly one implementation, and skills import it rather than carrying the
source in aSKILL.mdcode block. - Brazilian Portuguese locale (#1327, thanks @nandofmike) — the eighth
shipped language, landing with full key parity. The parity suite globs
locales/*.jsoninstead of listing languages, so a new locale is covered
the day its file lands; German had previously shipped with perfect parity
and zero coverage because that list was hand-written. - Nobitex and Wallex (#1263, thanks @Emad211) — read-only Iranian
exchange sources on keyless public UDF endpoints, explicit-source only.
Both sit in_NO_NETWORK_FALLBACK_SOURCESand are barred from the crypto
fallback chain on purpose: they are the only Toman-quoted sources and
declaremarkets={"crypto"}purely to be reachable, so degrading an
unavailableBTCIRTrequest into that chain would hand back a
USDT-quoted series as if it were Toman. - Binance USD-M evidence path (#1229, #1230, thanks @honginp; #1248,
thanks @lorenzozanee) — read-only USD-M account snapshots, drift evidence
artifacts comparing simulated fills against recorded ones, and
deterministic tolerance calibration derived from those recordings rather
than assumed. The point is that the tolerance has a provenance: it is
measured against real fills, not chosen. - Offline evals harness (#1271, thanks @AirHua-byte) — verifies a run's
persisted artifacts (prompt preservation, tool calls and results,
identity, evidence, provider usage, iteration budget,RunManifest
integrity) against a versioned case/verdict schema, with no LLM, network,
broker or MCP call: it reads files only. Absent instrumentation emits
NOT_EVALUABLErather than passing, which is the whole point — a missing
field must not read as good behaviour. - Anthropic prompt caching (#1366, thanks @averatec0773) — an explicit
cache breakpoint on the system block so the static tools+system prefix is
read from cache instead of resent at full price, with cache usage recorded
in the usage envelope. Native adapter only, behind
VIBE_TRADING_ANTHROPIC_PROMPT_CACHE; set it to 0 if a compatible proxy
rejects thecache_controlrequest parameter. - Per-market data-source priority (#1231, thanks @sambazhu) — a Settings
card andMARKET_DATA_ORDER_*env overrides that reorder a market's
fallback chain. Validated as a multiset permutation of the default, so
reordering passes while adding, dropping or duplicating a source is
refused and the default stands. The override is applied as a setitem on
the same dict object, becauserunner.pyandmarket_data.pyimport
FALLBACK_CHAINSby name and a rebind would leave them on the old order. - Calendar-triggered partial rebalancing (#1277, thanks @thisisjun786)
and a data window separated from the evaluation window, so warm-up
bars stop counting as evaluation and a strategy is not graded on the bars
it needed to become defined. - Agent-confirmed scheduled research (#1187, thanks @AirHua-byte) and
each monitor's latest verdict rendered on the job list (#1156, thanks
@he-yufeng), so a recurring job's state is legible without opening it. - Swarm replay and retry (#1158, thanks @cgycorey;
vibe-trading swarm retry --resumein #1194, thanks @SiMinus) — resume a failed or cancelled
DAG run while keeping the artifacts of tasks that already completed,
rather than paying for the whole graph again. - Order-plan rejection reporting (#1245, thanks @lorenzozanee) — an
_on_plan_rejectedhook plus a run-level report of
the trades the engine wanted but could not take. A rejected plan
previously vanished, so a strategy that was being silently throttled by
buying power looked identical to one that simply had no signal. - Read-only Binance-connector crypto identity (#1242, thanks
@pengpengyi92) and public venue-catalog pair resolution, so a crypto pair
resolves without requiring a broker connection at all. - Multi-file drag-and-drop and paste uploads in the Web chat (#1179,
thanks @AirHua-byte).
Fixed
Missing data stops being filled with plausible values
- The Alpha Zoo NaN contract, enforced at the registry (#1377, closes
#1376, thanks @cgycorey) —factors/base.pystates the contract in its own
header: NaN is preserved through warm-up and missing data, no silent
fillna(0). An alpha that branches withnp.whereon a comparison
violates it without looking like it does, because a NaN comparison is
Falseand the ternary falls through to its constant. Blanking every
declared input on one bar across the whole zoo, 84 of 462 alphas returned
a number anyway — and sincedropna()is the mechanism that keeps a gap
out of an IC, each fabricated ±1 was consumed as a real signal.
Registry.computenow masks the output to NaN wherever a declared
dependency is missing on that bar, and the same sweep afterwards finds
none. Individually fixed on the way there: gtja191_004 (#1371),
gtja191_003 and gtja191_059 (#1372), gtja191_069 (#1373), gtja191_019 and
gtja191_086 (#1379), alpha101_007 and alpha101_051 (#1380), alpha101_009
and alpha101_046 (#1381), alpha101_021 and alpha101_024 (#1382),
alpha101_010/023/027 (#1383), and alpha101_049's warm-up mask (#1374) —
thanks @Shizoqua. Stated rather than quietly carried: the warm-up half
is still open. Measured the same way, 52 alphas still emit a value inside
their own declaredmin_warmup_bars(gtja191_154declares 198 and
emits at row 0), because on those bars the inputs are present and only the
rolling window is undefined. A registry-level warm-up mask would also blank
rows for alphas whose declaration merely over-declares by two or three
bars, so that half needs a direction call rather than 52 pull requests. pct_change()forward-fills by default (#1397, #1398, #1399, #1400,
thanks @Shizoqua; #1172) — pandas still defaultspct_change()to
forward-filling, so a missing close becomes a 0.0% return that never
happened, and the next bar reports a two-day move as one day. Four PRs
each fixed one call site; sweeping the skills exhaustively found 24 sites
across 10 files, two of them inside the very files those PRs were
editing. The class is closed repo-wide now: the SDM strategy template
(#1397), cross-market volatility weights (#1398), multi-factor TopN
selection which now excludes assets with no factor observations rather than
ranking them at zero (#1399), and sentiment-factor orthogonalization which
no longer regresses on zeros it filled in itself (#1400). Alpha Zoo returns
stopped forward-filling gaps in #1172.- Survivorship-bias disclosure reaches the report (#1289, thanks
@bonyohana) — the flag was computed and then not rendered in the HTML bench
report, which is the same failure mode one level up: a caveat that exists
in the data and not in what the reader sees.
Prices say which caliber they are
- Adjustment caliber stamped on served frames (#1317, closes #1301,
thanks @he-yufeng) — a frame now carries what its prices actually mean.
A caliber is recorded only where it was measured against a live payload or
pinned by the loader's own endpoint choice; anything unmeasured resolves to
unknownon purpose, because origin-side adjustment is invisible from
loader code — Yahoo serves split-adjusted quotes with zero adjustment logic
in this repo. - The loaders that still booked a dividend as a loss (#1287, #1288,
thanks @he-yufeng; #1320, thanks @lorenzozanee) — Yahoo, FMP and Tiingo
paths serve adjusted prices, and an unresolved symbol now retries down the
fallback chain instead of stopping at the first source that lacks it. - Explicit sources answer as themselves (#1276, #1342, #1185, #1316,
thanks @lorenzozanee, @he-yufeng, @cgycorey) — FMP moved to the Stable
endpoint and no longer silently falls back when named explicitly; stooq's
anti-bot challenge is flagged rather than parsed as data, which is the
difference between "no data" and "a JavaScript page interpreted as prices";
codes, date range and source are validated before the fetch rather than
after it; and symbol search is aligned with fetch for FX pairs and indexes,
so the thing you searched is the thing you get. - Tencent history pagination (#1154, thanks @BigFishEmily) — long ranges
were silently truncated to the first page.
Futures reach the right engine, and now have a source at all
- Classification (#1369, #1389, thanks @Shizoqua; #1396, thanks
@he-yufeng; and349bf202on the global side) — digit-prefixed and
month-code-colliding product codes, Tushare's own exchange spellings
(SHF/CZC/CFX/GFE), case folding at extraction rather than per
lookup, and dated global contracts carrying their venue (CL2412.NYMEX,
ESZ4.CME) each fell through every pattern to thea_sharedefault. A US
crude contract was therefore run under T+1, with no shorting, settled in
CNY. - Coverage (#1395) — the loader chain was the last link, and it was
empty. It namedtushareandakshare, and neither implemented a
futures endpoint:tushare._fetch_daily_framebranches on ETF / index /
HK and sends everything else todaily(), the A-share equity endpoint,
whileakshare._fetch_oneends with# Default: try A-share. AKShare now
serves Chinese contracts off the token-free Sina daily endpoints, dated and
main-continuous, verified live across SHFE (RB2601, RB0), CFFEX (IF2512,
T2512), GFEX (SI2601) and ZCE (MA2605). A global contract returns empty and
reacheslocalrather than being priced as an equity. Trimming tushare's
marketsset alone would not have worked:resolve_loaderwalks the chain
and never consultsmarkets, so tushare would have stayed first in line.
The main continuous contract (RB0) is routed too — a dated contract lives
about one year, so any backtest longer than a contract cycle has to name
the rolled series. - China-futures margin provenance (
306aca2c, closes #1393) — a run now
states which products were priced on a generic default instead of a table
entry.rb's real margin rate is 0.10, the same number as the default, and
"looked up" must not read like "assumed".
Live trading fails closed
- Broker reads that are not answers (#1212, #1232, thanks @he-yufeng;
#1244, #1254, thanks @cgycorey) — a position read returning an API error,
and error envelopes arriving mid halt-sweep, were both treated as
successful empty results. The sweep now latches only the episodes it
actually swept, under per-episode latch files, and only after attempted
side effects. - State that has to survive a restart (#1233, thanks @he-yufeng; #1213,
#1221, #1222, thanks @Elfsa-Miranda) — the flatten latch persists across
runner restarts, and unresolved Alpaca submissions are owned before broker
writes and recovered by exact client ID, including fills, so a restart
mid-submit cannot produce a duplicate or an orphan. - Order sizing and timing (#1312, #1361, #1253, thanks @he-yufeng and
@cgycorey; #1209) — buy-limit orders are sized at the worse of quote and
limit on both transports, market-triggered ticks are skipped while the
market is closed, and Alpaca position quantity is signed by side before it
reaches the mandate gate. - The mandate gate narrows in both directions (#1285, thanks @Jackzigen)
— the change enforcing narrowing semantics for non-numeric and list
adjustments also rejected"none"as an invalid type, which made the most
conservative mandate unsubmittable. Nine CI checks were green over it: the
eight new tests were allraisesassertions, and a one-way suite cannot
see that something which should have been allowed was refused. - Four connector gaps from the #1207 minor batch (#1388, thanks
@he-yufeng) — an MT5 order above the symbol's volume cap was silently
clamped and sent while the below-minimum side errored (it fails closed
naming the cap now); an eToro limit order with nolimit_pricewent out as
an MIT with noTriggerRateand rested untriggered while reading as
accepted; futu K-lines inherited an undeclared adjustment caliber; and bare
BTCUSDTwas routed through A-share rules — T+1 and no shorting, on a
perpetual. - Report audit fails closed when nothing was verified (#1362, thanks
@cgycorey) — an audit that checked zero claims returned PASS.
Backtest execution semantics
- Options (#1299, #1305, thanks @cgycorey; #1306, thanks @he-yufeng;
#1177) — signals fill on the next bar rather than on the date they were
computed from, which had let a strategy trade at the price that generated
its own signal; HV warm-up bars use the configured default IV instead of
an undefined one; short option legs hold margin and gate opens on buying
power, so a naked short could no longer sell premium it could never cover;
and an explicit expiration is validated against the dates actually
available rather than silently resolved to a neighbour. - Shorts, rebalancing and accounting (#1298, #1344, #1281, thanks
@cgycorey) — 1x shorts liquidate on adverse moves in non-strict mode; an
over-committed rebalance basket scales to fit instead of aborting on a
commission overdraft; and requested target changes are separated from
executed rebalance fills (closes #1275), so the rebalance count shown to a
reader is the number of fills rather than the number of intentions. - Market rules through composite state (#1309, #1332, #1370, thanks
@he-yufeng and @Shizoqua) — A-share and India rules are enforced through
composite state rather than per-engine, a halted position marks at the last
traded close instead of entry cost, and the sub-engine's active symbol is
synced before every composite dispatch rather than once per bar. - Perpetuals and forex (#1307, thanks @he-yufeng; #1226, thanks
@P1Piyush) — funding settles by bar span on 8h+ intervals rather than once
per bar, and forex metals are treated as metals for pip size, lot size and
spreads. A 50-ounce gold order had been rounded down to zero. - Symbol routing into the engines (#1351, thanks @cgycorey) — dotted US
class shares (BRK.B.US,BF.B.US) fetched an empty chart. - Cross-market annualization (#1239, thanks @cgycorey) — risk x-ray
honoursbars_per_year=Noneinstead of assuming a trading calendar that
does not apply. - ML walk-forward label leakage (#1392, thanks @Shizoqua) — future labels
were not purged from the training window in the example pipeline. - Intraday fundamentals lookahead (closes #1387) — an announcement date
carries no time of day, so on an intraday frame a filing became visible
from the first bar of its own announcement day: a full session of
lookahead. Sub-daily frames are refused now, with
fundamental_subdaily="next_day"as the explicit opt-in.
Shadow account
- (#1217, #1310, #1311, #1314, #1356, thanks @he-yufeng) — PnL is derived
from runner metrics and fails closed when unknown rather than reporting a
number it cannot support; attribution is scoped to the pool currency with
mutually exclusive buckets; short lots are modelled in FIFO pairing with
legs restated across corporate actions; the result cache is keyed by window
and journal hash rather than by shadow alone, so editing a journal no
longer returns the previous answer; and cash-dividend journal rows are
parsed and booked into real PnL.
Grounding gates
- Both directions (#1326, #1338, #1375, #1378, thanks @cgycorey) —
full-width brackets no longer split a clause; analysis metrics are gated on
a completed analysis result (#1336); a metric claim formatted as a
generic| Metric | Value |table no longer escapes the gate that rejects
the same claim in prose; and the mirror-image error is fixed too — a price
word used as a formula variable is not a price claim, soclose/SMA50 > 1
is no longer read as an asserted price (#1354). - Vocabularies completed on both sides (#1346, #1357, thanks @saju01) —
percentage-point deltas (3.6pp,3.6 个百分点,250 基点) were read as
quoted prices, and the adjacent-CJK boundary is now exercised directly.
The English gate had been the leaking side:\bclose\bdoes not match
"closed", so a fabricatedThe stock closed at 412.35.passed while the
identical Chinese claim was correctly rejected. Both vocabularies are
complete now and a language-parity suite asserts the two reach the same
verdict per case instead of checking each in isolation. - Identity (#1265, #1280, #1282, thanks @aminak58; #1384, thanks
@laiyierjiangsu; #1269, thanks @AirHua-byte; #1333, thanks @Shizoqua) —
bare joined crypto pairs (BTCUSDT) went unrecognised while spot platinum
resolved to a crypto pair that does not exist; FX, metals and futures
symbols route through the right identity path (GC=FandXAUUSDhad been
classified as China A-shares);search_symbol("XAUUSD")returned exactly
one candidate — a Swedish Bitcoin ETP — which then locked the run's
instrument identity, so a metal or FX query is an exact instrument
assertion now; a pasted broker code (HK.00700,US.AAPL,SH.600519)
scanned as no symbol at all; market context stated earlier in a
conversation can narrow resolution behind
VIBE_CONTEXTUAL_IDENTITY_CONSTRAINTS; and generic evidence timestamps are
preserved rather than dropped.
The agent loop keeps what it still needs
- (#1341, #1358, thanks @saju01; #1349, thanks @he-yufeng; #1352, thanks
@cgycorey) — the loop discarded tool results the model was still using, and
microcompaction cleared pairs it then could not reconcile. A session that
had successfully fetched fundamentals, fund flow, margin and research data
had those results cleared to free context, and the de-duplication ledger
went on refusing to re-fetch them: 44 blocked retries in one run, ending
in "fundamental data not retrieved" for data the model had already
received. Clearing a result now re-opens that tool, the ledger keys on
arguments rather than tool name, results are reconciled by exact call
identity, and the token budget counts tool-call arguments instead of
scoring a 100 KB payload as ten tokens. - The no-progress budget counts observations, not activity (#1363,
thanks @be-student) — a run that keeps issuing tool calls without a new
successful observation stops afterNO_PROGRESS_LIMITiterations with a
visible recovery answer and afailedterminal state. An identical call
identity is refused from its second failure, not its first: only a
successful mutating call clears the ledger and a research run may have
none, so refusing on the first failure made a transient rate limit or
timeout permanent for the whole run. - Run-stall watchdog and bash tree-kill timeout (#1169, thanks @wiliao)
— plus a compaction verification ledger, so a stalled run is detected
rather than waited on.
Providers and transports
- (#1225, thanks @he-yufeng; #1246, #1247, thanks @lorenzozanee; #1330,
thanks @averatec0773; #1334, #1348, thanks @Shizoqua; #1182, thanks
@AirHua-byte) — real token usage is requested on streamed calls instead of
being estimated; a temperature rejection self-heals on the
OpenAI-compatible path, and the Anthropic self-heal strips the relocated
extra_body.temperaturerather than only the original position; stream
retry delays escalate and honourRetry-After; Codex token usage and
response model metadata are propagated rather than discarded; and shared
HTTP clients survive cleanup instead of being closed out from under an
in-flight request. - Dependency caps that were load-bearing (#1313, thanks @he-yufeng;
4abd6cc2) — fastmcp is capped below 4.0.0 until the constructor/snapshot
adaptation lands, and mcp below 1.30, which broke IBKR OAuth discovery. The
second was diagnosed as a red CI on tests nothing in the diff had touched;
adapting the fixtures would have hidden a genuinely broken broker path.
Web UI, CLI and surfaces
- (#1257, #1258, #1259, thanks @iagop03; #1319, thanks @guestccc) — a stale
streamingSessionIdis cleared on session reopen, the main region scrolls
and long run prompts collapse, a non-backtest run points at Studio instead
of a blank dashboard, and the Vite dev server proxies/apiso a fresh
checkout works without a manual proxy step. - Session recovery across restart (#1180, thanks @AirHua-byte; #1340,
thanks @averatec0773) — streamed assistant text is checkpointed to
partial_response.jsonat ≥0.25s intervals with an atomicos.replace,
and every pending or running attempt on disk is reconciled at service
construction into an explicitinterruptedtranscript entry. The reply is
committed beforeattempt.jsonso recovery can finish either side of that
write. The attempt start persists too, so the elapsed clock survives
navigation, reload and history. - Windows and desktop (#1261, thanks @Emad211; #1284, thanks
@lorenzozanee; #1359, thanks @birdxs) — cross-platform locks and path
handling, EPERM handled in the desktop updater's shutdown checks, and
Docker actions moved to Node.js 24 compatible versions. - Swarm and MCP plumbing (#1175, #1331, #1176, #1335, thanks @Shizoqua;
#1210, thanks @pengpengyi92; #1173; #1345, thanks @cgycorey) —
cancel_run()is threaded into the in-flight worker rather than only
marking the DAG; goal sessions are isolated per MCP connection rather than
per process;goal_id/expected_goal_iddefault to the current goal;
beginTime/endTimeare forwarded throughget_research_reports; worker
retries use bounded backoff; the MCP stdio registry path has coverage; and
investment-committee researchers get the fundamental data panel their
prompts already assumed (#1343). - Portfolio OAuth lifecycle (#1211, #1251, thanks @goatyyc) — the
reconnect lifecycle is isolated, and reconnect failures are classified
rather than collapsed into one opaque error. - IBKR (#1186, thanks @sykuang; #1190, thanks @goatyyc; #1178, thanks
@c020627) — public MCP OAuth flow support, verified read tools enabled, and
the official read-only seed pointed at/mcp-public. - Futu HKD valuations (#1228, thanks @JaxonHu1024) and futu
connection_statehandling. - Feishu QR login credentials persist (#1188, thanks @AirHua-byte).
- Persistent memory cleans up after itself (#1174, thanks @Shizoqua) —
garbage collection and compression left the FTS index and the semantic
links pointing at entries that no longer existed, so a cross-session recall
could surface a row whose body had been collected. - Strategy store and discovery (#1347, thanks @ethanstoner; #1368,
thanks @Shizoqua) —created_atties are broken so history is really
newest-first, and position size is resolved per regime rather than once for
the whole run. - Valuation and credit refuse non-finite inputs (#1184, #1215, #1386,
thanks @Robin1987China) — comps, three-statement inputs and every
credit-risk function reject non-finite values rather than propagating them.
The three Archimedean copula CDFs returned wrong extreme values under
strong dependence — Clayton0.0, Gumbel1.0, Frankinf— and are
computed in log space now, verified against a 2500-digit reference across
θ ∈ [-5000, 5000] (closes #1385). Note that the first fix covered only
θ > 0; θ < 0 overflowed tonanfrom |θ| ≈ 355 and the rewrite dipped
below the Fréchet bound as θ → 0, both caught before merge. - Cross-validation edges (#1204, #1220, thanks @santhreal and
@he-yufeng) — multi-segment test sets are supported, empty training
partitions are guarded, and rows between combinatorial test blocks are
pinned as still trainable. - Skill and documentation links (#1252, #1328, thanks @ethanstoner;
#1189, thanks @youngjincho02-arch) — a skill-relative reference link
resolves inread_file, the skill-name prefix is dropped so links resolve
on GitHub, and thehistorical_varquantile formula in the risk-analysis
skill is corrected. Verification note for the first two: the agent reads
throughReadFileToolrooted atsrc/skills/, not through GitHub's
renderer, so the two conventions had to be checked against the real
consumer. - Dependencies (#1321, #1322, #1323, #1324) — dockerhub-description
4.0.2 → 5.0.0, docker/login-action 3.7.0 → 4.6.0, 15 npm minor/patch
updates and 43 pip minor/patch updates, via Dependabot.
Changed
- The
futuresfallback chain is now["akshare", "local"].
resolve_loaderwalksFALLBACK_CHAINSand never consults a loader's
marketsset — the only.marketsread is the explicit-source fallback —
so trimming that set alone would have lefttusharefirst in line,
constructed and available on anyTUSHARE_TOKEN, returning empty frames
beforeaksharewas ever asked. tushareno longer declares thefuturesmarket. Serving it needs
pro.fut_daily, which sits behind a points tier nothing here implements.- China futures main continuous contracts (
RB0,IF0) now classify as
futuresrather than falling to thea_sharedefault. The rule is
generated from the product whitelist rather than from a width heuristic,
so an ordinary ticker ending in0keeps its own market. test_release_version_consistency.pydid the job it was written for. The
bump missed theapp.versionmock in
frontend/src/components/layout/__tests__/Layout.test.tsx, and the guard
named it — that site has been in its enumeration since it shipped with
0.1.14, which is the point of enumerating declaration sites rather than
spot-checking the ones somebody remembers. The locale check globs its
directory, sopt-BR.jsonwas covered the day it landed without anyone
extending the test. The version named in atest_cli_update.pycomment is
de-versioned here — a version string in a comment has no guard at all and
goes stale at the next bump.- Reader-facing counts were re-measured against the code rather than
incremented by hand: 74 MCP tools, 107 registry tools, 10 backtest engines,
90 bundled skills, 462 alphas, 27 data sources, 30 swarm presets, 14 broker
connectors. None had drifted this cycle.
v0.1.14
2026年08月20日
Rolls up 272 commits / 74 merged pull requests since 0.1.13.
Added
- Options Lab (#1096, closes #1095, thanks @shadowinlife) — a Web UI page
with four surfaces: expiry payoff diagram, spot×IV scenario P&L matrix,
portfolio Greeks cards, and a live US options chain. The math is not new: two
read-only HTTP endpoints wrap the existingoptions_payoff/
get_options_chaintools, so the page and the MCP surface compute from the
same test-pinnedsrc/quantlib/options.py. Research only — it places no
orders. - Factor Research tab in Run Detail (#1099, thanks @shadowinlife) — IC
statistics cards, the daily IC series with its mean line, quantile-group
equity curves, and an IC correlation heatmap, all rendered from the
factor_analysisartifacts a run already writes. The new read-only
GET /runs/{run_id}/factorendpoint scans the run'sartifacts/tree and
computes the pairwise IC time-series correlation matrix, which existed
nowhere before; ahas_factor_artifactsflag gates the tab so runs without
factor output do not show an empty panel. - Positions tab in Run Detail (#1097, closes #1098, thanks @shadowinlife) —
portfolio-book structure from the existingpositions.csv: a per-symbol
weight pie/treemap with a date slider, sector and asset-class net-exposure
bars, and a weight-evolution stacked area. The pie is gross composition
(absolute weights including shorts and cash) while the bars are net
exposure per industry, so a long/short pair in one sector nets to zero on the
bars while both legs stay visible on the pie. The two charts answer different
questions on purpose. - Tearsheet tab in Run Detail (#1091, closes #1090, thanks @shadowinlife) —
monthly-returns heatmap (years × months with a full-year column), annual
returns bar chart, top-5 drawdown table, and an equity curve annotated with
the ranked drawdown zones. Everything is derived client-side from the
equity.csvrows the run response already carries: no backend change, no new
dependency, and month axis labels come fromIntl.DateTimeFormatrather than
per-locale month keys. - Interactive backtest research dashboard (#1084, thanks @AndyLongest) — an
optional report-style view for a completed backtest alongside the existing
candlestick and trade-detail views: headline return/risk/trading KPIs,
normalized equity versus benchmark, drawdown with rolling Sharpe, realized
trade P&L, a trade ledger, and the complete metric table. CLI backtests get a
quiet local report-server bootstrap soFull Reportroutes to the dashboard
without a manual server step. - Strategy Discovery (#978 Phase 1 and #1007 Phase 2, refs #969, thanks
@shadowinlife) — a read-only facade answering "what strategies exist and what
state are they in?" across the Alpha Zoo and the SDM strategy store, with
per-(strategy, regime)evidence rows rather than scenario tags. Ships
list_strategies/query_strategies/get_strategy_evidenceas agent and
MCP tools behind an evidence gate (minimum-trade, coverage and
cost-breakeven thresholds, each with an explicit warning), plus a startup
guard that drops the routing text when any advertised tool is not actually
registered. Phase 2 adds the population path —refresh_strategy_evidence
as an agent tool, an MCP wrapper and
vibe-trading strategy-evidence refresh --manifest— with the
backtest-diagnoseHard-Gate Checklist as the ingestion gate (stable
hard-gate:*skip tokens) and atomic rebuilds. Freshness is computed at read
time from the evidence-window age (fresh/aging/stale); stale rows fail
closed out of default recommendations behind aninclude_staleopt-out, and
sdm:*rows mirror the SDM lifecycle. - Scheduled research now delivers itself. A finished briefing leaves the
run through an outbox rather than waiting to be read: the outbox row is
claimed under a lease before sending so a crash mid-delivery cannot double
post, the send is wired to both the session and the channel runtimes, and the
push happens on the terminal event. Delivery is configured and watched from
Market Watch. - Each monitor's latest verdict is persisted on its job (#1152, refs #943,
thanks @he-yufeng) — the run's terminal briefing is parsed server-side into a
structuredlast_verdictrecord and the/scheduled-runslist carries it
inline, so the list renders a verdict without re-parsing free text per row or
going N+1 on sessions. The five research playbooks grow a strictly additive
## Verdicttail — one- SYMBOL: STATE - reasonline per tracked symbol,
each playbook declaring its own state vocabulary. Parsing is deliberately
strict: an ad-hoc prompt lands permanently atno_verdict_sectionand renders
as nothing rather than a warning, a run that tracked nothing is a real "no
calls" answer rather than an absence, and a malformed section degrades to
contract_violationinstead of showing a wrong verdict. The prior record is
embedded one level deep at write time and no deeper. - Futu connector — seven extended read-only endpoints (#1135, thanks
@549236606-oss) closing the gap between what the SDK exposes and what the
connector consumed:get_rehab(dividend/split/rights adjustment factors, so
backtests stop reading dividend gaps as price moves),get_capital_flow
(historical super/big/mid/small inflow buckets),get_capital_distribution
(today's in-flow versus out-flow snapshot),get_history_deals(fill records
for true cost-basis reconstruction, capped at the SDK's 360-day window),
get_acc_cash_flow,get_financials(income/balance/cash-flow statements),
andget_earnings_calendarwith EPS and revenue consensus. Each routes
through the same_quote_ctx/_trade_ctx/_assert_gatewayenvelope as
the original five, so missing data, missing privileges and a missing OpenD all
degrade to a clean fail-closed payload instead of an SDK stack trace. The
futu-apiSDK stays lazily loaded. - Vietnam equities (HOSE) as a backtest market (#1033, thanks @ngoanpv).
.VNmatched no entry in_MARKET_PATTERNS, so_detect_marketfell back to
a_shareand executed Vietnamese bars under China A-share rules — and asking
for Yahoo explicitly did not help, because both Yahoo loaders gated on suffix
and rejected.VNbefore building the request..VNnow resolves through the
Yahoo loaders with a["yahoo", "yfinance", "local"]fallback chain and runs
on a dedicatedVietnamEquityEngine. - Offline USD-M account reconciliation (#1106, relates #1030, thanks
@honginp) — immutable Binance USD-M account and position snapshot contracts
that compare an exchange observation against the existingAccountStateand
RiskSnapshotwithout mutating either, reporting numeric, structural,
missing-symbol and unexpected-symbol drift deterministically. Liquidation-engine
validation is explicitly left unassessed rather than silently assumed. This is
the Shadow 1 slice: contracts and fixture-only offline reconciliation. - Novita AI as a built-in OpenAI-compatible provider (#1059, thanks
@jax-novita) — registered in the provider registry withNOVITA_API_KEY/
NOVITA_BASE_URLand wired through capabilities, CLI onboarding,
.env.exampleand the README provider list, so it is selectable from the
built-in list instead of hand-configured as a custom endpoint. - GitHub Copilot as a provider through the official
github-copilot-sdk
(#990, supersedes #899, thanks @sykuang), with SDK-managed authentication from
COPILOT_GITHUB_TOKEN,GH_TOKEN,GITHUB_TOKEN, stored Copilot CLI
credentials orghcredentials, plus LangChain-compatible invoke, streaming,
reasoning and tool-call handling and Settings/preflight integration. This
implements the boundary #899 was closed on: no borrowed OAuth client ID and no
editor-impersonation headers. - tickerall hosted MetaTrader 5 data source (#968, closes #897, thanks
@miguelangelo78) — a broker's MetaTrader 5 candle feed over the hosted
TickerAll HTTP API, so forex and metals backtests run on any OS with no local,
logged-in MetaTrader 5 terminal. Purely opt-in:is_available()is False
unlessTICKERALL_API_KEYandTICKERALL_ACCOUNT_IDare set, and the loader
never joins an automatic chain. - A drift tolerance band for rebalance mode — a rebalance that would move
the book by less than the band is skipped rather than executed for a rounding
difference. - Spanish and German locales (#1087 thanks @daviddaco1, #1117 thanks
@1psconstructor). Spanish ships a full key-for-keyes.jsonplus
README_es.md, making Spanish the sixth README; German shipsde.jsonwith
the full UI key set. Both register inSUPPORTED_LANGUAGESand
localeLoaderson the existing lazy-loading path, and the locale-parity and
interpolation-variable tests cover them. - Desktop update safety boundary (#1101, refs #1016, thanks @QCYTSN) — a
strict PID-scoped backend/watchdog shutdown result for a future update
handoff, dormant Windows candidate verification, interrupted-attempt recovery
primitives, and a documented, tested rejection matrix for tampered, unsigned,
invalid-signature, wrong-publisher and downgraded candidates. The signed
0.3.0 → 0.3.1run itself remains blocked on a signing identity; this is the
part that could be made executable before a certificate exists, including the
proof that desktop cleanup never kills unrelated Python processes. - Docker images carry the Feishu and Telegram channel dependencies (#1088,
thanks @birdxs), with a manually triggered workflow that builds and pushes to
both GHCR and Docker Hub and syncs the project description to the Docker Hub
page. - Strict alpha t-stats in the bench JSON and HTML report (#1085, thanks
@jay79-boop), so the strict-mode number is readable from the artifact instead
of only the console. - Offset paging on the MCP surface for SEC filings and financial statements
(#1138), andload_skillrouted through the registry so an oversized skill
pages instead of being truncated at the transport limit (#1137).
Changed
- The MCP surface grows to 74 tools (from 70 in 0.1.13).
smartmoneyconceptsis now an opt-in[smc]extra, not a base
dependency — and the stale<3.14cap is gone from both the project
metadata and the distribution manifest. The package pulled in
numba→llvmlite, and llvmlite ships no macOS x86_64 wheel from 0.46
onward, so as a base dependency it turned every Intel-Mac install into a
source build that needs CMake (discussion #1035). It backs exactly one skill
example, whoseSKILL.mdalready tells the reader to install it. Intel-Mac
users on Python 3.11–3.13 can nowpip install vibe-trading-aiwithout a
toolchain.- CI runs the test job on both the floor and the ceiling of
requires-python, so a version-specific break at either end is caught
before release rather than by a user. - Vite moves from 6.4.3 to 8.2.0 in the frontend dev toolchain (#1022).
- Market-data provenance now declares per-market volume units (#1065,
#1131, thanks @shadowinlife), andget_market_datacarries that provenance
over MCP rather than dropping it at the transport boundary. - The Ollama runtime URL is normalized at source (#1074) instead of being
patched at each call site.
Fixed
- A run's grounding gate stops refusing answers it can support. The
identity/price recovery path now re-fetches missing evidence within a bounded
budget instead of rejecting outright (#1092, thanks @Shizoqua); identity
constants in rate formulas are no longer read as unsupported quotes (#1083,
thanks @AndyLongest); line-leading ordered-list markers are masked before
number extraction (#1063, thanks @zzz607); ISO dates that run straight into
CJK text are recognised as dates (#1132, thanks @Robin1987China); a
report-style date cell parses as a date and a US CSV stem resolves; a
dash-form trading day reads as a date and both bounds of a ranged level are
masked; an order line is read as an instruction rather than an observed
quote; and an "@" level is masked only when a quantity or an order label
accompanies it, so a bare price is still held to the evidence standard. - Agent run reliability (#1105, thanks @wiliao) — grounding
false-rejections, the final-answer gate and LLM timeouts, together with
prompt wording and support/resistance masking (#1060). build_registry()no longer returns a partial registry in silence
(#1129, thanks @er-s-an): a construction failure is reported instead of
leaving the caller with a short tool list that looks complete.- Backtest correctness:
excess_returnstays consistent with the corrected
benchmark_return(#1058, thanks @Shizoqua) and the corrected benchmark
fields are rounded to the metrics contract; the engine reports actual
post-fill positions rather than the requested ones (#1082, thanks
@AndyLongest); hold mode says so when it drops a requested resize; the
archive no longer mixes two runs' artifacts into one bundle; and importing
the runner module no longer loads.envas a side effect. - Quantlib numerics:
xirrand money-weighted return survive long-horizon
discount underflow instead of crashing (#1119, thanks @pengpengyi92); DCF
refuses non-finite inputs rather than returning a silently negative share
price (#1121, thanks @Robin1987China); a zero-volatility option discounts its
forward value (#1066), the fixed-income curve keeps decay inside the
requested bounds (#1076), event studies anchor to the prior session (#1078),
and cross-validation aligns label ends to the prior observation (#1079) — all
thanks @pengpengyi92.technical_indicatorRSI uses Wilder EWM smoothing
(#1056, thanks @Shizoqua). - Swarm: worker prompts are ordered for prompt-cache-friendly prefixes
(#1057, thanks @Echoandelementwebsites); worker artifacts are isolated between
retry attempts (#1053) and a path-shaped agent id is rejected before the retry
rmtree; rawok/successtool-result envelopes are rejected (#1052) and
oversized tool results truncate with the shared notice (#1110) — thanks
@Shizoqua; tool-less agents are no longer instructed to callwrite_file
(#1144, thanks @Echoandelementwebsites); and the per-taskChatLLMis closed
to stop a pooled-connection leak (#1145, thanks @cgycorey), with the same
treatment for the one-shot clients in auto-title and image vision (#1153). - Connectors and market data: baostock volume is normalized to board lots
behind a cross-source consistency guard (#1067, thanks @shadowinlife); the
IBKR market-data tier is selectable and starved quotes report asno_data
(#1075, thanks @jay79-boop), with the requested and the applied tier reported
separately; eToro gains runtime UI parity for SDK connector status (#1051) and
fixes crypto browse and flat market-data quotes (#1070, thanks @ofeksh-tr);
thetencentloader builds its SSL context from the certifi CA bundle, since
the new GlobalSign Atlas R3 root is absent from Python's default store and HK
quotes failed every retry (#1113, thanks @x-lambda); and the East Money
research-report endpoint gets the time parameters it now requires (#1077,
thanks @zzz607). - CLI:
connector ordersrenders broker_sdk rows — the renderer only knew
the nested IBKR shape, so a flat row left every column but Account empty — and
stringified SDK enums print asBUYrather thanOrderSide.BUY, while
class-B tickers such asBRK.Band decimal values are left intact (#1150,
thanks @nstavros); direct SDK account diagnostics render (#1073); theshow
subcommand dispatches itsrun_idinstead of the--showflag (#1147, thanks
@cgycorey); and a Docker Codex OAuth EOF explains itself (#1054, thanks
@zhiwuyazhe-fjr). - Providers: reasoning effort is honoured in chat completions (#1025, thanks
@cgycorey) and passed through to the Anthropic adapter (#1115, thanks
@straun-repo). - A remote MCP failure reports the server's own explanation instead of a
bare status code, so a rejected token reads as a rejected token (refs #1126). - Scheduled research: an in-flight delivery is no longer overwritten
(#1140, thanks @Shizoqua), and thescheduled-runsDELETE returns an empty
Responsefor its 204 (#1068, thanks @ofeksh-tr). - Tools and agent: unsupported ticker-plus-name symbol queries are marked
skipped rather than failed (#1114) and recovery steering is delivered as user
messages with inline system tags (#1112) — thanks @lorenzozanee;
prediction-market fields reject non-finite values and the envelope stays
strict JSON (#1136, thanks @Shizoqua);gross_profitis derived from revenue
minus COGS when the SEC tag is absent (#1111, thanks @cgycorey); every
compacted message folds through the summarizer; and the autopilot preserves
backtest validation evidence when linking hypotheses (#1139, thanks
@Shizoqua). - Onboarding:
.env.partialis created with owner-only permissions (#1086,
thanks @lukiod) and written atomically, so a failed save cannot destroy
recovery state. - Memory: the fallback tokenizer's minimum is aligned with the FTS5
sanitizer (#1071, thanks @Shizoqua). - Research reports reject a reversed window instead of reporting it as
missing coverage. - Web: inferred strategy labels are marked as inferred in the run dashboard
(#1134, part 1 of #1094, thanks @fixXxerTech). - The test suite no longer escapes its sandbox into the real config root
(#1118, closes #1116, thanks @lorenzozanee). A full run had been appending
syntheticorder_rejectedrecords to the live, hash-chained audit ledger at
~/.vibe-trading/live/audit.jsonland writing alive/audit_chain.jsonl
holding a single NUL byte. It was reported on Windows, but the escape was not
Windows-specific — a default macOS environment leaked the same way. The
config root is now sandboxed before collection, through one knob at the tail
of the resolution chain rather than a per-test override, andospatches are
confined to the module under test.
hash locks are portable across supported platforms (#1102); Windows desktop
packaging inputs are stabilized (#1104); the Docker build workflow is pinned
and the image stays on hash-locked dependencies; the alpha-bench SP500 panel
carries the GICS sector through; a frontend test waits on the sector
re-render rather than on the spinner disappearing; and the Spanish locale says
"demo", not "papel", for paper trading.
v0.1.13
2026年08月10日
v0.1.13 — The grounding repair, a finance-math layer, and institutional research
pip install -U vibe-trading-ai
408 commits and 162 merged pull requests since v0.1.12 (2026-07-22) — the largest release to date, from 35 contributors. Full detail in CHANGELOG.md.
🛡 The headline is a fix, not a feature
The single most user-visible defect in the 0.1.12 line: a well-formed question would spend minutes on real tool calls and then refuse to answer, returning
当前无法安全确认标的身份或价格证据,因此没有生成交易结论。请确认候选证券代码和交易所后再继续。
(cannot safely confirm instrument identity or price evidence)
The identity/grounding gate was rejecting answers it already had the evidence for. Seven independent root causes, each now fixed and covered by two-sided guard tests (healthy samples must pass; bad samples must still be blocked) plus mutation tests:
| # | Root cause | Effect |
|---|---|---|
| 1 | .SS and .SH treated as different instruments |
Every Shanghai ticker was permanently ambiguous |
| 2 | A+H dual listings and bare HK codes collapsed to ambiguous |
Dead end instead of a shortlist |
| 3 | Yahoo returns HTTP 400 for every CJK query; recorded as a source failure | Escalated to blocking invalidated instead of "not listed here" |
| 4 | A failed side query could demote an already-locked identity | Sticky aggregate status with no recovery |
| 5 | A hardcoded per-tool whitelist decided which bare tickers could match | 11 of the 17 documented argument spellings were blocked (3/14 → 14/14 after the fix) |
| 6 | Source and currency had to be written in ASCII | Chinese answers rejected for writing 雅虎/腾讯, or 元 instead of 人民币 |
| 7 | A thousands separator split the clause mid-number | ¥1,309.22 compared as 1 against the observed range → false price conflict |
Conceptual questions with no instrument at all, and comparison reports, no longer dead-end either.
A quote outside recorded OHLC evidence is still refused. The gate got more precise, not weaker — that is the point of the two-sided tests.
Verified end to end against a real LLM, real tools and real network: a 600519.SH query that previously took 6m14s and ended in the canned refusal now answers in 7–9s with zero rejections; 茅台 in 14s; a knowledge question in 14s.
This also closes the narrower cases from the 0.1.12 line — numbers that were never prices (confidence scores, indicator readings, moving-average windows, year-less dates like 8/5, percentage ranges, and a trading plan's own trigger levels, where close ≥ 6.45 is a condition rather than a quote) — and makes a many-candidate shortlist count as an answer rather than a stalled resolution (#1001, #983, #955).
🧮 src/quantlib — a tested finance-math layer
265 tested functions across 19 modules — every module the tool allowlists now exports. Skills now import these instead of carrying formulas inside markdown code blocks — if you find a pricing formula living in a SKILL.md, that is a bug, not a pattern.
| Module | Coverage |
|---|---|
options |
Black-Scholes price + greeks, implied-volatility inversion |
fixedincome |
Bond math, Nelson-Siegel / Svensson curve fitting |
credit |
Altman Z-score, Merton / KMV distance-to-default |
timeseries |
Stationarity, cointegration, GARCH, bootstrap |
risk · var_backtest |
VaR / CVaR / EVT and their backtests |
attribution |
Brinson-Fachler decomposition |
performance · fundmath |
TWR / MWR / Modified Dietz; XIRR / MOIC / DPI / TVPI |
factormodel · eventstudy |
Factor regressions, event studies |
multipletesting · crossvalidation |
Deflated significance, purged CV |
impact |
Market-impact models |
The read-only quantlib_call tool reaches all of it through one contract, so the finance math works on the CLI, the Web UI, the REST API and MCP — including deployments where bash is gated off. It is structurally not a shell — module allowlist, __all__-only dispatch, export_* refused. Econometrics needs the stats extra; those functions lazy-import and name the missing one.
💰 Valuation engine
A valuation engine that refuses to invent its own inputs. The one rule in contracts.py: a missing input makes a model NOT RUNNABLE and is never silently defaulted — every default in a valuation model is an opinion wearing a constant's clothes.
run_dcf— FCFF bridge, WACC build, mid-year discounting, net-debt bridge, WACC×g sensitivity grid. Dual terminal value: each method is cross-checked against the other's implied multiple and implied g.run_comps— EV bridge, LTM + calendar-year calendarisation, multiple matrix. A peer with a non-positive denominator is excluded and reported, never averaged in as a negative multiple.threestatement— linked projection with a hard balance assertion, an explicit revolver plug, and an iterated interest↔debt circularity that must converge or raise.
Artifacts are input-hashed and versioned, with xlsx / pptx export.
🏛 Institutional research
Six slash commands — /comps /dcf /attrib /memo /earnings /screen — each carrying a step skeleton and an arithmetic-consistent worked example: the Brinson decomposition sums exactly to active return, and the earnings bridge sums exactly to the EPS delta.
Investor lenses become a standalone skill: named-investor reasoning frameworks as stackable analysis overlays, decoupled from the data layer. Each lens is an operating procedure — priority signals, disqualifying conditions, typical misuse — not a biography, and names no tool.
Five ready-to-schedule research playbooks (premarket brief, earnings-season tracker, portfolio checkup, A-share money flow, institutional-holdings diff), reachable three ways: auth-gated REST routes, a vibe-trading playbook CLI subcommand, and a /playbook slash command. Templates state their data needs in natural language rather than naming tools, so coverage can grow without editing them, and every one mandates naming a missing input instead of filling it from memory.
📊 Four new read-only data tools — all on free public sources
get_institutional_holdings— SEC 13F-HR books in manager / ticker-holders / top-managers modes, with quarter-over-quarter position diffs for factor use. Cover-page totals carryvalue_units+ basis, because pre-2023 filings report in thousands.etf_holdings— cross-market look-through. SEC N-PORT for US; for A-shares the semi-annual/annual reports carry the full book, not the quarterly top ten:510300returns 342 rows covering 98.66% of net assets versus 10 rows / 22.74%.coverageseparatesfull_portfoliofromtop_n_disclosed, and every response stamps the report period — a full book is always the older disclosure.prediction_market— event-contract search / event / market / history, with prices converted to implied probability and the unit labelled, so downstream never reads 0.63 as dollars. Read-only by construction: no order path.research_papers— arXiv + OpenAlex search/read with source-anchored claim extraction. Anything not literally present in the source is left empty and markednot stated in source, and a paper's claimed performance is never presented as our backtest result.
🧾 Governance wired into every run
- A run manifest hashes the prompt, the skill contents, the tool registry and the package versions — so "what methodology produced that number?" is answerable a month later.
- The audit ledger chains each record to its predecessor's hash and fsyncs. Editing or deleting a record is detectable, and an edit that recomputes its own hash is still caught one record later via
prev_hash_mismatch. Timestamps are always caller-supplied; no module here callsdatetime.now(). - Trace redaction is sink-aware:
contentis released only in the tool-RESULT sink and stays redacted in the fail-closed ARGUMENTS sink used by tool-call arguments and the live audit ledger.envis never released. Result strings are pattern-scrubbed, since shell output arrives as a JSON envelope. - All 30 swarm presets were re-audited — a deliverable no granted tool can compute is now declared as such instead of invented.
🧱 Platform
- Desktop shell — a source-first Electron host owning the backend lifecycle: random loopback port, per-launch secret, five-locale startup recovery, owned-process cleanup (#923). Windows packaging assembles a checksum-pinned embedded Python 3.12 runtime with x64 NSIS review/signing paths, plus Electron
safeStoragefor an allowlisted credential set — the renderer can set or clear secrets but never read them, plaintext config migrates once, and both unsigned-review and signed builds fail closed on the wrong signature state (#1015). No installer artifact was published from that PR. - eToro joins as the 13th broker connector with path-separated demo/real profiles; demo keys structurally reach only
/demopaths (#989). - Korea (KRX: KOSPI/KOSDAQ) becomes the 9th backtest engine — execution-time ±30% band on the unified tick grid, structurally long-only, config-driven 2026 0.20% securities transaction tax (#693).
- Canadian equities end to end —
.TO/.Vclassified in CAD, Yahoo → yfinance → local, Canada-specific GlobalEquity rules,XIC.TObenchmark, mixed-currency aggregation refused (#1024, #1019, #1037, closes #952). - OpenBB Workspace bridge (#817) and a read-only Taiwan snapshot tool (#848).
src/entities— a typed entity + irregular dated cash-flow substrate for NAVs, capital calls and coupons, deliberately parallel to the bar engines so anavcolumn can never reach one and get priced as a close. Surfaced bycashflow_performance.orderbook_depth— crypto L2 ladder via ccxt: spread bps, depth imbalance, and impact cost of a stated notional walked through the real book both ways.- ModelScope joins the built-in providers (#1011);
vibe-trading updateself-upgrades and distinguishes wheel installs from editable checkouts (#1020); Settings gains live model discovery and records the immutable provider/model/reasoning identity that actually served each reply (#924). - The MCP surface grows to 70 tools.
alpha_zoo+ boundedalpha_bench(#979) and QVeris discovery/inspect/execute (#976, cost quote read from the marketplace rather than trusted from the caller) join, and so do six read-only analytics tools that had reached the agent but never MCP —quantlib_call,cashflow_performance,orderbook_depth,sentiment,technical_indicatorsandget_fundamentals. Order-placing tools remain structurally un-exposed: the mirrored registration path refuses any class whoseis_readonlyis notTrue. - Memory Tier 2 — hierarchical routing, BM25 semantic linking, TF-IDF compression and an FTS5 index with CJK bigram tokenization, behind a one-line
VT_MEMORY=off|on|fullpreset. All off by default (#815, #733). - New read-only tools:
sentiment(#939),technical_indicators(#921), analyticoptions_payoff(#946).
🔒 Sandbox
A closed gap: generated strategy code could import the broker layer, and could reach socket / subprocess / os.system / ctypes through a renamed binding. Both were accepted before; both are now refused. src.quantlib still imports.
✅ Correctness — the expensive ones
- SEC reporting periods are keyed on their
(start, end)span. A 10-Q files the true quarter and the year-to-date frame under the same end date and fiscal period, soperiod="annual"had been returning a single quarter for AAPL FY2018–2020 — a 4.2× understatement — and every fiscal-Q4 slot in a quarterly series carried the full-year figure. - Tushare A-share prices are corporate-action adjusted in both the factor bench and backtests. A raw close-to-close return across an ex-date was off by up to 47 percentage points (300750.SZ, 2023-04-26). The CSI300 bench also masks each date to its point-in-time index membership.
bar_returnsno longer erases the move across a trading halt longer than the forward-fill window — the resumption move was silently recorded as 0, understating volatility and inflating Sharpe.- Annualisation now covers all 24 data sources at every interval, with a coverage test that fails CI when a loader lands without entries.
- Cross-market composite backtests refuse a mixed-currency code set instead of summing CNY, USD and KRW into one equity curve.
- Option legs are marked at the volatility they were opened at, removing a fabricated day-zero P&L of up to +93% of premium.
- A 19-PR interval-normalization sweep — lowercase
1h/4h/1d/1waccepted everywhere, unsupported intervals fail fast instead of silently returning daily bars. - Two quantlib modules were allowlisted but unreachable.
attribution(Brinson-Fachler) andimpact(market-impact models) carried no__all__, andquantlib_calldispatches on__all__alone — so the tool listed zero functions for both while the package docstring advertised them. Both now export, and a guard test fails when any allowlisted module exposes nothing; the existing test only asserted that each module imports, which could never catch this. - The published MCP manifest under-reported the server.
SKILL.md's tool count was derived by counting@mcp.tooldecorators, which ignores every tool registered through the mirrored path — so four institutional-research tools were live over MCP and absent from the manifest, and the contract test asserted that absence was correct. Both tests now measuremcp.list_tools(). - Resource leaks closed: HTTP throttle sweeps stale buckets interval-aware, the rate limiter no longer grows unboundedly with unique client IPs, the event bus notifies and removes subscribers on clear, and
_json_loadsis guarded against corrupted JSON in database columns.
🙏 Contributors
@santhreal · @shadowinlife · @Robin1987China · @he-yufeng · @QCYTSN · @Shizoqua · @honginp · @cgycorey · @wiliao · @ngoanpv · @x-lambda · @ofeksh-tr · @00EVA · @zwrong · @yrk111222 · @su322 · @hhj123123 · @dineeshd · @sambazhu · @ddy4633 · @tyj147454413-cmd · @y85998607 · @JungHoonGhae · @shugaoye · @TSENGCHIENFENG · @darkknight4563 · @MuggleJinx · @klmtseng · @ebujinovch · @g0rdonL · @AmirF194 · @Echoandelementwebsites · @yagnikpipaliya · @dvirarad · @1anter
Full changelog: v0.1.12...v0.1.13
详细ChangeLogv0.1.12
2026年07月22日
🌀 v0.1.12 — Correlation regime timeline, three new providers, MetaTrader 5 + a reliability wave
v0.1.12 rolls up nearly two weeks of work since 0.1.11 (2026-07-10) — the headlines: a correlation regime timeline that answers "when did the market fuse into one bloc, and are we in that state now?", three new LLM providers plus catalog-based endpoint resolution that makes every provider work with just a key, the MetaTrader 5 (Exness) broker connector (12 brokers), the Strategy Development Manager skill, Binance USD-M perpetuals with historical funding, and a broad reliability wave — strict-JSON/finite hardening, session/journal robustness, an 80× vectorization, and the native zai streaming fix.
This release is available on PyPI, ClawHub, and GitHub Releases.
pip install -U vibe-trading-ai
# or
uv tool install --reinstall vibe-trading-aiHighlights
🌀 Correlation regime timeline
A new additive GET /correlation/regime endpoint and an opt-in "Regime timeline" strip on the Correlation tab (#756, closes #719, thanks @ebujinovch). It reuses the same price data /correlation already fetches: rolling pairwise correlations reduce to an edge-density scalar per bar (the fraction of asset pairs whose |ρ| clears a threshold), the series is causally smoothed (trailing window — never reads the future), and a two-threshold hysteresis state machine marks contiguous FUSED episodes, with a dead band that suppresses chatter. It shares /correlation's auth + rate-limit budget, floors the window so short timelines can't return empty, and is explicitly descriptive risk context, not a trading signal. Backed by the correlation-regime skill (#557).
🔌 Three new LLM providers + robust endpoint resolution
Native adapters for SiliconFlow (CN + Global, #565, thanks @UNHNQ), iFlytek Spark (#537, thanks @FenjuFu), and the native Anthropic Messages API (#695, thanks @jelech; pip install "vibe-trading-ai[anthropic]"), plus MiniMax regional endpoints (#731, thanks @octo-patch). Underneath, provider credentials are resolved through one centralized path (#563, thanks @shadowinlife), and two long-standing rough edges are fixed (#758): when no *_BASE_URL is set, the backend now falls back to each provider's canonical catalog endpoint (the same default Web Settings already used) instead of silently defaulting to api.openai.com — so a provider works with just a key — and an endpoint that streams zero chunks falls back to a non-streaming invoke rather than erroring, with an HTML-error-page hint when a base URL is misconfigured.
📈 MetaTrader 5 (Exness) connector + mt5 data source — 12 brokers
A first-class MetaTrader 5 broker connector (#481, thanks @StaniellG) — full read surface plus order placement against a locally running terminal, with a bidirectional identity guard (paper profile ⇔ demo trade_mode, login pinned, contest rejected) and connector-level max_order_volume / max_order_notional_usd caps on demo AND live. The live mandate gate gains forex/cfd instrument vocabulary and a lot-aware sizing hook so USD caps bind on lot-sized orders (0.1 lot EURUSD ≈ $10,800, never 0.1 × quote). The mt5 loader heads the forex fallback chain (broker-exact symbols with Exness suffix discovery, 1m–1D bars). Broker connectors: 11 → 12; market-data sources → 23.
🧬 Strategy Development Manager
sdm_register / sdm_status / sdm_decay_scan turn academic papers and broker research into registered factors and strategies (#457, closes #455, thanks @shadowinlife), backed by a persistent SQLite artifact store (UNIQUE(name, universe)) and automated IC/Sharpe decay monitoring driving an active → monitoring → decayed → disabled lifecycle. Ships with pluggable OCR for read_document (local RapidOCR by default; cloud Qwen-VL is explicit opt-in only, never auto-selected).
₿ Binance USD-M perpetuals
Explicit BTC-USDT-PERP routing with execution/mark price separation (fail-closed when the two aren't timestamp-synchronized) and historical funding settlements (#470/#716, thanks @honginp). Maintenance brackets are decoupled from the live authenticated fetch and supplied as a validated, content-hashed artifact instead (#757), so a plain -PERP backtest stays zero-credential — the regression where every perp fetch required a Binance API key is gone.
👁️ Pluggable OCR + LLM-vision extraction
read_document gains a pluggable OCR engine architecture with optional LLM-vision extraction and a configurable text-density threshold (#548, thanks @shadowinlife) — local by default, cloud engines opt-in only, never auto-selected.
🧰 Platform & safety
- Look-ahead-bias fix across all five portfolio optimizers (#487, thanks @YZY0108) — weights executed at a bar's open no longer include that bar's close-to-close return. Plus realized portfolio turnover metrics for every optimizer (#478, thanks @Robin1987China).
- Security hardening — all 10 findings from the 2026-07-10 external audit closed (#476): AST-hardened backtest sandbox, short-lived SSE auth tickets, hardened Compose,
/correlationauth + rate limiting, security headers, hash-locked dependencies, and SHA-pinned Actions. - 80× signal-alignment vectorization (#698, thanks @shadowinlife) and swarm MCP tool-discovery caching (#704) cut wall-clock on wide panels and multi-worker runs.
- Opt-in TAP mode for Alpaca (#377, thanks @0xZKnw), IBKR thread-local connection pool + snapshot quotes (#636, thanks @MikeCer), Robinhood
account_numberwiring (#726, thanks @nareshkps), the Requesty gateway provider (#474, thanks @Thibaultjaigu), and user swarm-presets discovery (#570, thanks @darkknight4563). - Two new academic factors — Frazzini-Pedersen betting-against-beta (#480, thanks @YogeshModi24) and
academic_corr_rewire(#705, thanks @ebujinovch): Alpha Zoo 460 → 462 across 5 families.
🛠️ Reliability & correctness wave
- Strict-JSON / finite-number hardening across the backtest + tools stack (thanks @santhreal) — risk ratios stay finite when equity crosses zero (#765) or annualizes an explosive path (#739/#740); scalar metrics (#766), factor IC std (#767), and pattern trend-slope (#764) emit strict RFC-8259 JSON (
null, neverNaN/Infinity); Black-Scholes helpers treat non-positive spot/strike as intrinsic (#744). - Session / journal robustness — one corrupt
session.json(#762) or schema-badmessages.jsonlline (#763) no longer aborts listing/reading; Excel float-stringified A-share codes (#770), unicode-dash PDF page ranges (#769),export KEY=dotenv lines (#768), and yahoo1mbars (#761) all parse correctly. - Broad reliability — cancellation is honored before the first AgentLoop iteration (#641, closes #638), a frontend
insertBeforestreaming DOM-race is fixed (#717, thanks @Marnie0415), the composite engine falls back for unknown symbols (#734), codex stream HTTP failures are classified for correct retry (#663), and #584 (thanks @xkam7ar) closes a batch of packaging/web/scheduler/swarm/CLI issues.
🙌 Contributor cycle
~90 correctness/reliability fixes and features from a wide contributor cohort — @santhreal (a 30-PR correctness sweep), @xkam7ar (reliability + QVeris hardening), @shadowinlife (SDM, OCR, vectorization), @ebujinovch (regime timeline), @honginp (Binance perps), @StaniellG (MetaTrader 5), and many more. Full per-person credits live in the README Contributors section and the CHANGELOG. Thanks also to @GabbaTauchi for the zai bug report (#758).
Install / upgrade
| Channel | Command |
|---|---|
| PyPI | pip install -U vibe-trading-ai |
| uv tool | uv tool install --reinstall vibe-trading-ai |
| ClawHub (Claude Desktop / OpenClaw / MCP clients) | clawhub install vibe-trading or update the installed skill |
| Docker | docker compose pull && docker compose up -d |
Remote API/Web deployments should set API_AUTH_KEY and explicit trusted CORS origins; local CLI and localhost Web UI workflows stay low-friction.
By the numbers
Numbers at 0.1.12: 8 backtest engines + options_portfolio · 462 alphas / 5 families · 88 skills · 30 swarm presets · 23 market-data sources · 12 broker connectors · 75 free-mode tools (78 with QVeris) · 54 MCP tools · 5 optimizers · 16 IM adapters.
Validation
Full backend suite 6,019 passed (only pre-existing env/network fails, confirmed against clean main); frontend build + 310 vitest green; wheel verified (vibe_trading_ai-0.1.12, contents spot-checked). Protected agent core (src/agent, src/session, src/providers) reviewed for every change.
Full changelog: CHANGELOG.md · Compare: v0.1.11...v0.1.12
v0.1.11
2026年07月11日
🇮🇳 v0.1.11 — India equity, fundamental factors, IM channels + roll-up since 0.1.10
v0.1.11 is a roll-up of three weeks of work. The headlines: Indian equity (NSE/BSE) becomes a first-class backtesting market, a PIT-safe fundamental factor layer brings the Alpha Zoo to 460 alphas across 5 families, the IM channel runtime delivers research through 16 message adapters, and scheduled research runs end to end. Around them ship an optional QVeris premium data track, the completed api_server modularization, centralized env config with a CI gate, a Trading 212 read-only connector (11 brokers), a turnover-aware portfolio optimizer (5 optimizers), an analyze_image vision tool, and a long tail of contributor fixes.
This release is available on PyPI, ClawHub, and GitHub Releases.
pip install -U vibe-trading-ai
# or
uv tool install --reinstall vibe-trading-aiHighlights
🇮🇳 Indian equity (NSE/BSE) as a first-class market
A dedicated IndiaEquityEngine (#305, thanks @muku314115) models the market as it actually trades: T+1 delivery, no overnight shorts (opt-in intraday), configurable circuit bands, 1-share lots, and a config-driven STT / stamp-duty / exchange / SEBI / GST cost stack. .NS/.BO symbols route through yahoo → yfinance → india_broker → local, where india_broker is an opt-in read-only Shoonya/Dhan bar bridge, and 255 alpha101/qlib158 factors are opted into the new equity_in universe. Backtest engines: 7 → 8; market-data sources: 19 free + QVeris = 20.
💎 Fundamental factor layer, Phase 1 — PIT-safe SEC fundamentals
SEC company facts now flow into dense daily fund:* factor panels the same way price data does — filed-date anchoring (you only see what was public that day), a first-filed restatement policy, true-quarter (start, end) frame selection with Q4 synthesis so YTD/annual frames can't contaminate TTM, and rolling TTM aggregation. On top: a get_fundamentals tool and 4 quality/value factors in a new fundamental zoo family. With the 4 canonical academic alphas from earlier in the cycle (#277, thanks @Robin1987China — Jegadeesh reversal, George–Hwang 52-week high, Amihud illiquidity, Harvey–Siddique co-skewness), the Alpha Zoo grows 452 → 460 across 5 families.
💬 IM channel runtime — research delivery over 16 adapters
The same agent session runtime now attaches to 16 built-in message adapters — WebSocket, Telegram, Slack, Discord, Matrix, WhatsApp, Signal, QQ/NapCat, WeChat/WeCom, Feishu, DingTalk, email, MS Teams, MoChat — dependency-gated with install hints, configurable via AgentConfig.channels, and controllable from REST (/channels/*), CLI (vibe-trading channels ...), and Web Settings, in all 5 UI locales. This release also fixes the first-image papercut: inbound media now lands under ~/.vibe-trading/uploads/<channel>/, inside the agent's allowed file roots (#465, thanks @fei-moss), and NapCat private messages trigger pairing codes (#463).
⏰ Scheduled research, end to end
A default-off background executor (VIBE_TRADING_ENABLE_SCHEDULER) fires due interval/cron jobs through the session runtime (#278, thanks @mvanhorn), on top of a crash-safe atomic job store, auth-gated /scheduled-runs routes (tests in #452, thanks @Robin1987China), a Reports library, and post-backtest attribution. Combined with the Research Autopilot Phase 3 loop closure (#267, thanks @Robin1987China) — scaffold_signal_engine → link_autopilot_backtest — hypothesis → signal-engine → backtest → schedule now runs without a human in the middle.
💰 Optional QVeris premium data track
The 19 free sources stay the default. An explicit-only paid mode (Settings → QVeris or vibe-trading data mode paid) unlocks 63+ providers behind 3 key-gated tools (qveris_search / qveris_inspect / qveris_execute) with preview-by-default and a session budget gate. QVeris never enters auto-fallback: no key, no cost, no surprise.
🧰 Platform & safety
api_servermodularization completed — 1,103 → 371 lines (#424 closing #331, thanks @shadowinlife) after a cycle of route slices.- Centralized env config — one Pydantic
EnvConfigschema + an AST CI gate that rejects rawos.getenvoutside the config layer (#440, thanks @shadowinlife). - Trading 212 read-only connector (#321, thanks @mvanhorn) — 11 brokers. No runtime paper/live discriminator →
place_order/cancel_orderhard-refuse every order, paper included. Plus an opt-inPreTradeAdvisoryInterfacethat records advisory reviews without bypassing the mandate gate. - Security: loopback CSRF protection (#293), SSRF-guard hardening for CGNAT/mesh ranges (#389), Pillow/langchain CVE floor bumps (#390), tightened dev defaults.
- Turnover-aware optimizer (#466, thanks @Robin1987China) — 5th optimizer: mean-variance utility with an L1 penalty on weight changes, so the portfolio trades only when improvement outweighs churn.
analyze_imagevision tool (#464, thanks @fei-moss) — semantic chart/screenshot reads through the session model (vision-capable model required). Tools: 72 free-mode / 75 with QVeris.- Manifest count guards (#461, thanks @asahikiko) — packaged SKILL.md capability counts are now asserted against source in CI.
🙌 Contributor cycle
60 contributor-authored PRs merged since 0.1.10 (73 total). Full per-person credits live in the README Contributors section and the CHANGELOG — highlights: @shadowinlife (12 PRs incl. the api_server capstone), @Robin1987China (autopilot P3, academic alphas, shadow-account conditions, turnover optimizer), @muku314115 (India equity), @mvanhorn (scheduler, Trading 212), @fei-moss (vision tool + IM fixes), @sambazhu (value-investing toolkit), and many more.
Numbers at 0.1.11: 8 backtest engines · 460 alphas / 5 families · 86 skills · 30 swarm presets · 20 data sources · 72 free tools (75 paid) · 54 MCP tools · 11 broker connectors · 16 IM adapters · 5 optimizers.
详细ChangeLogv0.1.10
2026年06月19日
🌍 v0.1.10 — Global data layer + roll-up since 0.1.9
v0.1.10 is a roll-up release. The headline is the Global data layer: the market-data registry grows from 10 to 18 sources and gains 18 read-only data tools that reach past OHLCV into fundamentals and flow, all exposed over MCP. Around it ships everything accumulated since 0.1.9 — 10 broker SDK connectors, the Alpha Zoo alpha compare full stack, a provider-reliability overhaul, Research Autopilot Phase 1, an opt-in local data cache, and a community-driven security-hardening wave.
This release is available on PyPI, ClawHub, and GitHub Releases.
pip install -U vibe-trading-ai
# or
uv tool install --reinstall vibe-trading-aiHighlights
🌍 Global data layer — 18 sources + 18 read-only data tools
The loader registry grows from 10 to 18 market-data sources:
- Free, no key —
tushare,okx,yfinance,akshare,baostock,tencent,mootdx,ccxt,futu,local, plus four new direct-API additions: Eastmoney, Sina, Stooq, and a direct-HTTP Yahoo client. - Optional key-gated US providers — Finnhub, Alpha Vantage, Tiingo, FMP; absent keys are skipped in the fallback chain, never crash it.
Fallback chains are re-ordered by IP-ban risk (lightweight, throttle-tolerant public endpoints lead; key-gated REST trails) behind a shared throttled HTTP gate (backtest/loaders/_http.py) with per-host rate buckets, jitter, and session reuse. On top sit 18 read-only data tools — fund flow, dragon-tiger board, northbound (Stock-Connect) flow, margin trading, block trades, shareholder count, lockup expiry, sector membership, research reports, news, SEC filings (EDGAR + XBRL), financial statements, options chains, institutional holdings, full-market screening, symbol search, FRED macro, and iwencai natural-language A-share search — across A-share / US / HK, all exposed over MCP. Three shared clients (eastmoney / yahoo / sec_edgar) back the loaders and tools, and a consolidated data-routing index plus per-source eastmoney / sec-edgar skills document the layer.
💱 10 broker SDK connectors — read + paper, mandate-gated live
Trading is connector-first: pick a profile, and paper/live is an attribute of the connector. This release brings the roster to 10 brokers — IBKR (local read-only TWS/Gateway) · Robinhood (Agentic MCP, OAuth) · Tiger · Longbridge · Alpaca · OKX · Binance · Futu · Dhan · Shoonya (India NSE/BSE + F&O). Direct-SDK connectors share a broker_sdk transport and each does read + paper-account order placement; live placement passes a single fail-closed bounded-autonomy gate (sdk_order_gate.py: mandate + kill switch + audit). Brokers with no runtime paper/live discriminator (Longbridge, Dhan, Shoonya) are structurally capped at paper + read-only — their place_order / cancel_order hard-refuse any non-paper config at the first line. Order-placing tools stay off MCP (agent + CLI only).
📊 Alpha compare across CLI / REST / Web / agent tool
vibe-trading alpha compare ranks any set of Alpha Zoo factors by IC / IR on your universe, sharing one compare_runner.compare_alphas core behind the CLI, a POST /alpha/compare REST route with SSE-streamed progress, the Alpha Zoo Web UI Compare view, and a read-only alpha_compare agent tool. A run_bench(only=…) subset filter benches only the compared factors instead of the whole zoo.
🔌 Provider-reliability overhaul
A provider capability layer gates reasoning capture/replay, Gemini thought signatures, Kimi user-agent, and OpenRouter reasoning bodies per provider. vibe-trading provider doctor prints a redacted diagnostic snapshot. Streaming failures now raise an explicit, redacted ProviderStreamError (carrying status_code + .retryable) with one retry for transients and fail-fast on 4xx; a throttled reasoning_delta SSE drives a "Reasoning…" liveness indicator in the Web UI. Also: an optional native DeepSeek adapter (VIBE_TRADING_DEEPSEEK_ADAPTER), read-only tool hard-timeouts (VIBE_TRADING_TOOL_TIMEOUT_SECONDS), and per-provider temperature handling (Kimi-k2 forced to 1.0, MiniMax clamped > 0).
🔬 Research Autopilot Phase 1
run_research_autopilot turns a hypothesis_id into a research goal (thesis as objective, backtest-relevant acceptance criteria, next-step hints), and generate_backtest_config auto-writes a backtest config.json from the hypothesis's universe and data sources — so the agent goes straight from idea → signal_engine.py → run.
🗃️ Opt-in local data cache + local loader
VIBE_TRADING_DATA_CACHE=1 caches settled bars to ~/.vibe-trading/cache (user home, never the repo); a staleness guard never caches a range ending today, and cached frames are byte-identical to live fetches. A new local loader reads OHLCV straight from your own CSV / Parquet / DuckDB files via ~/.vibe-trading/data-bridge/config.yaml, with normal fallback-chain support.
🛡️ Security & hardening wave
A community-driven hardening pass: API settings-write auth (#245), agent shell-tool opt-in (#243), loopback-host rebinding rejection (#242), explicit local-shutdown auth (#241), and identifier containment for mandate proposal-ids (#256), persistent-memory types (#257), and MCP swarm run-ids (#258). Plus responsive Stop mid-stream + SSE reconnect on returning to a running session (#229), multi-engine web_search fallback (#231), and Gemini thoughtSignature round-trip through OpenAI-compat tool calls (#176, #184).
🪪 Version reporting is now consistent
--version, the REST API (/docs + /api), the MCP server handshake, and the Web UI footer all derive from one source — the REST API had drifted to a wrong hardcoded 5.0.0. Packaging also now ships skill example scripts in the wheel, and the Docker image installs weasyprint's native libs so PDF reports render.
Install / upgrade
| Channel | Command |
|---|---|
| PyPI | pip install -U vibe-trading-ai |
| uv tool | uv tool install --reinstall vibe-trading-ai |
| ClawHub (Claude Desktop / OpenClaw / MCP clients) | clawhub install vibe-trading or update the installed skill |
| Docker | docker compose pull && docker compose up -d |
Remote API/Web deployments should set API_AUTH_KEY and explicit trusted CORS origins. Local CLI and localhost Web UI workflows remain low-friction.
By the numbers
- ~98 non-merge commits since
v0.1.9 - 18 market-data sources with auto-detect + ban-risk-ordered fallback
- 66 agent tools (auto-discovered) · 54 MCP tools
- 79 bundled finance skills
- 29 swarm presets
- 10 broker connectors (read + paper, bounded-live for those with a structural paper/live guard)
- 7 backtest engines + composite cross-market engine + options portfolio
- 4167 backend tests passing (the weasyprint shadow-report PDF suite is green on CI; it segfaults only on macOS/conda without Pango)
- Clean-room verified: a fresh
pip installof the0.1.10wheel imports all new loaders/tools, and the wheel + sdist ship theeastmoney/sec-edgarskills including UTF-8 Chinese reference filenames
🙌 Credits
Code contributors this cycle
- @warren618 / Haozhe Wu — the global data layer (8 sources + 18 read-only data tools, 3 shared clients), the 10 broker SDK connectors + bounded-autonomy order gate, the alpha-compare full stack, the provider-reliability overhaul, multi-engine
web_searchfallback, responsive Stop + SSE reconnect, multi-language READMEs, integration, release. - @Hinotoi-agent — a security-hardening wave: explicit local-shutdown auth (#241), loopback-host rebinding rejection (#242), agent shell-tool opt-in (#243), settings-write auth (#245), mandate proposal-id containment (#256), persistent-memory type validation (#257), MCP swarm run-id containment (#258)
- @mvanhorn — the opt-in local data cache (#177), Gemini
thoughtSignatureround-trip over OpenAI-compat tool calls (#176), the custom data loader guide (#194), and the glm/zhipu provider alias + model-name inference (#247) - @gyx09212214-prog — loader robustness for malformed crypto/RSSHub timeout env vars (#227, #240), requested yfinance end-date inclusion (#226), strict run-card JSON for non-finite metrics (#238), and ddgs retry-fallback coverage (#239)
- @BillDin — swarm agent status in the chat UI (#188), explicit preset-name handling (#189), the loader-backed market-data tool for swarm workers (#199), and preset-context continuations (#200)
- @Robin1987China — the Research Autopilot goal-hypothesis bridge (#260), the local CSV/Parquet/DuckDB data loader (#252), and an assistant-prefill fix + configurable Kimi User-Agent (#248)
- @LemonCANDY42 — the read-only runtime status dashboard (#210), persisted AgentLoop usage artifacts (#223), and opt-in Run Detail chart payloads (#225)
- @zwrong — the
trace.jsonloverhaul with zero truncation + offload (#206) and session-id on exit +resume <session-id>(#218) - @forge-builder — the AI contributor guide (#173) and the OpenClaw MCP research-only smoke-test docs (#165)
- @skloxo — Chinese (zh-CN) frontend localization (adopted from #217)
- @LeeCQiang — Chinese docstrings across all 452 Alpha Zoo factors (#180)
- @KaiLuettmann — GHCR pre-built image publishing on release (#187)
- @ngoanpv — Gemini
thought_signaturepreservation through the AgentLoop dict path (#184) - @ShahNewazKhan — Docker host-Ollama reachability via
host.docker.internal(#196) - @sambazhu — frontend sync of completed chat attempts (#236)
- @bhlt — baostock-native code format support (#230)
- @octo-patch — MiniMax M3 default model upgrade (#162)
Lab + community
- HKUDS (HKU Data Intelligence Lab) — research direction, infrastructure, and the broader Vibe-Trading platform this builds on.
- Everyone who filed issues, reviewed PRs, and stress-tested the framework this cycle.
Validation before publishing
- Tests:
4167 passed(pytest agent/tests/, weasyprint shadow-PDF suite covered on CI). - Independent 4-agent adversarial audit of the release diff (packaging / version-derive / Docker / frontend) — all SHIP-OK.
- Wheel sanity:
dist/vibe_trading_ai-0.1.10-py3-none-any.whlbuilt and inspected — all 8 new loaders + 3 shared clients, all 18 new data tools, and theeastmoney/sec-edgarskills (incl. UTF-8 Chinese reference filenames + scripts) present; a fresh-venvpip installimports every new loader/tool from site-packages. - Version consistency: package, REST API, MCP server, and Web UI all report
0.1.10. - Frontend:
tsc -b+npm run buildclean. - Multi-language READMEs: English / 中文 / 日本語 / 한국어 / العربية updated with the 0.1.10 news + contributor credits.
Full Changelog: v0.1.9...v0.1.10
详细ChangeLogv0.1.9
2026年06月01日
pip install -U vibe-trading-ai · 36 MCP tools · 77 skills · 29 swarm presets
A roll-up release covering everything since 0.1.8.
Highlights
- Connector-first broker profiles (IBKR + Robinhood). Trading access starts from a selectable connector profile instead of separate broker/live entry points;
vibe-trading connector list/use/check/account/positions/orders/quote/historyand the MCPtrading_*tools share the selected profile, with paper/live as an attribute of the connector. IBKR is usable immediately as a local read-only TWS / IB Gateway profile; the official IBKR remote MCP path is seeded as an OAuthmcp.readprobe until stable read tool names ship. Robinhood Agentic Trading is a bounded connector behind OAuth, a committed mandate, an order guard, an audit ledger, and an instant halt switch. - Research Goal runtime. Long-running, research-only goals with auditable checklist criteria, budgets, and a
/goalCLI command, plus REST + MCP endpoints and a Web GoalDrawer. - Swarm pass. Live reconcile + MCP keepalive (#132), operator-configured external MCP tools in workers (#142), DAG gating when an upstream task fails (#145), a strict alpha-bench random control (#143), and a new
retry_runto relaunch failed/stale runs — 36 MCP tools now. - CLI package refactor (
agent/cli/) with a refreshed terminal UI, plus amootdxno-token A-share loader and CCXT proxy-env support.
Fixes
--versionno longer drifts (#156) — derives from package metadata, falling back topyproject.toml; no hardcoded constant left to forget on release.- Robustness pass: pre-flight validation for LLM-generated signal engines (#149), graceful agent-loop exit at the iteration budget (#148),
flush + fsyncsession writes that skip corrupted JSONL on read (#147), and IME Enter handling in the Web composer (#146). - Session running-status indicator survives reconnect / reload / sidebar nav; cross-browser Full Report links (#150); configurable SSE idle timeout via
VIBE_TRADING_SSE_TIMEOUT(#157); cross-market correlation timestamp alignment (#158).
Contributors
Thanks to this cycle's contributors:
- @toanalien — session JSONL hardening (#147), graceful loop exit (#148), signal-engine pre-flight validation (#149), cross-browser Full Report links (#150)
- @ai7eam-dev — cross-market correlation alignment (#158), session running indicator + swarm retry (#159 → #160)
- @shadowinlife — remote MCP over SSE/HTTP (#125), worker external MCP tools (#142)
- @DoubleSky123 — configurable SSE idle timeout (#157)
- @ArthurXi — IME Enter handling (#146)
- @omcdecor-cyber — swarm DAG gating on failed upstream (#145)
- @Soli22de — strict alpha-bench random control (#143)
- @ruok808 — CCXT proxy-env support (#126)
- @faizack — remote Ollama base-URL normalization (#129)
- @fightZy — agent session history loading fix (#136)
- @lcwSeven — short universe names in the alpha list endpoint (#137)
- @Teerapat-Vatpitak — resolved .env-source logging (#124)
- @warren618 / Haozhe Wu — connector profiles, Robinhood Agentic Trading channel, Research Goal runtime, swarm reconcile + retry_run, CLI refactor, mootdx loader, release integration
Full Changelog: v0.1.8...v0.1.9
详细ChangeLogv0.1.8
2026年05月17日
🧬 v0.1.8 — Alpha Zoo v1 + research workflow polish
v0.1.8 is a major content release for Vibe-Trading. The headline is the Alpha Zoo: 452 pre-built quantitative alphas across four bundled libraries — qlib158, alpha101, gtja191, and academic — with a one-line CLI to bench any zoo on your universe, agent integration via two new tools, four new REST routes with SSE-streamed progress, and a browse/detail/bench Web UI at /alpha-zoo. The release also lands the long-running MCP client integration, a Trust Layer run card in the Web UI, the public wiki launch at vibetrading.wiki, the Hypothesis Registry MVP, and a substantial security + hardening pass driven by community PRs.
This release is available on PyPI, ClawHub, and GitHub Releases.
pip install -U vibe-trading-ai
# or
uv tool install --reinstall vibe-trading-aiHighlights
🧬 Alpha Zoo — 452 pre-built quant alphas across 4 zoos
Cross-sectional formulaic alphas with metadata, lookahead-banned at the operator layer, registry-validated, and reachable from CLI, agent, REST API, and Web UI:
- qlib158 — 154 alphas. Apache-2.0 port of Microsoft Qlib's
Alpha158feature handler, with the upstream commit SHA pinned in every adapted module's header and the upstream NOTICE bundled. - alpha101 — 101 alphas. Implementation of Kakushadze (2015) "101 Formulaic Alphas" (arXiv:1601.00991), written from the paper appendix. 19 industry-neutral alphas flag
requires_sector=Trueand skip cleanly on universes without sector tags. - gtja191 — 191 alphas. Implementation of Guotai Junan Securities' 2014 "191 Short-period Trading Alpha Factors" research report. Operator-mapping decisions (SMA / WMA / REGBETA / HIGHDAY interpretations) documented per alpha.
- academic — 6 factors. Fama-French 5 + Carhart momentum, shipped as honest price-based proxies (the canonical FF series need book-to-market / profitability / investment growth fundamentals we don't bundle). The nicknames carry a
[PRICE PROXY]prefix; Kenneth French's data library is referenced for users who need the canonical monthly returns.
Each alpha carries a __alpha_meta__ dict (formula LaTeX, theme, universe, columns_required, warmup, decay horizon, notes) validated by a pydantic extra="forbid" schema.
🖥️ One-line CLI
vibe-trading alpha list --zoo gtja191 --theme momentum --limit 10
vibe-trading alpha show gtja191_171
vibe-trading alpha bench --zoo gtja191 --universe csi300 --period 2018-2025 --top 20
vibe-trading alpha compare --all
vibe-trading alpha export-manifest --out wiki/alpha-library/manifest.jsonbench drives a Rich progress bar with live alpha-id + ETA banner, returns proper exit codes on failure, and silences scipy ConstantInputWarning noise. All five subcommands honour TTY hints and a --json mode for scripting.
🌐 Web UI at /alpha-zoo + 4 REST routes with SSE
Three views in the React Web UI: Browse (4 zoo cards, filter bar, paginated table), Detail (formula, metadata, source code), Bench (form → SSE-streamed progress → Alive/Reversed/Dead stat cards + Top-5-by-IR + Most-Reversed tables + by-theme bar chart). Auto-Vite route at /alpha-zoo, nav entry in the Layout.
GET /alpha/list?zoo=&theme=&universe=&limit=
GET /alpha/{alpha_id}
POST /alpha/bench (body: {zoo, universe, period, top}) → 202 + job_id
GET /alpha/bench/{job_id}/stream (SSE: progress / result / done / error)
Background bench jobs run via asyncio.to_thread with a 2-concurrent-job semaphore (429 on saturation), in-memory state with 1-hour TTL, 15-second heartbeat comment frames to keep proxies from closing idle streams, and sanitised error messages so unexpected exceptions don't leak server-side paths.
🤖 Agent integration
Two new auto-discovered tools (AlphaZooTool, AlphaBenchTool) plus a panel-style ZooSignalEngine.from_zoo(...) factory in the multi-factor skill that composes one or more alphas into a long-short signal compatible with the existing backtest engines. The legacy per-symbol example_signal_engine.py is preserved for backward compatibility.
🛡️ Safety floor
Quality gates that fire on every PR and vibe-trading alpha bench run:
- AST purity gate (
test_alpha_purity.py) — scans everyzoo/**/*.pymodule, allows onlypandas,numpy,scipy.*,src.factors.base,__future__,typing,math,dataclassesimports; bansos/sys/subprocess/socket/urllib/requests/httpx/pathlib/Path/open/eval/exec/compile/__import__plusbreakpoint/input/globals/locals/vars/__class__/__subclasses__/__mro__/__globals__/__builtins__, plus dunder-stringgetattraccess (including BinOp-concatenated dunders). - Lookahead sentinel test (
test_lookahead.py) — 300-row synthetic panel; corrupt rows past the probe; assert factor at probe unchanged within 1e-9. pytest-socketintegration — factors test suite runs network-disabled.- CI grep gates (
tools/ci_grep_gates.sh) — rejectsyaml.load(withoutsafe_load, the trademarked-name string in shipped artifacts, and any per-stock-code data leak inwiki/**/*.{json,csv,html}.
📡 MCP client integration (stdio v1)
The agent can now load tools from external MCP servers via ~/.vibe-trading/agent.json, opt-in per session via ALLOW_SESSION_MCP_SERVERS=1. Stdio transport only in v1; HTTP/SSE deferred. Tool-name collisions get a deterministic hash suffix; remote-tool failures normalise to error payloads instead of bubbling. Big thank-you to @shadowinlife (#83) for the end-to-end implementation and the security-conscious defaults.
🪪 Trust Layer run card in Web UI
The run detail page now renders run_card.json alongside metrics and artifacts, completing the UI half of the trust-layer work that landed earlier.
🧠 Hypothesis Registry (backend MVP)
create_hypothesis / update_hypothesis / link_backtest / search_hypotheses give research hypotheses a durable lifecycle, links to run cards, and invalidation notes. UI integration to follow.
🔬 Memory, swarm, and tooling hardening
A focused PR cycle from @Teerapat-Vatpitak strengthened the lower-level surfaces this release leans on:
PersistentMemory.add()hardened against length overflow, empty / whitespace-only names, and C0/C1 control bytes (#112)- Swarm error surfacing + output contract, Windows-safe store, path redaction (#119)
- MCP unresolved-symbol, finite options validation, row cap (#120)
- Bounded CCXT + OKX fetch with timeout / retry / budget (#121)
read_urlJina dependency disclosure + cache opt-out (#122)- API path-ID validation for run/session routes (#80, via @SJoon99)
Plus @hp083625 taught memory recall to treat underscores as token boundaries (#87) so mcp_wiring_test matches "mcp wiring", @voidborne-d kept the Vite dev proxy honoring VITE_API_URL and fixed CJK slug preservation (#82, #95), and @ykykj added the CLI startup preflight (#96).
🌐 Public wiki at vibetrading.wiki
The wiki ships its own Alpha Library renderer (wiki/scripts/build_alpha_library.py) that reads the manifest JSON and emits 452 per-alpha pages + 4 per-zoo overview pages, each with script-src 'none' CSP. The research-lab gains its first long-form post: "Which of the 191 GTJA alphas still work in 2026?" — aggregate IC, theme survival rates, and the top alphas that survive eight years of out-of-sample data on CSI 300 (2018-2025), with a survivorship-bias caveat.
Install / upgrade
| Channel | Command |
|---|---|
| PyPI | pip install -U vibe-trading-ai |
| uv tool | uv tool install --reinstall vibe-trading-ai |
| ClawHub (Claude Desktop / OpenClaw / MCP clients) | clawhub install vibe-trading or update the installed skill |
| Docker | docker compose pull && docker compose up -d |
Remote API/Web deployments should set API_AUTH_KEY and explicit trusted CORS origins. Local CLI and localhost Web UI workflows remain low-friction.
By the numbers
- 66 non-merge commits since
v0.1.6's successor branch (sincev0.1.7) - 452 pre-built quant alphas across 4 zoos
- 75 bundled finance skills (+ the
alpha-zooskill folder) - 31 default agent tools (was 29; +
alpha_zoo_tool, +alpha_bench_tool) - 29 swarm presets
- 6 data sources with auto-fallback: tushare, yfinance, okx, akshare, ccxt, futu
- 7 backtest engines + composite cross-market engine + options portfolio
- 22 MCP tools (alpha tools to be MCP-wrapped in
0.1.9) - 969 tests passing + 1 documented skip (
alpha101_096NaN-cascade on synthetic panel)
🙌 Credits
This release stands on the shoulders of giants. Heavy emphasis because the Alpha Zoo borrows mathematical content from decades of public research.
Code contributors this cycle
- @warren618 / Haozhe Wu — Alpha Zoo framework + 4 zoos, CLI, Web UI, REST + SSE API, bench runner, safety floor, wiki + research-lab post, multi-language READMEs, integration, release.
- @shadowinlife — MCP client integration (stdio, v1) (#83)
- @Teerapat-Vatpitak —
PersistentMemory.add()hardening (#112), swarm error surfacing + Windows-safe store + redaction (#119), MCP unresolved-symbol + options validation (#120), bounded CCXT + OKX fetch (#121),read_urlJina disclosure (#122) - @SJoon99 — API path-ID validation hardening (#80)
- @hp083625 — memory recall underscore tokenization (#87)
- @voidborne-d — CJK slug preservation in memory (#95), Vite dev proxy
VITE_API_URL(#82) - @ykykj — CLI startup preflight (#96)
- @mrbob-git — Tushare statement-field filtering (#76, #77)
- @Teerapat-Vatpitak (also) —
extend tokenizer + slug regex to Thai/Arabic/Hebrew/Cyrillic(#104)
Open-source software cited / bundled
- Microsoft Qlib team (microsoft/qlib) — the
qlib158zoo is an Apache-2.0 port of theAlpha158feature handler. Commit-pinned in every adapted module's header; upstream NOTICE bundled atagent/src/factors/zoo/qlib158/NOTICE. - Menooker / KunQuant (Menooker/KunQuant) — Apache-2.0 reference implementations of the 101 formulaic alphas, used only for numerical cross-validation on a sample of alphas at the ±1% level. No code was copied; we wrote from the paper appendix and compared outputs.
- Kenneth R. French Data Library (mba.tuck.dartmouth.edu/.../ken.french/data_library.html) — the canonical Fama-French monthly returns; users who need the real series should pull from there. Our
academiczoo ships honest price-based proxies, not the real series.
Academic / research sources cited
- Zura Kakushadze (2015) — "101 Formulaic Alphas", arXiv:1601.00991. Implemented in the
alpha101zoo. Display name throughout the codebase is "Kakushadze 101 Formulaic Alphas"; the trademarked alternative is intentionally absent (CI gate enforced). - 国泰君安证券 (Guotai Junan Securities), 2014 — "191 个短周期交易型 alpha 因子" research report. Implemented in the
gtja191zoo. - William F. Sharpe (1964) — "Capital Asset Prices: A Theory of Market Equilibrium under Conditions of Risk". Market factor baseline.
- Eugene F. Fama & Kenneth R. French (1993) — "Common Risk Factors in the Returns on Stocks and Bonds". SMB, HML baselines.
- Eugene F. Fama & Kenneth R. French (2015) — "A Five-Factor Asset Pricing Model". RMW, CMA baselines.
- Mark M. Carhart (1997) — "On Persistence in Mutual Fund Performance". Carhart momentum baseline.
- Kewei Hou, Chen Xue, Lu Zhang (2015) — "Digesting Anomalies: An Investment Approach". Q-factor framing.
The bundled formulas are reproduced as mathematical content (formulas are not subject to copyright); paper prose, tables, and figures are not reproduced in this repository. Each zoo has its own LICENSE.md documenting this stance.
Lab + community
- HKUDS (HKU Data Intelligence Lab) — research direction, infrastructure, and the broader Vibe-Trading platform this builds on.
- Everyone who filed issues, reviewed PRs, and stress-tested the framework in the pre-release cycle. Community PRs from the v0.1.7 cycle whose hardening still underpins the safer defaults this release ships against: lemi9090 (S2W) for the coordinated security validation.
Caveats / Known limitations
btc-usdtuniverse is single-asset. Cross-sectional IC needs ≥2 instruments, soalpha101_btcreturns alive/reversed/dead = 0/0/0 by construction. A curatedcrypto-majorsmulti-symbol basket is planned for 0.2.- SP500 universe uses today's constituent list as a proxy for point-in-time index membership, introducing survivorship bias. Documented in
bench_summary.json["meta"]and in the wiki blog caveat section. Point-in-time constituent source is a 0.2 follow-up. - MCP server does not yet expose
alpha_zoo/alpha_benchtools. The Python agent layer, REST API, CLI, and Web UI all expose them; MCP wrap-up planned for 0.1.9. - 19 industry-neutral alpha101 alphas (#48, 56, 58, 59, 63, 67, 69, 70, 76, 79, 80, 82, 87, 89, 90, 91, 93, 97, 100) need a sector tag. Tushare provides this; yfinance does not, so SP500 benches skip these 19. Cross-zoo SP500 follow-up will plug a sector data source.
docs/is gitignored, internal planning only. Do not push contents ofdocs/to public branches.
Changelog
Full changes: v0.1.7...v0.1.8
Notable commits since v0.1.7 (66 non-merge)
5237ce3chore: move tweet draft out of public wiki — Haozhe Wu78bc1e5chore(0.1.8): version, CHANGELOG, packaging, News across 5 READMEs, SKILL.md — Haozhe Wu7912b77feat(wiki): Alpha Library auto-render + Alpha 191 in 2026 blog — Haozhe Wu9854035feat(alpha-zoo): bench runner + CLI + Web UI + 4 REST routes — Haozhe Wu81e2a53feat(factors): port 452 alphas across 4 zoos — Haozhe Wu7d678aafeat(factors): Alpha Zoo framework — registry, operators, safety gates — Haozhe Wu8d3ae19refactor(loaders): extract bounded retry/budget pattern into base.py — Haozhe Wu0a254c0fix(swarm): surface errors, output contract, Windows-safe store, redact paths (#119) — Teerapat-Vatpitakcdf343dfix(mcp): unresolved symbols, finite options validation, row cap (#120) — Teerapat-Vatpitake155087fix(loaders): bound ccxt + okx fetch (timeout, retry, budget) (#121) — Teerapat-Vatpitak199f77afeat: add security scanner and hypothesis registry — Haozhe Wu1b547d2fix(tools): disclose read_url Jina dependency + cache opt-out (#122) — Teerapat-Vatpitakd20b590fix(loop): populate reason field on AgentLoop cancelled / max-iter exits (#116) — Haozhe Wuf1c7a50feat(swarm): universal data-citation discipline in worker prompt (#115) — Haozhe Wu2c70ef5feat(agent): add MCP client integration (stdio, v1) (#83) — shadowinlife14b160efeat(run-card): surface trust layer card in web UI — Haozhe Wu379fb0cfeat(memory): harden PersistentMemory.add() for control bytes, length, empty names (#112) — Teerapat-Vatpitak4e72ca1ci: deploy wiki to Cloudflare Pages — Haozhe Wuf85f3b8fix(memory): extend tokenizer + slug regex to Thai/Arabic/Hebrew/Cyrillic (#104) — Teerapat-Vatpitak892cd16feat(cli): add memory introspection commands — Haozhe Wu- ... and 46 more — see the compare link above for the full list.
Validation before publishing
- Tests:
969 passed, 1 skipped(pytest agent/tests/factors/);pytest-socketenabled. - CI grep gates (
tools/ci_grep_gates.sh): all 3 pass — noyaml.load(misuse, no trademarked-name leak, no per-stock-code data inwiki/**. - AST purity gate clean across all 452 alpha modules.
- Lookahead sentinel test clean on all 452 alphas (1 documented skip for NaN-cascade on synthetic panel; not a real lookahead violation).
- Wheel sanity:
dist/vibe_trading_ai-0.1.8-py3-none-any.whl(1.7 MB) contains 452 alpha.pyfiles, 4 per-zooLICENSE.md, the upstream QlibNOTICE, all framework modules (base,registry,bench_runner,factor_analysis_core,cli_handlers), both new tools, thealpha_routesAPI module, and all CLI / API entry points. No critical files missing. - Frontend:
npx tsc --noEmitclean. - Multi-language READMEs: English / 中文 / 日本語 / 한국어 / العربية all updated with consistent 0.1.8 numbers, route table, and Alpha Zoo capability section.
- PyPI
vibe-trading-ai==0.1.8published. - ClawHub
vibe-trading@0.1.8published (k9709z89sf9j7rzyhz3c96r4p986xf68).
v0.1.7
2026年05月06日
🛡️ v0.1.7 — Security boundary hardening + research workflow polish
v0.1.7 is a security-focused maintenance release for Vibe-Trading. It strengthens the default API, file, URL, generated-code, shell-tool, Docker, CLI/Web, and MCP/ClawHub boundaries while preserving the low-friction localhost workflow for normal CLI and Web UI users.
This release is available on PyPI, ClawHub, and GitHub Releases.
pip install -U vibe-trading-ai
# or
uv tool install --reinstall vibe-trading-aiHighlights
🛡️ Security boundary hardening
The main goal of this release is to make Vibe-Trading safer by default without turning local research workflows into configuration work.
- API authentication and read protection: non-local API use is now much stricter by default, and sensitive run/session/swarm read paths are protected consistently.
- Upload and local-file boundaries: upload handling and local file-reading tools now use tighter path/type boundaries, with regression tests covering the previously risky paths.
- Document and URL readers: local document reads and outbound URL reads now enforce stronger safety checks.
- Shell-capable tools: shell execution tools are gated by entry point / explicit opt-in, reducing accidental exposure in Web/API/Docker/MCP deployments.
- Generated strategy loading: generated backtest and Shadow Account strategy code is validated before execution/import.
- Docker baseline: the runtime image now runs as a non-root
vibeuser, and Docker Compose defaults are localhost-first. - Durability: the hardening is backed by regression tests across auth, upload, path safety, document reading, web reading, tool registry, backtest loading, and Shadow Account codegen.
Thanks to lemi9090 (S2W) for the coordinated security report and fast validation of the fix coverage before release.
⚙️ Web UI Settings
New Settings surfaces make provider/model, base URL, reasoning effort, and data-source credential state manageable from the Web UI, backed by local/auth-protected settings APIs and data-driven provider metadata. (#57)
🔥 Correlation heatmap
The new correlation dashboard/API computes rolling return correlations and renders an ECharts heatmap for portfolio and symbol analysis. Follow-up fixes aligned the frontend proxy and PR review blockers. (#64, #66)
🔐 OpenAI Codex OAuth provider
Vibe-Trading now supports the OpenAI Codex provider via ChatGPT OAuth login (vibe-trading provider login openai-codex), with Settings metadata and provider adapter tests. (#65)
🧭 A-share pre-ST filter skill
New ashare-pre-st-filter skill for A-share ST/*ST risk screening, with follow-up relevance filtering so securities-account list mentions do not inflate E2 penalty counts. (#63)
🖥️ Interactive CLI UX
Interactive mode now has a live bottom status bar for provider/model, session duration, last-run latency, and cumulative tool-call stats, plus prompt history navigation and cursor editing through prompt_toolkit. (#69)
🧩 Swarm preset inspection
vibe-trading --swarm-inspect <preset> and related plumbing make it easier to inspect swarm presets before running multi-agent workflows. (#73)
📈 Dividend analysis skill
Added the dividend-analysis bundled skill for income stocks, payout sustainability, dividend growth, shareholder yield, ex-dividend mechanics, and yield-trap checks.
🧰 Local dev workflow
Added a one-command local dev workflow through scripts/dev up|open|logs|stop, plus Codespaces support and frontend/backend dev ergonomics. This is intended to make clean local testing and demos much easier.
0.1.7 maintenance
- Release metadata: PyPI package, CLI banner, Web UI footer, Docker OCI labels, and ClawHub manifest are synced to
0.1.7. - CLI:
vibe-trading --versionnow reports the installed version. - ClawHub: manifest now reflects 74 bundled finance skills and the current MCP command surface.
- Frontend build deps: raised
vite,postcss, and related lockfile floors to audited patched versions. - Docs: README news was refreshed across all language variants before this release, while older entries remain collapsed.
- Tests: focused security, CLI, registry, packaging, and frontend build checks passed before publishing.
Install / upgrade
| Channel | Command |
|---|---|
| PyPI | pip install -U vibe-trading-ai |
| uv tool | uv tool install --reinstall vibe-trading-ai |
| ClawHub (Claude Desktop / OpenClaw / MCP clients) | clawhub install vibe-trading or update the installed skill |
| Docker | docker compose pull && docker compose up -d |
Remote API/Web deployments should set API_AUTH_KEY and explicit trusted CORS origins. Local CLI and localhost Web UI workflows remain low-friction.
By the numbers
- 26 commits since
v0.1.6 - 8 merged PRs
- 25 default agent tools, with 22 exposed through MCP
- 74 bundled finance skills (+ user-created skills)
- 29 swarm presets
- 6 data sources with auto-fallback: tushare, yfinance, okx, akshare, ccxt, futu
- 7 backtest engines + options portfolio
- 14 LLM providers
🙌 Contributors
Thanks to everyone who contributed code, docs, reports, review, and validation in this cycle:
- @GTC2080 / TaoMu — Web UI Settings and provider/data-source configuration APIs (#57)
- @BigNounce90 — validation CLI hardening for backtest
run_dirinput (#60) - @shadowinlife — A-share pre-ST filter skill (#63)
- @MB-Ndhlovu — correlation heatmap dashboard and review fixes (#64, #66)
- @ykykj — OpenAI Codex OAuth provider option (#65)
- @RuifengFu — interactive CLI live status bar and prompt editing (#69)
- @SiMinus — swarm preset inspection command (#73)
- @warren618 / Haozhe Wu — security hardening, release integration, docs, Docker, packaging, and local dev workflow
- lemi9090 (S2W) — coordinated security research, validation, and disclosure support
Changelog
Full changes: v0.1.6...v0.1.7
Merged PRs since v0.1.6 (8)
- #73 feat: add swarm preset inspection command — @SiMinus
- #69 feat(cli): add live streaming status indicator and arrow-key navigation to interactive mode — @RuifengFu
- #66 Feat/correlation heatmap — @MB-Ndhlovu
- #65 feat: add OpenAI OAuth provider option — @ykykj
- #64 Feat/correlation heatmap — @MB-Ndhlovu
- #63 feat(skill): add ashare-pre-st-filter — A股 ST/*ST 风险预测框架 — @shadowinlife
- #60 fix: validate backtest run_dir CLI input — @BigNounce90
- #57 feat: add model and data source settings UI — @GTC2080
All commits since v0.1.6 (26)
488abd9chore(release): prepare 0.1.7 — Haozhe Wud5558ebchore: add local dev workflow — Haozhe Wudfc5c14feat: add swarm preset inspection command (#73) — SiMinuse07cdc9Harden supplemental security boundaries — Haozhe Wu2cf19b6docs: collapse older readme news — Haozhe Wu292b673docs: refresh readme news for cli ux — Haozhe Wubb67dc7fix(tests): align CI path expectations — Haozhe Wu64da282Merge pull request #69 from RuifengFu/feat/cli-ux-improvements — Haozhe Wubf084b3Harden API and tool security defaults — Haozhe Wu3d171dcfeat(cli): add live status bar and arrow key navigation — RuifengFuf0c3eb6docs: refresh readme news and roadmap — Haozhe Wu9501baffeat(skills): add dividend analysis skill — Haozhe Wu7452610fix(frontend): proxy correlation endpoint — Haozhe Wueb5eda8Merge pull request #66 from MB-Ndhlovu/feat/correlation-heatmap — Haozhe Wub95bb41docs: sync multilingual news updates — Haozhe Wu0b95d68feat: add correlation heatmap dashboard (#64) — MB-Ndhlovudea99ecfeat: add OpenAI Codex OAuth provider option (#65) — ykj@hku3c9577ffix correlation PR review blockers — Malibongwe Ndhlovub22ca78fix(skill): harden ashare penalty relevance filtering — Haozhe Wu968b649feat(skill): add ashare pre-ST filter — shadowinlifebbbef46feat: cross-asset correlation heatmap dashboard — Malibongwe Ndhlovu8520bfefix(cli): remove broken rich.box import — Malibongwe Ndhlovu7259b42fix(cli): remove broken rich.box import — Malibongwe Ndhlovu3ccfa10docs: sync README updates for settings UI and validation CLI — Haozhe Wu282c881fix: validate backtest run_dir CLI input (#60) — BigNouncea015452feat: add model and data source settings UI (#57) — TaoMu
Validation before publishing
- PyPI upload completed and
vibe-trading-ai==0.1.7was installed from PyPI in a clean venv. - ClawHub
vibe-trading@0.1.7is published and marked latest. - Docker image label and runtime user were verified (
0.1.7, non-rootvibe). - Focused security and CLI/registry tests passed.
- Frontend production build passed.
npm audit --audit-level=moderatereturned 0 vulnerabilities.twine checkpassed for both wheel and sdist.
v0.1.6
2026年04月28日
🚀 v0.1.6 — Critical packaging fix + community-driven features
If you installed vibe-trading-ai==0.1.5 via pip install or uv tool install, vibe-trading --swarm-presets returned No presets available and run_swarm was unusable. This release fixes that — please upgrade.
pip install -U vibe-trading-ai
# or
uv tool install --reinstall vibe-trading-aiHighlights
🐛 Swarm presets packaging fix (#55)
Preset YAMLs were declared via [tool.setuptools.data-files] in pyproject.toml, which lands them under <install-prefix>/.data/data/config/swarm/ rather than at <site-packages>/config/swarm/ where the loader looked. Editable installs (pip install -e .) happened to work because the source-tree path resolved correctly, so the bug only surfaced in published wheels — every pip install vibe-trading-ai==0.1.5 was broken on this code path.
Resolution: 29 preset YAMLs moved into agent/src/swarm/presets/ so they ship as ordinary package-data. Loader now resolves via Path(__file__).parent / "presets" — identical under editable installs and built wheels. Pinned by a 6-test packaging regression suite so this can't silently regress again.
Bug reported by @qxj — screenshots made it a 5-minute root cause hunt.
📊 Benchmark comparison panel
Backtest output now ships a benchmark comparison panel (ticker / benchmark return / excess return / information ratio) with yfinance-backed resolution for SPY, CSI 300, and other major indices. Contributed by @MB-Ndhlovu (#48).
🛡️ /upload streaming + size limits
The /upload endpoint streams the request body in 1 MB chunks and aborts past MAX_UPLOAD_SIZE with partial-file cleanup. The 50 MB cap is now actually enforced under malicious / oversized clients. Pinned by 4 regression tests. Contributed by @genoshide (#53).
📈 Futu data loader (HK + A-share)
6th data source — Futu OpenAPI integration for Hong Kong and A-share equities, with broker-grade real-time quotes. Contributed by @hamza-mobeen (#47).
🔧 vnpy CtaTemplate export skill
72nd skill — vnpy-export generates ready-to-run CtaTemplate strategy code for the vnpy backtest framework. Contributed by @hamza-mobeen (#46).
0.1.6 maintenance
- Loader: AKShare loader correctly routes ETFs (
510300.SH) and forex (USDCNH) to the right endpoints with hardened registry fallback - Workspace: Relative
run_dirnormalized to active run dir — fixes empty/relative paths in tool calls (#43, @Mothilal-M) - Security: Path containment enforced in
safe_path+ sandboxing for journal / shadow account tools - Build:
MANIFEST.inships.env.example/ tests / Docker files in sdist - Frontend: Route-level lazy loading shrinks initial bundle 688 KB → 262 KB
- Docs: README usage examples (#45, @hamza-mobeen)
- SKILL manifest: synced to 22 MCP tools / 72 skills / 6 data sources / 29 swarm presets
Install / upgrade
| Channel | Command |
|---|---|
| PyPI | pip install -U vibe-trading-ai |
| uv tool | uv tool install --reinstall vibe-trading-ai |
| ClawHub (Claude Desktop / OpenClaw) | clawhub install vibe-trading |
| Docker | docker compose pull && docker compose up -d |
By the numbers
- 27 agent tools (22 exposed via MCP)
- 72 bundled skills (+ user-created via full CRUD)
- 6 data sources with auto-fallback: tushare, yfinance, okx, akshare, ccxt, futu (new)
- 29 swarm presets, 7 backtest engines + options portfolio
- 13 LLM providers
🙌 New contributors
Huge thanks to everyone who opened a PR in this cycle — all 4 are first-time contributions to Vibe-Trading:
- @hamza-mobeen — Futu data loader (#47), vnpy CtaTemplate export skill (#46), README usage examples (#45) — three first-time PRs in one cycle 👏
- @MB-Ndhlovu — backtest benchmark comparison panel (#48)
- @genoshide —
/uploadstreaming + size limits (#53) - @Mothilal-M —
_normalize_tool_run_dirworkspace fix (#43)
Issue reporters who kept the surface area honest: thanks to @qxj for the high-quality #55 reproduction and to @myrassel for the OAuth feature suggestion (#49) we are tracking for a future release.
Changelog
Full changes: v0.1.5...v0.1.6
Merged PRs since v0.1.5 (6)
- #53 fix: stream uploads while enforcing API size limit — @genoshide
- #48 feat(cli): add benchmark comparison to backtest output — @MB-Ndhlovu
- #47 feat: add Futu data loader for HK and A-share equities — @hamza-mobeen
- #46 feat: add vnpy export skill for CtaTemplate strategies — @hamza-mobeen
- #45 docs: add usage examples to README — @hamza-mobeen
- #43 feat(loop): add _normalize_tool_run_dir function and corresponding tests — @Mothilal-M