release: 0.1.15 — data that says what it is
Rolls up 551 commits / 162 merged pull requests since 0.1.14, from 35 contributors. Served price frames now stamp the adjustment caliber they carry, and a source whose caliber was never measured against a live payload reports `unknown` rather than guessing one. The Alpha Zoo's NaN contract moved out of the individual alphas and into the registry: an alpha branching on an `np.where` comparison never sees a NaN, so blanking every declared input on one bar left 84 of 462 alphas returning a number anyway, each consumed as a real signal because `dropna()` is what keeps a gap out of an IC. The same sweep afterwards finds none. The futures loader chain was the last instance of that class and closes in this release. New markets and surfaces: UK equities (LSE .L/.IL, SDRT modelled as a purchase-side-only duty), Zerodha Kite Connect as the fourteenth broker (paper plus read-only, since Kite exposes no runtime live discriminator), a read-only multi-broker portfolio across Web / REST / CLI / agent tool, fifteen Quant Library additions, Brazilian Portuguese as the eighth locale, read-only Nobitex and Wallex, and an offline evals harness that emits NOT_EVALUABLE rather than passing when instrumentation is absent. `test_release_version_consistency.py` caught a fourteenth declaration site the eleven it was written for did not cover: the `app.version` mock in `frontend/src/components/layout/__tests__/Layout.test.tsx`. The comment in `test_cli_update.py` that named the current version is de-versioned here — a version in a comment has no guard and goes stale at the next bump. Reader-facing counts were re-measured rather than incremented: 74 MCP tools, 107 registry tools, 10 engines, 90 skills, 462 alphas, 27 data sources, 30 swarm presets, 14 broker connectors. None had drifted.
This commit is contained in:
1 parent
703fb5018b
commit
cc54832cb5
22 files changed
+511
-28
No files matched your search
+475
@@ -5,6 +5,481 @@ This project adheres to [Semantic Versioning](https://semver.org/).
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
## [0.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 `.L` and `.IL`
|
||||
symbols end to end: market data, Yahoo-backed financial statements and
|
||||
indicators, trade-journal inference into `uk_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_order` and `cancel_order` hard-refuse any non-paper config at the
|
||||
first line, and no `*-live-trade` profile 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 `/portfolio` page, REST
|
||||
under `portfolio_routes.py`, the `portfolio_summary` agent 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** (status `error`, `last_success_at`,
|
||||
`complete=false`), never a carried-forward cache, so a partial snapshot
|
||||
cannot read as a smaller portfolio; every `remote_mcp` read passes
|
||||
`interactive_oauth=False`, so aggregation can never pop an auth prompt;
|
||||
and `analysis_context()` carries `risk_xray_args` so `portfolio_risk_xray`
|
||||
is *fed* rather than reimplemented. Eligibility is one rule —
|
||||
`is_portfolio_connection_profile` requires 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, reporting `unmatched_weight` rather 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 a `SKILL.md` code block.
|
||||
- **Brazilian Portuguese locale** (#1327, thanks @nandofmike) — the eighth
|
||||
shipped language, landing with full key parity. The parity suite globs
|
||||
`locales/*.json` instead 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_SOURCES` and are barred from the crypto
|
||||
fallback chain on purpose: they are the only Toman-quoted sources and
|
||||
declare `markets={"crypto"}` purely to be reachable, so degrading an
|
||||
unavailable `BTCIRT` request 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_EVALUABLE` rather 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 the `cache_control` request parameter.
|
||||
- **Per-market data-source priority** (#1231, thanks @sambazhu) — a Settings
|
||||
card and `MARKET_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, because `runner.py` and `market_data.py` import
|
||||
`FALLBACK_CHAINS` by 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 --resume` in #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_rejected` hook 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.py` states the contract in its own
|
||||
header: NaN is preserved through warm-up and missing data, no silent
|
||||
`fillna(0)`. An alpha that branches with `np.where` on a **comparison**
|
||||
violates it without looking like it does, because a NaN comparison is
|
||||
`False` and 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 since `dropna()` is the mechanism that keeps a gap
|
||||
out of an IC, each fabricated ±1 was consumed as a real signal.
|
||||
`Registry.compute` now 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 declared `min_warmup_bars`** (`gtja191_154` declares 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 defaults `pct_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
|
||||
`unknown` on 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; and `349bf202` on 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 the `a_share` default. 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 named `tushare` and `akshare`, and **neither implemented a
|
||||
futures endpoint**: `tushare._fetch_daily_frame` branches on ETF / index /
|
||||
HK and sends everything else to `daily()`, the A-share equity endpoint,
|
||||
while `akshare._fetch_one` ends 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
|
||||
reaches `local` rather than being priced as an equity. Trimming tushare's
|
||||
`markets` set alone would not have worked: `resolve_loader` walks the chain
|
||||
and never consults `markets`, 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 all `raises` assertions, 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 no `limit_price` went out as
|
||||
an MIT with no `TriggerRate` and rested untriggered while reading as
|
||||
accepted; futu K-lines inherited an undeclared adjustment caliber; and bare
|
||||
`BTCUSDT` was 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
|
||||
honours `bars_per_year=None` instead 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, so `close/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\b` does not match
|
||||
"closed", so a fabricated `The 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=F` and `XAUUSD` had 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 after `NO_PROGRESS_LIMIT` iterations with a
|
||||
visible recovery answer and a `failed` terminal 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.temperature` rather than only the original position; stream
|
||||
retry delays escalate and honour `Retry-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
|
||||
`streamingSessionId` is 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 `/api` so 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.json` at ≥0.25s intervals with an atomic `os.replace`,
|
||||
and every pending or running attempt on disk is reconciled at service
|
||||
construction into an explicit `interrupted` transcript entry. The reply is
|
||||
committed before `attempt.json` so 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_id` default to the current goal;
|
||||
`beginTime`/`endTime` are forwarded through `get_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_state` handling.
|
||||
- **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_at` ties 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 — Clayton `0.0`, Gumbel `1.0`, Frank `inf` — 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 to `nan` from |θ| ≈ 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 in `read_file`, the skill-name prefix is dropped so links resolve
|
||||
on GitHub, and the `historical_var` quantile formula in the risk-analysis
|
||||
skill is corrected. Verification note for the first two: the agent reads
|
||||
through `ReadFileTool` rooted at `src/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 `futures` fallback chain is now `["akshare", "local"]`.
|
||||
`resolve_loader` walks `FALLBACK_CHAINS` and never consults a loader's
|
||||
`markets` set — the only `.markets` read is the explicit-source fallback —
|
||||
so trimming that set alone would have left `tushare` first in line,
|
||||
constructed and available on any `TUSHARE_TOKEN`, returning empty frames
|
||||
before `akshare` was ever asked.
|
||||
- `tushare` no longer declares the `futures` market. 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
|
||||
`futures` rather than falling to the `a_share` default. The rule is
|
||||
generated from the product whitelist rather than from a width heuristic,
|
||||
so an ordinary ticker ending in `0` keeps its own market.
|
||||
- `test_release_version_consistency.py` caught a **fourteenth** published
|
||||
version-declaration site that the eleven it was written for did not cover:
|
||||
the `app.version` mock in
|
||||
`frontend/src/components/layout/__tests__/Layout.test.tsx`. The version
|
||||
named in a `test_cli_update.py` comment is de-versioned here — a version
|
||||
string in a comment has no guard 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.
|
||||
|
||||
## [0.1.14] — 2026-08-20
|
||||
|
||||
Rolls up 272 commits / 74 merged pull requests since 0.1.13.
|
||||
|
||||
+1
-1
@@ -61,7 +61,7 @@ FROM python:3.11-slim@sha256:e031123e3d85762b141ad1cbc56452ba69c6e722ebf2f042cc0
|
||||
|
||||
LABEL org.opencontainers.image.title="Vibe-Trading" \
|
||||
org.opencontainers.image.description="Natural-language finance research AI agent with backtesting" \
|
||||
org.opencontainers.image.version="0.1.14" \
|
||||
org.opencontainers.image.version="0.1.15" \
|
||||
org.opencontainers.image.source="https://github.com/HKUDS/Vibe-Trading" \
|
||||
org.opencontainers.image.licenses="MIT"
|
||||
|
||||
|
||||
@@ -52,15 +52,16 @@
|
||||
|
||||
> ⚠️ **Security warning:** The X account `VibeTrading_HKU`, Virtuals project `101845`, and token contract `0x640BDBF77b6447E8b7DB7894cED84BD1c40571f4` are not official Vibe-Trading assets. We have never launched or endorsed any token or memecoin. Do not buy, connect a wallet, or sign anything. [Details](SECURITY.md#official-channels--impersonation).
|
||||
|
||||
- **2026-09-09** 🚀 **v0.1.15 released** ([Release notes](https://github.com/HKUDS/Vibe-Trading/releases/tag/v0.1.15), `pip install -U vibe-trading-ai`): 551 commits and 162 merged pull requests since 0.1.14, from 35 contributors. **The theme of this cycle is data that says what it is** — and three of the biggest fixes turned out to be the same bug wearing different clothes: a default that quietly substitutes a plausible value for a missing one, which is indistinguishable downstream from a real observation. The Alpha Zoo's NaN contract moved out of the individual alphas and into the registry: an alpha that branches on an `np.where` comparison never sees a NaN — the comparison is `False` — so blanking every declared input on one bar left **84 of 462 alphas returning a number anyway**, each consumed as a real signal because `dropna()` is what keeps a gap out of an IC. The registry now masks output wherever a declared dependency is missing on that bar, and the same sweep afterwards finds none ([#1377](https://github.com/HKUDS/Vibe-Trading/pull/1377), closes [#1376](https://github.com/HKUDS/Vibe-Trading/issues/1376)). The warmup half stays open and stated rather than quietly carried: **52 alphas still emit a value inside their own declared `min_warmup_bars`**, and a registry-level warmup mask would also blank rows for alphas that merely over-declare, so that half needs a direction call rather than 52 PRs. Same class, second instance: pandas still defaults `pct_change()` to forward-filling, so a missing close becomes a **0.0% return that never happened**; four PRs fixed one call site each, and an exhaustive sweep found **24 sites across 10 files** — two of them inside the very files those PRs were editing. Third instance: the `futures` loader chain named `tushare` and `akshare`, and **neither implemented a futures endpoint at all**, so every contract fell through to the A-share equity endpoint. AKShare now serves Chinese contracts off the keyless Sina daily endpoints — dated and main-continuous, verified live across SHFE, CFFEX, GFEX and ZCE — while a global contract returns empty and reaches `local` instead of being priced as an equity ([#1395](https://github.com/HKUDS/Vibe-Trading/issues/1395)). Prices themselves now carry the adjustment caliber they were served under, and a source whose caliber was never measured against a live payload reports `unknown` rather than guessing one ([#1317](https://github.com/HKUDS/Vibe-Trading/pull/1317)). **Live trading fails closed** in five more places: a broker position read returning an API error, error envelopes arriving mid halt-sweep, the flatten latch across runner restarts, unresolved Alpaca submissions recovered by exact client ID across a restart, and buy-limit orders sized at the worse of quote and limit on both transports. **In the backtest**: options signals fill on the next bar rather than the date they were computed from, short option legs hold margin and gate opens on buying power, perpetual funding settles by bar span on 8h+ intervals, an over-committed rebalance basket scales instead of aborting, and a halted position marks at the last traded close instead of entry cost. **In the agent loop**: a session that had already 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; results reconcile by exact call identity now, and the no-progress budget counts observations rather than activity. **New this cycle:** UK equities (LSE `.L`/`.IL`, with SDRT modelled as a purchase-side-only duty, because charging both sides overstated every round trip by half), **Zerodha Kite Connect** as the fourteenth broker (capped at paper plus read-only, since Kite exposes no runtime live discriminator), a **read-only multi-broker portfolio** across Web, REST, CLI and agent tool where a source that fails to refresh is an error excluded from the totals rather than a stale cache, **fifteen Quant Library additions** (Heston, Hierarchical Risk Parity, copulas, VPIN/Roll/Amihud/Kyle microstructure, barrier options with finite-difference Greeks, ISDA CDS, Key Rate Duration, Vasicek, factor IC, Ornstein-Uhlenbeck, Ulcer/Pain, event-study tests, group-purged CV), **Brazilian Portuguese** as the eighth locale, read-only **Nobitex and Wallex**, calendar-triggered partial rebalancing, swarm replay and retry, and an **offline evals harness** that emits `NOT_EVALUABLE` rather than passing when the instrumentation it needs is absent. Thanks to all 35 contributors of this cycle!
|
||||
|
||||
- **2026-09-09** 🛢️ **A US crude contract settled in yuan, and a strategy template that invented a 0% return from a missing price**: `CL2412.NYMEX` matched no symbol pattern — the bare dated form (`CL2412`) matched and the venue form (`ES.CME`) matched, but the way a contract is actually written matched neither — so it fell to the A-share default and was run under T+1 with no shorting and settled in CNY. Tushare's own exchange spellings had the mirror-image problem on the China side ([#1396](https://github.com/HKUDS/Vibe-Trading/pull/1396), closes [#1394](https://github.com/HKUDS/Vibe-Trading/issues/1394)); both halves now classify. Separately, pandas still defaults `pct_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. Two PRs fixed one call site each ([#1397](https://github.com/HKUDS/Vibe-Trading/pull/1397), [#1398](https://github.com/HKUDS/Vibe-Trading/pull/1398)); sweeping the skills exhaustively found **24 sites in 10 files**, two of them in the very files those PRs were editing, and a repo-wide guard now keeps the class closed. China-futures runs also state which products they 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" (closes [#1393](https://github.com/HKUDS/Vibe-Trading/issues/1393)). Also merged: future-label purging in the ML walk-forward example ([#1392](https://github.com/HKUDS/Vibe-Trading/pull/1392)), assets with no factor observations excluded from TopN ([#1399](https://github.com/HKUDS/Vibe-Trading/pull/1399)), and sentiment-factor orthogonalization that no longer regresses on zeros it filled in ([#1400](https://github.com/HKUDS/Vibe-Trading/pull/1400)).
|
||||
|
||||
- **2026-09-08** 🧪 **An alpha that printed a number for a bar whose inputs were blank, and a spot-gold search that answered with a Swedish Bitcoin ETP**: the Alpha Zoo contract preserves NaN through warmup and missing data, but an alpha that branches on an `np.where` comparison never sees a NaN — the comparison is `False`, so the ternary falls through to its constant. Blanking every declared input on one bar of a 462-alpha sweep, **84 alphas returned a number anyway**, and since `dropna()` is what keeps a gap out of an IC, each of those constants was consumed as a real signal. The guard now sits in the registry rather than in each alpha — the output is masked to NaN wherever a declared dependency is missing on that bar — and the same sweep afterwards finds **none** ([#1377](https://github.com/HKUDS/Vibe-Trading/pull/1377), closes [#1376](https://github.com/HKUDS/Vibe-Trading/issues/1376)). Eleven alphas were fixed for the other half of the contract, the warmup window ([#1379](https://github.com/HKUDS/Vibe-Trading/pull/1379), [#1380](https://github.com/HKUDS/Vibe-Trading/pull/1380), [#1381](https://github.com/HKUDS/Vibe-Trading/pull/1381), [#1382](https://github.com/HKUDS/Vibe-Trading/pull/1382), [#1383](https://github.com/HKUDS/Vibe-Trading/pull/1383)) — and measuring that half the same way leaves **52 alphas still emitting a value inside their own declared `min_warmup_bars`**. A registry-level warmup mask would also blank rows for alphas whose declaration is merely conservative, so that half stays open and stated rather than quietly carried. Separately, `search_symbol("XAUUSD")` returned exactly one candidate — `VALOUR-BTC-0-SEK.ST`, a Swedish Bitcoin ETP — which then locked the run's instrument identity; a metal or FX pair query is an exact instrument assertion now, keeping only candidates that name the same two legs in any spelling ([#1282](https://github.com/HKUDS/Vibe-Trading/pull/1282)). **Fixed:** 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 (closes [#1387](https://github.com/HKUDS/Vibe-Trading/issues/1387)). A metric claim formatted as a generic `| Metric | Value |` table escaped the analysis gate that rejects the same claim in prose ([#1375](https://github.com/HKUDS/Vibe-Trading/pull/1375)), while the mirror-image error rejected a price word used as a formula variable — `close/SMA50 > 1` was read as an asserted price ([#1378](https://github.com/HKUDS/Vibe-Trading/pull/1378), closes [#1354](https://github.com/HKUDS/Vibe-Trading/issues/1354)). A pasted broker code (`HK.00700`, `US.AAPL`, `SH.600519`) scanned as no symbol at all, so every market tool answered `identity_required` ([#1384](https://github.com/HKUDS/Vibe-Trading/pull/1384)). The three Archimedean copula CDFs returned wrong extreme values under strong dependence — Clayton `0.0`, Gumbel `1.0`, Frank `inf` — and are computed in log space now, verified against a 2500-digit reference across θ ∈ [-5000, 5000] ([#1386](https://github.com/HKUDS/Vibe-Trading/pull/1386), closes [#1385](https://github.com/HKUDS/Vibe-Trading/issues/1385)). An MT5 order above the symbol's volume cap was silently clamped and sent, an eToro limit order with no limit price rested untriggered while reading as accepted, futu K-lines inherited an undeclared adjustment caliber, and `BTCUSDT` was routed through A-share rules — T+1 and no shorting, on a perpetual ([#1388](https://github.com/HKUDS/Vibe-Trading/pull/1388)). Thanks [@cgycorey](https://github.com/cgycorey), [@Shizoqua](https://github.com/Shizoqua), [@he-yufeng](https://github.com/he-yufeng), [@Robin1987China](https://github.com/Robin1987China), [@laiyierjiangsu](https://github.com/laiyierjiangsu), [@aminak58](https://github.com/aminak58), and [@nandofmike](https://github.com/nandofmike)!
|
||||
|
||||
- **2026-09-07** 🪙 **A 50-ounce gold order rounded down to nothing, and a currency future priced at 1/2500th of its contract size**: in a cross-market backtest the composite engine dispatches every symbol through one shared sub-engine per market, but only `apply_slippage` refreshed that sub-engine's own active symbol — so `round_size` and `calc_commission` used whichever symbol had synced it last. A 50 oz gold position sized against FX's 1,000-unit micro lot rounded to **0**, gold futures were charged the index future's rate-based fee (6.90) instead of their own flat one (20.00), and swap used the 100,000-unit standard lot rather than the 100 oz metal lot ([#1370](https://github.com/HKUDS/Vibe-Trading/pull/1370)). Separately, `_extract_product` could not read a symbol whose product code contains a digit or ends in a letter that doubles as a month code: `6EZ4`, `6JH25`, `M2K`, `MYM2503` and `FESX2503` all fell through to the default multiplier of 50 — for `6E` the true figure is 125,000 ([#1369](https://github.com/HKUDS/Vibe-Trading/pull/1369)). Symbols now resolve against the multiplier table itself, longest match first, which also covers the dated forms (`M2KZ4`) and prefix collisions (`SILZ4` vs `SI`). **Fixed:** four Alpha Zoo factors printed a hard ±1 or 0 through a trading halt and inside their own declared warmup, because a NaN comparison is `False` rather than NaN and the ternary fell through to its constant. `min_warmup_bars` is metadata that nothing trims, and what keeps a gap out of an IC is `dropna()` — so those constants were consumed as real signals ([#1371](https://github.com/HKUDS/Vibe-Trading/pull/1371), [#1372](https://github.com/HKUDS/Vibe-Trading/pull/1372), [#1373](https://github.com/HKUDS/Vibe-Trading/pull/1373), [#1374](https://github.com/HKUDS/Vibe-Trading/pull/1374)). Measuring the whole zoo the same way puts **82 more alphas in the same shape**; rather than one PR per alpha, that is now tracked as a registry-level guard in [#1376](https://github.com/HKUDS/Vibe-Trading/issues/1376). Strategy-discovery evidence also resolved position size once for the whole run instead of per regime, and a single unparseable benchmark cell could erase every evidence row that run produced ([#1368](https://github.com/HKUDS/Vibe-Trading/pull/1368)). **New:** a run that keeps issuing tool calls without gaining information now stops after eight iterations with a visible recovery request, instead of spending its whole budget on path discovery — the reported case burned ~35 iterations re-guessing the same rejected paths. An identical call is refused from its **second** failure rather than its first, so one honest retry after a rate limit or a timeout still runs ([#1363](https://github.com/HKUDS/Vibe-Trading/pull/1363), closes [#1353](https://github.com/HKUDS/Vibe-Trading/issues/1353)). Thanks [@Shizoqua](https://github.com/Shizoqua), [@be-student](https://github.com/be-student), and [@nandofmike](https://github.com/nandofmike)!
|
||||
|
||||
<details>
|
||||
<summary>Earlier news</summary>
|
||||
|
||||
- **2026-09-07** 🪙 **A 50-ounce gold order rounded down to nothing, and a currency future priced at 1/2500th of its contract size**: in a cross-market backtest the composite engine dispatches every symbol through one shared sub-engine per market, but only `apply_slippage` refreshed that sub-engine's own active symbol — so `round_size` and `calc_commission` used whichever symbol had synced it last. A 50 oz gold position sized against FX's 1,000-unit micro lot rounded to **0**, gold futures were charged the index future's rate-based fee (6.90) instead of their own flat one (20.00), and swap used the 100,000-unit standard lot rather than the 100 oz metal lot ([#1370](https://github.com/HKUDS/Vibe-Trading/pull/1370)). Separately, `_extract_product` could not read a symbol whose product code contains a digit or ends in a letter that doubles as a month code: `6EZ4`, `6JH25`, `M2K`, `MYM2503` and `FESX2503` all fell through to the default multiplier of 50 — for `6E` the true figure is 125,000 ([#1369](https://github.com/HKUDS/Vibe-Trading/pull/1369)). Symbols now resolve against the multiplier table itself, longest match first, which also covers the dated forms (`M2KZ4`) and prefix collisions (`SILZ4` vs `SI`). **Fixed:** four Alpha Zoo factors printed a hard ±1 or 0 through a trading halt and inside their own declared warmup, because a NaN comparison is `False` rather than NaN and the ternary fell through to its constant. `min_warmup_bars` is metadata that nothing trims, and what keeps a gap out of an IC is `dropna()` — so those constants were consumed as real signals ([#1371](https://github.com/HKUDS/Vibe-Trading/pull/1371), [#1372](https://github.com/HKUDS/Vibe-Trading/pull/1372), [#1373](https://github.com/HKUDS/Vibe-Trading/pull/1373), [#1374](https://github.com/HKUDS/Vibe-Trading/pull/1374)). Measuring the whole zoo the same way puts **82 more alphas in the same shape**; rather than one PR per alpha, that is now tracked as a registry-level guard in [#1376](https://github.com/HKUDS/Vibe-Trading/issues/1376). Strategy-discovery evidence also resolved position size once for the whole run instead of per regime, and a single unparseable benchmark cell could erase every evidence row that run produced ([#1368](https://github.com/HKUDS/Vibe-Trading/pull/1368)). **New:** a run that keeps issuing tool calls without gaining information now stops after eight iterations with a visible recovery request, instead of spending its whole budget on path discovery — the reported case burned ~35 iterations re-guessing the same rejected paths. An identical call is refused from its **second** failure rather than its first, so one honest retry after a rate limit or a timeout still runs ([#1363](https://github.com/HKUDS/Vibe-Trading/pull/1363), closes [#1353](https://github.com/HKUDS/Vibe-Trading/issues/1353)). Thanks [@Shizoqua](https://github.com/Shizoqua), [@be-student](https://github.com/be-student), and [@nandofmike](https://github.com/nandofmike)!
|
||||
- **2026-09-06** 🛡️ **A buy limit sized at a price it would never fill at, and an audit that returned PASS having verified nothing**: the MCP order gate priced a quantity order from the live quote alone, so a limit at twice the market cleared a cap sized for the quote and could fill at twice the authorized notional. It is sized at the worse of quote and limit now — the rule the direct-SDK path already used — and an unparseable limit price is denied rather than waved through ([#1361](https://github.com/HKUDS/Vibe-Trading/pull/1361)). The report auditor skipped every point with no fetched value and then reported **PASS** because nothing had failed, certifying a report backed by no evidence at all; that fails closed now ([#1362](https://github.com/HKUDS/Vibe-Trading/pull/1362)). **Fixed:** metrics survived a failed analysis tool, and the new exemption for attributed figures — right for a paper's Sharpe, wrong for a price this run is meant to observe — would have passed `Analysts say TSLA.US last traded at 412.35 USD.` with no tool call behind it ([#1338](https://github.com/HKUDS/Vibe-Trading/pull/1338), closes [#1336](https://github.com/HKUDS/Vibe-Trading/issues/1336)); a cash-dividend row killed the whole trade-journal parse ([#1356](https://github.com/HKUDS/Vibe-Trading/pull/1356)); compaction re-opened the de-duplication ledger by tool name, so clearing one argument variant left the rest gated ([#1358](https://github.com/HKUDS/Vibe-Trading/pull/1358)); the compliance ledger refused its first append on Windows ([#1261](https://github.com/HKUDS/Vibe-Trading/pull/1261)). **New:** Zerodha Kite Connect makes 14 brokers — read and paper only, since Kite exposes no runtime paper/live discriminator ([#1193](https://github.com/HKUDS/Vibe-Trading/pull/1193)); Nobitex and Wallex add Iranian Toman pairs for 27 data sources, neither able to silently degrade into a USD-quoted venue ([#1263](https://github.com/HKUDS/Vibe-Trading/pull/1263)); native Anthropic calls cache the static tools-and-system prefix instead of resending it at full price every turn ([#1366](https://github.com/HKUDS/Vibe-Trading/pull/1366)). Thanks [@cgycorey](https://github.com/cgycorey), [@ashutoshsinghpr7](https://github.com/ashutoshsinghpr7), [@saju01](https://github.com/saju01), [@he-yufeng](https://github.com/he-yufeng), [@Emad211](https://github.com/Emad211), [@averatec0773](https://github.com/averatec0773), [@birdxs](https://github.com/birdxs), and [@AirHua-byte](https://github.com/AirHua-byte)!
|
||||
- **2026-09-05** 🔓 **A price the model invented passed the check in English but was caught in Chinese, and an agent that could not re-read data it had already fetched**: the grounding gate matched `close` but not **`closed`**, so `The stock closed at 412.35.` with no tool call behind it went straight through, while the identical fabricated claim in Chinese (`该股收盘 412.35。`) was rejected. `last traded at` and `quoted at` had no rule at all, and Chinese had the mirror-image hole — `成交价` / `最新价` / `股价` / `收报` all missed. Both vocabularies are complete now, the English forms require a following "at" so volume and deal phrasings stay out, and a new suite asserts the two languages reach the **same** verdict per case instead of checking each in isolation. Separately, a session that had successfully fetched fundamentals, fund flow, margin and research data then 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 the tool name, and the token budget counts tool-call arguments instead of scoring a 100 KB payload as ten tokens ([#1349](https://github.com/HKUDS/Vibe-Trading/pull/1349), [#1341](https://github.com/HKUDS/Vibe-Trading/pull/1341), [#1352](https://github.com/HKUDS/Vibe-Trading/pull/1352), closes [#1343](https://github.com/HKUDS/Vibe-Trading/issues/1343)). **Fixed:** every backtest launched from the Web UI segfaulted on aarch64 — sandbox rlimits ran Python in the forked child of a multi-threaded server, undefined behaviour per POSIX; they are applied after exec now (closes [#1355](https://github.com/HKUDS/Vibe-Trading/issues/1355)). `GC=F` and `XAUUSD` were classified as China A-shares ([#1280](https://github.com/HKUDS/Vibe-Trading/pull/1280)); `BRK.B.US` and other dotted class shares fetched an empty chart ([#1351](https://github.com/HKUDS/Vibe-Trading/pull/1351)); a fully invested rebalance basket aborted on a commission overdraft instead of scaling to fit ([#1344](https://github.com/HKUDS/Vibe-Trading/pull/1344), closes [#1274](https://github.com/HKUDS/Vibe-Trading/issues/1274)); percentage-point deltas — `3.6pp`, `3.6 个百分点`, `250 基点` — were read as quoted prices ([#1346](https://github.com/HKUDS/Vibe-Trading/pull/1346)); joined crypto pairs like `BTCUSDT` went unrecognised while spot platinum resolved to a crypto pair that does not exist ([#1265](https://github.com/HKUDS/Vibe-Trading/pull/1265)); strategy-store history came back oldest-first when timestamps tied ([#1347](https://github.com/HKUDS/Vibe-Trading/pull/1347)); the Codex adapter discarded the model the provider reports ([#1348](https://github.com/HKUDS/Vibe-Trading/pull/1348)). **New:** market context stated earlier in a conversation can narrow symbol resolution, behind `VIBE_CONTEXTUAL_IDENTITY_CONSTRAINTS` ([#1269](https://github.com/HKUDS/Vibe-Trading/pull/1269)); the investment-committee workers get the fundamental data panel their prompts already assumed ([#1345](https://github.com/HKUDS/Vibe-Trading/pull/1345)); deterministic USD-M tolerance calibration from recorded comparisons ([#1248](https://github.com/HKUDS/Vibe-Trading/pull/1248)). Thanks [@nandofmike](https://github.com/nandofmike), [@atomfive](https://github.com/atomfive), [@thisisjun786](https://github.com/thisisjun786), [@cgycorey](https://github.com/cgycorey), [@saju01](https://github.com/saju01), [@he-yufeng](https://github.com/he-yufeng), [@aminak58](https://github.com/aminak58), [@AirHua-byte](https://github.com/AirHua-byte), [@lorenzozanee](https://github.com/lorenzozanee), [@ethanstoner](https://github.com/ethanstoner), [@Shizoqua](https://github.com/Shizoqua)!
|
||||
- **2026-09-04** 🩺 **Every Claude 5 run failed on the first request, and a halted position was marked back to what you paid for it**: `langchain-anthropic` moves `temperature` into `extra_body` for the current Anthropic SDK, and our self-heal only popped the top-level key — so the retry re-sent exactly the field the API had just rejected, and every run on `claude-sonnet-5` / `claude-opus-5` died at the first call ([#1330](https://github.com/HKUDS/Vibe-Trading/pull/1330), closes [#1329](https://github.com/HKUDS/Vibe-Trading/issues/1329)). In backtests, a position held past the forward-fill limit was re-marked at its entry price: equity printed a drawdown with no market event behind it, and rebalance sizing ran against that phantom mark. A halt of any length now marks at the last traded close, while order fills still refuse a stale price ([#1332](https://github.com/HKUDS/Vibe-Trading/pull/1332), closes [#1318](https://github.com/HKUDS/Vibe-Trading/issues/1318)). **Fixed:** three ways a commit-time adjustment could widen the mandate you approved — a stringified number skipped the numeric check, `True` passed as a number, and an instrument whitelist had no comparison at all; cash-only stays the floor of the leverage axis rather than an invalid type, so the safest mandate is still committable ([#1285](https://github.com/HKUDS/Vibe-Trading/pull/1285)). The elapsed clock survives switching pages, reloading, and reopening a session from history ([#1340](https://github.com/HKUDS/Vibe-Trading/pull/1340), closes [#1339](https://github.com/HKUDS/Vibe-Trading/issues/1339)), and the seven open npm advisories in the frontend and desktop lock files are patched. Thanks [@averatec0773](https://github.com/averatec0773), [@he-yufeng](https://github.com/he-yufeng), and [@Jackzigen](https://github.com/Jackzigen)!
|
||||
|
||||
+3
-2
@@ -52,15 +52,16 @@
|
||||
|
||||
> ⚠️ **تحذير أمني:** حساب X باسم `VibeTrading_HKU`، ومشروع Virtuals رقم `101845`، وعقد التوكن `0x640BDBF77b6447E8b7DB7894cED84BD1c40571f4` كلّها غير رسمية ولا تتبع Vibe-Trading. لم نُطلق أو نؤيد مطلقًا أي توكن أو عملة ميم. لا تشترِ هذا التوكن، ولا تربط محفظتك، ولا توقّع أي شيء. [التفاصيل](SECURITY.md#official-channels--impersonation).
|
||||
|
||||
- **2026-09-09** 🚀 **إصدار v0.1.15** ([ملاحظات الإصدار](https://github.com/HKUDS/Vibe-Trading/releases/tag/v0.1.15)، `pip install -U vibe-trading-ai`): 551 التزامًا و162 طلب سحب مدمجًا منذ 0.1.14، من 35 مساهمًا. **موضوع هذه الدورة هو أن تُفصح البيانات عن حقيقتها** — وقد تبيّن أن أكبر ثلاثة إصلاحات هي العلة نفسها في ثياب مختلفة: قيمة افتراضية تستبدل بهدوء قيمةً معقولة بقيمة مفقودة، وهي في المراحل التالية لا تُميَّز عن رصدٍ حقيقي. انتقل عقد NaN في Alpha Zoo من كل alpha على حدة إلى السجل: فالـ alpha التي تتفرّع عبر مقارنة داخل `np.where` لا ترى NaN أبدًا — لأن نتيجة المقارنة `False` — ولذلك بعد تفريغ كل المدخلات المُعلَنة عند شمعة واحدة **ظلّت 84 من أصل 462 alpha تُعيد رقمًا**، وكان كل رقم منها يُستهلك كإشارة حقيقية لأن `dropna()` هي ما يمنع الفجوة من دخول الـ IC. الآن يُقنِّع السجل المخرجات عند أي شمعة تنقصها تبعية مُعلَنة، ولا يبقى أي منها بعد المسح نفسه ([#1377](https://github.com/HKUDS/Vibe-Trading/pull/1377)، ويُغلق [#1376](https://github.com/HKUDS/Vibe-Trading/issues/1376)). أما شطر الإحماء فيبقى مفتوحًا ومُعلَنًا لا محمولًا في صمت: **لا تزال 52 alpha تُصدر قيمة داخل نطاق `min_warmup_bars` الذي أعلنته بنفسها**، وقناع الإحماء على مستوى السجل سيمحو أيضًا صفوف alphas لم تُبالغ في الإعلان إلا بشمعتين أو ثلاث، فهذا الشطر يحتاج قرارًا في الاتجاه لا 52 طلب سحب. المثال الثاني من الصنف نفسه: لا يزال pandas يجعل `pct_change()` يملأ بالقيمة السابقة افتراضيًا، فيصير الإغلاق المفقود **عائدًا بنسبة 0.0% لم يحدث قط**. أصلح أربعة طلبات سحب موضعًا واحدًا لكلٍّ منها، وكشف المسح الشامل **24 موضعًا في 10 ملفات** — اثنان منها داخل الملفات ذاتها التي كانت تلك الطلبات تُعدّلها. والمثال الثالث: سلسلة مُحمِّلات `futures` كانت تُسمّي `tushare` و`akshare`، و**لم يُنفِّذ أيٌّ منهما نقطة نهاية للعقود الآجلة إطلاقًا**، فسقط كل عقد إلى نقطة نهاية أسهم السوق الصيني. يقدّم AKShare الآن العقود الصينية عبر نقاط نهاية Sina اليومية التي لا تحتاج مفتاحًا — المؤرَّخة والمستمرة الرئيسية، ومُختبَرة فعليًا على بورصات شنغهاي والمالية الصينية وقوانغتشو وتشنغتشو — بينما يُعيد العقد العالمي نتيجة فارغة فيصل إلى `local` بدلًا من تسعيره كسهم ([#1395](https://github.com/HKUDS/Vibe-Trading/issues/1395)). كما باتت الأسعار نفسها تحمل وسم معيار التعديل الذي قُدِّمت به، والمصدر الذي لم يُقَس معياره قط مقابل استجابة حقيقية يُبلِّغ عن `unknown` بدل تخمين قيمة ([#1317](https://github.com/HKUDS/Vibe-Trading/pull/1317)). **والتداول الحقيقي يفشل مغلقًا في خمسة مواضع إضافية**: قراءة مراكز من الوسيط تُعيد خطأ في الواجهة، وأظرف الأخطاء الواردة أثناء مسح الإيقاف، ومزلاج التسييل عبر إعادة تشغيل المُشغِّل، والأوامر المعلّقة لدى Alpaca التي تُستعاد بمعرّف العميل الدقيق عبر إعادة التشغيل، وتحجيم أوامر الشراء المحدَّدة عند الأسوأ بين التسعيرة والحد في كلا المسارين. **وفي الاختبار الخلفي**: تُنفَّذ إشارات الخيارات عند الشمعة التالية لا عند الشمعة التي حُسبت منها، وتحجز أطراف الخيارات المكشوفة هامشًا وتُقيَّد فتحاتها بالقوة الشرائية، وتُسوَّى فوائد العقود الدائمة بمدى الشمعة على الأطر من 8 ساعات فأكثر، وتُقلَّص سلة إعادة التوازن المُثقلة تناسبيًا بدل إلغائها، ويُقيَّم المركز الموقوف عند آخر إغلاق متداول لا عند كلفة الدخول. **وفي حلقةLine truncated
|
||||
|
||||
- **2026-09-09** 🛢️ **عقد نفط خام أمريكي تمّت تسويته باليوان، وقالب استراتيجية اخترع عائداً بنسبة 0% من سعر مفقود**: الرمز `CL2412.NYMEX` لم يطابق أي نمط — الصيغة المؤرَّخة المجرّدة (`CL2412`) تطابق، وصيغة البورصة (`ES.CME`) تطابق، أما الطريقة التي يُكتب بها العقد فعلياً فلا تطابق أياً منهما — فسقط إلى القيمة الافتراضية لسوق الأسهم الصينية وجرى تنفيذه بقاعدة T+1 دون بيع على المكشوف وبتسوية باليوان. وعلى الجانب الصيني كانت تهجئات البورصات في Tushare تمثّل الوجه المقابل للمشكلة نفسها ([#1396](https://github.com/HKUDS/Vibe-Trading/pull/1396)، يغلق [#1394](https://github.com/HKUDS/Vibe-Trading/issues/1394))؛ والنصفان يُصنَّفان الآن بشكل صحيح. وبشكل منفصل، لا تزال pandas تملأ القيم للأمام افتراضياً في `pct_change()`، فيتحوّل الإغلاق المفقود إلى **عائد مقداره 0.0% لم يحدث قط**، وتُبلغ الشمعة التالية عن حركة يومين على أنها حركة يوم واحد. أصلح طلبا دمج موضعاً واحداً لكلٍّ منهما ([#1397](https://github.com/HKUDS/Vibe-Trading/pull/1397)، [#1398](https://github.com/HKUDS/Vibe-Trading/pull/1398))؛ ومسحٌ شامل للمهارات وجد **24 موضعاً في 10 ملفات**، اثنان منها داخل الملفات نفسها التي كان هذان الطلبان يعدّلانها، وحارس على مستوى المستودع يُبقي هذا الصنف مغلقاً. كما تُصرّح اختبارات العقود الآجلة الصينية الآن بالمنتجات التي جرى تسعيرها بقيمة افتراضية عامة بدلاً من مدخل في الجدول — فنسبة الهامش الحقيقية لـ `rb` هي 0.10، وهي الرقم نفسه الذي تحمله القيمة الافتراضية، و«ما جرى استخراجه» يجب ألّا يُقرأ كأنه «ما جرى افتراضه» (يغلق [#1393](https://github.com/HKUDS/Vibe-Trading/issues/1393)). ودُمج أيضاً: إزالة تسريب التسميات المستقبلية في مثال التدريب المتدحرج للتعلم الآلي ([#1392](https://github.com/HKUDS/Vibe-Trading/pull/1392))، واستبعاد الأصول التي لا تملك أي رصد لعوامل من اختيار TopN ([#1399](https://github.com/HKUDS/Vibe-Trading/pull/1399))، وتعامد عامل المشاعر الذي لم يعد ينحدر على الأصفار التي ملأها بنفسه ([#1400](https://github.com/HKUDS/Vibe-Trading/pull/1400)).
|
||||
|
||||
- **2026-09-08** 🧪 **عامل ألفا يطبع رقماً على شمعة كانت مدخلاتها فارغة، وبحث عن الذهب الفوري ردّ بمنتج ETP سويدي للبيتكوين**: عقد Alpha Zoo يحافظ على NaN خلال فترة الإحماء والبيانات المفقودة، لكن أي ألفا يتفرّع عبر مقارنة داخل `np.where` لا يرى NaN إطلاقاً — فالمقارنة تعطي `False`، ومن ثمّ يسقط التعبير الثلاثي إلى ثابته. وبإفراغ كل مدخل معلَن على شمعة واحدة في مسح شمل 462 عامل ألفا، **أعاد 84 منها رقماً رغم ذلك**؛ وبما أن ما يُبعد الفجوة عن معامل الارتباط المعلوماتي هو `dropna()`، فقد كانت تلك الثوابت تُستهلك بوصفها إشارات حقيقية. صار الحارس الآن في السجل (registry) بدلاً من كل ألفا على حدة — إذ يُقنَّع الناتج إلى NaN حيثما غاب اعتماد معلَن على تلك الشمعة — ولا يجد المسح نفسه بعد الإصلاح **ولا حالة واحدة** ([#1377](https://github.com/HKUDS/Vibe-Trading/pull/1377)، يغلق [#1376](https://github.com/HKUDS/Vibe-Trading/issues/1376)). كما جرى إصلاح أحد عشر عامل ألفا للنصف الآخر من العقد، أي نافذة الإحماء ([#1379](https://github.com/HKUDS/Vibe-Trading/pull/1379)، [#1380](https://github.com/HKUDS/Vibe-Trading/pull/1380)، [#1381](https://github.com/HKUDS/Vibe-Trading/pull/1381)، [#1382](https://github.com/HKUDS/Vibe-Trading/pull/1382)، [#1383](https://github.com/HKUDS/Vibe-Trading/pull/1383))، وقياس ذلك النصف بالطريقة ذاتها يُبقي **52 عامل ألفا تُصدر قيمة داخل `min_warmup_bars` التي أعلنتها بنفسها**. وتقنيع الإحماء على مستوى السجل سيُفرغ أيضاً صفوفاً لعوامل إعلانها متحفّظ فحسب، لذلك يبقى هذا النصف مفتوحاً ومعلَناً هنا بدل حمله بصمت. وبشكل منفصل، أعاد `search_symbol("XAUUSD")` مرشحاً واحداً فقط — `VALOUR-BTC-0-SEK.ST`، وهو ETP سويدي للبيتكوين — فثبّت هوية الأداة للتشغيل بأكمله؛ صار استعلام زوج معدن أو عملة الآن تأكيداً دقيقاً للأداة، ولا يُبقي إلا المرشحين الذين يسمّون الساقين نفسيهما بأي صياغة ([#1282](https://github.com/HKUDS/Vibe-Trading/pull/1282)). **إصلاحات:** تاريخ الإفصاح لا يحمل وقتاً من اليوم، لذا كان الإفصاح يصبح مرئياً على الإطار اللحظي من أول شمعة في يوم إعلانه نفسه — أي جلسة كاملة من الاستباق. تُرفض الآن الأطر الأقصر من اليومية، مع `fundamental_subdaily="next_day"` بوصفها الموافقة الصريحة (يغلق [#1387](https://github.com/HKUDS/Vibe-Trading/issues/1387)). وكان ادعاء مقياس مكتوب في جدول بترويسة عامة `| المؤشر | القيمة |` يفلت من بوابة التحليل التي ترفض الادعاء نفسه في النص العادي ([#1375](https://github.com/HKUDS/Vibe-Trading/pull/1375))، بينما كان الخطأ المرآتي يرفض كلمة سعر مستخدَمة متغيراً في صيغة: إذ كانت `close/SMA50 > 1` تُقرأ سعراً مؤكَّداً ([#1378](https://github.com/HKUDS/Vibe-Trading/pull/1378)، يغلق [#1354](https://github.com/HKUDS/Vibe-Trading/issues/1354)). ورمز الوسيط المُلصَق (`HK.00700` و`US.AAPL` و`SH.600519`) لم يكن يُقرأ رمزاً على الإطلاق، فكانت كل أداة سوقية ترد بـ `identity_required` ([#1384](https://github.com/HKUDS/Vibe-Trading/pull/1384)). أما دوال التوزيع التراكمي للكوبيولا الأرخميدية الثلاث فكانت تعيد قيماً طرفية خاطئة عند الاعتماد القوي — Clayton `0.0` وGumbel `1.0` وFrank `inf` — وصارت تُحسب في الفضاء اللوغاريتمي، مع التحقق مقابل مرجع بدقة 2500 خانة عبر θ ∈ [-5000, 5000] ([#1386](https://github.com/HKUDS/Vibe-Trading/pull/1386)، يغلق [#1385](https://github.com/HKUDS/Vibe-Trading/issues/1385)). وكان أمر MT5 الذي يتجاوز الحد الأقصى لحجم الرمز يُقتطع بصمت ويُرسل، وأمر eToro المحدد بلا سعر تحديد يبقى دون تفعيل بينما يظهر مقبولاً، وشموع futu ترث معيار تعديل غير معلَن، وكان `BTCUSDT` يمر بقواعد الأسهم الصينية من الفئة A — تسوية T+1Line truncated
|
||||
|
||||
- **2026-09-07** 🪙 **أمر ذهب بحجم 50 أونصة جرى تقريبه إلى لا شيء، وعقد عملة آجل سُعِّر عند 1/2500 من حجم عقده**: في اختبار رجعي متعدد الأسواق يوجّه المحرك المركّب كل رمز عبر محرك فرعي واحد مشترك لكل سوق، لكن `apply_slippage` وحده كان يحدّث الرمز النشط الخاص بذلك المحرك الفرعي — فصار `round_size` و`calc_commission` يستخدمان آخر رمز جرت مزامنته. مركز ذهب بحجم 50 أونصة جرى تحجيمه على أساس اللوت المصغّر للفوركس البالغ 1,000 وحدة فتقرّب إلى **0**، وفُرضت على عقود الذهب الآجلة رسوم مؤشر آجل قائمة على نسبة (6.90) بدل رسمها الثابت (20.00)، واستُخدم في المقايضة اللوت القياسي البالغ 100,000 وحدة بدل لوت المعادن البالغ 100 أونصة ([#1370](https://github.com/HKUDS/Vibe-Trading/pull/1370)). وبشكل منفصل، لم يكن `_extract_product` يقرأ رمزًا يحتوي رمز منتجه على رقم أو ينتهي بحرف يصلح أيضًا رمزًا لشهر: `6EZ4` و`6JH25` و`M2K` و`MYM2503` و`FESX2503` كانت كلها تسقط إلى المضاعف الافتراضي 50 — والقيمة الصحيحة لـ `6E` هي 125,000 ([#1369](https://github.com/HKUDS/Vibe-Trading/pull/1369)). تُحلّ الرموز الآن مقابل جدول المضاعفات نفسه بأطول تطابق أولًا، وهو ما يغطي كذلك الصيغ المؤرَّخة (`M2KZ4`) وتضارب البادئات (`SILZ4` مقابل `SI`). **إصلاحات:** كانت أربعة عوامل في Alpha Zoo تطبع ±1 أو 0 ثابتة خلال توقف التداول وداخل فترة الإحماء التي تعلنها بنفسها، لأن المقارنة مع NaN تعطي `False` لا NaN، فيسقط التعبير الثلاثي إلى ثابته. و`min_warmup_bars` بيانات وصفية لا يقتطع أحد بناءً عليها، والذي يُبقي الفجوة خارج حساب IC هو `dropna()` — أي أن تلك الثوابت كانت تُستهلك كإشارات حقيقية ([#1371](https://github.com/HKUDS/Vibe-Trading/pull/1371)، [#1372](https://github.com/HKUDS/Vibe-Trading/pull/1372)، [#1373](https://github.com/HKUDS/Vibe-Trading/pull/1373)، [#1374](https://github.com/HKUDS/Vibe-Trading/pull/1374)). وقياس المكتبة كلها بالمعيار نفسه يُظهر **82 عاملًا آخر بالشكل ذاته**؛ وبدل طلب سحب لكل عامل، صار ذلك متتبَّعًا كحارس على مستوى السجل في [#1376](https://github.com/HKUDS/Vibe-Trading/issues/1376). كذلك كانت أدلة strategy-discovery تحسب حجم المركز مرة واحدة للتشغيل كله بدل حسابه لكل نظام سوقي، وكانت خلية مرجعية واحدة غير قابلة للتحليل كفيلة بمحو كل صفوف الأدلة التي أنتجها ذلك التشغيل ([#1368](https://github.com/HKUDS/Vibe-Trading/pull/1368)). **جديد:** التشغيل الذي يواصل استدعاء الأدوات دون اكتساب معلومات جديدة يتوقف الآن بعد ثماني تكرارات مع طلب تعافٍ ظاهر، بدل إنفاق ميزانيته كلها على اكتشاف المسارات — فالحالة المُبلَّغ عنها استهلكت نحو 35 تكرارًا في تخمين المسارات المرفوضة نفسها. ويُرفض الاستدعاء المطابق ابتداءً من فشله **الثاني** لا الأول، فتبقى إعادة محاولة واحدة صادقة بعد حد المعدل أو انتهاء المهلة قابلة للتنفيذ ([#1363](https://github.com/HKUDS/Vibe-Trading/pull/1363)، يغلق [#1353](https://github.com/HKUDS/Vibe-Trading/issues/1353)). شكرًا [@Shizoqua](https://github.com/Shizoqua)، [@be-student](https://github.com/be-student) و[@nandofmike](https://github.com/nandofmike)!
|
||||
|
||||
<details>
|
||||
<summary>أخبار سابقة</summary>
|
||||
|
||||
- **2026-09-07** 🪙 **أمر ذهب بحجم 50 أونصة جرى تقريبه إلى لا شيء، وعقد عملة آجل سُعِّر عند 1/2500 من حجم عقده**: في اختبار رجعي متعدد الأسواق يوجّه المحرك المركّب كل رمز عبر محرك فرعي واحد مشترك لكل سوق، لكن `apply_slippage` وحده كان يحدّث الرمز النشط الخاص بذلك المحرك الفرعي — فصار `round_size` و`calc_commission` يستخدمان آخر رمز جرت مزامنته. مركز ذهب بحجم 50 أونصة جرى تحجيمه على أساس اللوت المصغّر للفوركس البالغ 1,000 وحدة فتقرّب إلى **0**، وفُرضت على عقود الذهب الآجلة رسوم مؤشر آجل قائمة على نسبة (6.90) بدل رسمها الثابت (20.00)، واستُخدم في المقايضة اللوت القياسي البالغ 100,000 وحدة بدل لوت المعادن البالغ 100 أونصة ([#1370](https://github.com/HKUDS/Vibe-Trading/pull/1370)). وبشكل منفصل، لم يكن `_extract_product` يقرأ رمزًا يحتوي رمز منتجه على رقم أو ينتهي بحرف يصلح أيضًا رمزًا لشهر: `6EZ4` و`6JH25` و`M2K` و`MYM2503` و`FESX2503` كانت كلها تسقط إلى المضاعف الافتراضي 50 — والقيمة الصحيحة لـ `6E` هي 125,000 ([#1369](https://github.com/HKUDS/Vibe-Trading/pull/1369)). تُحلّ الرموز الآن مقابل جدول المضاعفات نفسه بأطول تطابق أولًا، وهو ما يغطي كذلك الصيغ المؤرَّخة (`M2KZ4`) وتضارب البادئات (`SILZ4` مقابل `SI`). **إصلاحات:** كانت أربعة عوامل في Alpha Zoo تطبع ±1 أو 0 ثابتة خلال توقف التداول وداخل فترة الإحماء التي تعلنها بنفسها، لأن المقارنة مع NaN تعطي `False` لا NaN، فيسقط التعبير الثلاثي إلى ثابته. و`min_warmup_bars` بيانات وصفية لا يقتطع أحد بناءً عليها، والذي يُبقي الفجوة خارج حساب IC هو `dropna()` — أي أن تلك الثوابت كانت تُستهلك كإشارات حقيقية ([#1371](https://github.com/HKUDS/Vibe-Trading/pull/1371)، [#1372](https://github.com/HKUDS/Vibe-Trading/pull/1372)، [#1373](https://github.com/HKUDS/Vibe-Trading/pull/1373)، [#1374](https://github.com/HKUDS/Vibe-Trading/pull/1374)). وقياس المكتبة كلها بالمعيار نفسه يُظهر **82 عاملًا آخر بالشكل ذاته**؛ وبدل طلب سحب لكل عامل، صار ذلك متتبَّعًا كحارس على مستوى السجل في [#1376](https://github.com/HKUDS/Vibe-Trading/issues/1376). كذلك كانت أدلة strategy-discovery تحسب حجم المركز مرة واحدة للتشغيل كله بدل حسابه لكل نظام سوقي، وكانت خلية مرجعية واحدة غير قابلة للتحليل كفيلة بمحو كل صفوف الأدلة التي أنتجها ذلك التشغيل ([#1368](https://github.com/HKUDS/Vibe-Trading/pull/1368)). **جديد:** التشغيل الذي يواصل استدعاء الأدوات دون اكتساب معلومات جديدة يتوقف الآن بعد ثماني تكرارات مع طلب تعافٍ ظاهر، بدل إنفاق ميزانيته كلها على اكتشاف المسارات — فالحالة المُبلَّغ عنها استهلكت نحو 35 تكرارًا في تخمين المسارات المرفوضة نفسها. ويُرفض الاستدعاء المطابق ابتداءً من فشله **الثاني** لا الأول، فتبقى إعادة محاولة واحدة صادقة بعد حد المعدل أو انتهاء المهلة قابلة للتنفيذ ([#1363](https://github.com/HKUDS/Vibe-Trading/pull/1363)، يغلق [#1353](https://github.com/HKUDS/Vibe-Trading/issues/1353)). شكرًا [@Shizoqua](https://github.com/Shizoqua)، [@be-student](https://github.com/be-student) و[@nandofmike](https://github.com/nandofmike)!
|
||||
- **2026-09-06** 🛡️ **أمر شراء محدد جرى تحجيمه بسعر لن يُنفَّذ عنده أبدًا، وتدقيق أعاد PASS دون أن يتحقق من شيء**: كانت بوابة الأوامر عبر MCP تسعّر أمر الكمية بالسعر اللحظي وحده، فمرّ أمر محدد عند ضعف سعر السوق من سقف محسوب على السعر اللحظي وكان يمكن أن يُنفَّذ بضعف القيمة الاسمية المصرّح بها. صار التحجيم الآن عند الأسوأ بين السعر اللحظي والسعر المحدد — وهي القاعدة التي يستخدمها مسار SDK المباشر أصلًا — ويُرفض السعر المحدد غير القابل للتحليل بدل تمريره ([#1361](https://github.com/HKUDS/Vibe-Trading/pull/1361)). أما مدقّق التقارير فكان يتخطى كل نقطة بلا قيمة مجلوبة ثم يعيد **PASS** لأن شيئًا لم يفشل، فيعتمد تقريرًا بلا أي دليل؛ صفر نقاط متحقَّقة يفشل الآن بشكل مغلق ([#1362](https://github.com/HKUDS/Vibe-Trading/pull/1362)). **إصلاحات:** كانت المؤشرات تنجو بعد فشل أداة التحليل، وكان الاستثناء الجديد للأرقام المنسوبة إلى مصدر — صائب لنسبة شارب في ورقة بحثية، خاطئ لسعر يُفترض أن يرصده هذا التشغيل — سيمرّر «يقول المحللون إن TSLA.US نُفِّذ آخرًا عند 412.35 دولارًا.» دون أي استدعاء أداة ([#1338](https://github.com/HKUDS/Vibe-Trading/pull/1338)، يغلق [#1336](https://github.com/HKUDS/Vibe-Trading/issues/1336))؛ وكان صف توزيعات نقدية واحد يُسقط تحليل سجل التداول كله ([#1356](https://github.com/HKUDS/Vibe-Trading/pull/1356))؛ وكان ضغط السياق يفكّ قفل إزالة التكرار باسم الأداة، فمسح صيغة وسيطة واحدة يُبقي البقية محجوبة ([#1358](https://github.com/HKUDS/Vibe-Trading/pull/1358))؛ وكان سجل الامتثال المتسلسل بالتجزئة يرفض أول إضافة على ويندوز ([#1261](https://github.com/HKUDS/Vibe-Trading/pull/1261)). **جديد:** يرفع Zerodha Kite Connect عدد الوسطاء إلى 14 — قراءة وورقي فقط، لأن Kite لا يوفّر مميِّزًا زمن التشغيل بين paper وlive ([#1193](https://github.com/HKUDS/Vibe-Trading/pull/1193))؛ ويضيف Nobitex وWallex أزواج التومان الإيراني ليبلغ عدد مصادر البيانات 27، ولا يمكن لأي منهما أن يتراجع بصمت إلى سوق مقوَّمة بالدولار ([#1263](https://github.com/HKUDS/Vibe-Trading/pull/1263))؛ وتخزّن استدعاءات Anthropic الأصلية البادئة الثابتة للأدوات والنظام بدل إعادة إرسالها بالسعر الكامل كل دور ([#1366](https://github.com/HKUDS/Vibe-Trading/pull/1366)). شكرًا [@cgycorey](https://github.com/cgycorey)، [@ashutoshsinghpr7](https://github.com/ashutoshsinghpr7)، [@saju01](https://github.com/saju01)، [@he-yufeng](https://github.com/he-yufeng)، [@Emad211](https://github.com/Emad211)، [@averatec0773](https://github.com/averatec0773)، [@birdxs](https://github.com/birdxs) و[@AirHua-byte](https://github.com/AirHua-byte)!
|
||||
- **2026-09-05** 🔓 **سعر اختلقه النموذج كان يمرّ من الفحص بالإنجليزية بينما يُضبط بالصينية، ووكيل لا يستطيع إعادة قراءة بيانات سبق أن جلبها**: كانت بوابة التوثيق تطابق `close` ولا تطابق **`closed`**، فمرّت عبارة `The stock closed at 412.35.` دون أي استدعاء أداة، في حين رُفض الادعاء المختلق نفسه بالصينية (`该股收盘 412.35。`). ولم تكن هناك قاعدة أصلاً لـ `last traded at` و`quoted at`، وكان في الصينية ثغرة مماثلة معكوسة: `成交价` و`最新价` و`股价` و`收报` كلها تُفلت. اكتملت المفردات في اللغتين الآن، وتشترط الصيغ الإنجليزية ورود "at" بعدها حتى لا تُقرأ أحجام التداول أو الصفقات كأسعار، وتتحقق مجموعة اختبارات جديدة من وصول اللغتين إلى **الحكم نفسه** في كل حالة بدل فحص كل لغة على حدة. وبشكل منفصل: جلسة نجحت في جلب بيانات القوائم المالية وتدفق الأموال والهامش والتقارير، ثم مُحيت تلك النتائج لتحرير سياق، وظل سجل منع التكرار يرفض إعادة جلبها — 44 محاولة محجوبة في تشغيل واحد — لتنتهي بالإجابة "لم يتم الحصول على البيانات الأساسية" عن بيانات كان النموذج قد استلمها فعلاً. الآن يؤدي محو النتيجة إلى إعادة فتح الأداة، ويُفهرس السجل بالوسائط لا باسم الأداة، وتحتسب ميزانية الرموز وسائط استدعاء الأدوات بدل تقدير حمولة 100 كيلوبايت بعشرة رموز ([#1349](https://github.com/HKUDS/Vibe-Trading/pull/1349) و[#1341](https://github.com/HKUDS/Vibe-Trading/pull/1341) و[#1352](https://github.com/HKUDS/Vibe-Trading/pull/1352)، يغلق [#1343](https://github.com/HKUDS/Vibe-Trading/issues/1343)). **إصلاحات:** على معمارية aarch64 كان كل اختبار رجعي يُطلق من واجهة الويب ينتهي بخطأ تجزئة — إذ كانت حدود الموارد في البيئة المعزولة تنفّذ بايثون داخل عملية ابنة متفرّعة عن خادم متعدد الخيوط، وهو سلوك غير معرّف وفق POSIX؛ صارت تُطبَّق بعد exec (يغلق [#1355](https://github.com/HKUDS/Vibe-Trading/issues/1355)). كان `GC=F` و`XAUUSD` يُصنَّفان أسهماً صينية من الفئة A ([#1280](https://github.com/HKUDS/Vibe-Trading/pull/1280))؛ وكانت `BRK.B.US` وأمثالها من فئات الأسهم المنقوطة تُرجع بيانات فارغة ([#1351](https://github.com/HKUDS/Vibe-Trading/pull/1351))؛ وكانت محفظة مستثمرة بالكامل تُلغي إعادة الموازنة عند تجاوز العمولة بدل تصغيرها بالتناسب ([#1344](https://github.com/HKUDS/Vibe-Trading/pull/1344)، يغلق [#1274](https://github.com/HKUDS/Vibe-Trading/issues/1274))؛ وكانت فروق النقاط المئوية (`3.6pp` و`3.6 个百分点` و`250 基点`) تُقرأ كأسعار معروضة ([#1346](https://github.com/HKUDS/Vibe-Trading/pull/1346))؛ ولم تكن أزواج العملات المشفّرة الملتصقة مثل `BTCUSDT` تُتعرَّف، بينما كان البلاتين الفوري يُحلّ إلى زوج مشفّر غير موجود ([#1265](https://github.com/HKUDS/Vibe-Trading/pull/1265))؛ وكان سجل مخزن الاستراتيجيات يعود من الأقدم إلى الأحدث عند تساوي الطوابع الزمنية ([#1347](https://github.com/HKUDS/Vibe-Trading/pull/1347))؛ وكان محوّل Codex يهمل اسم النموذج الذي يبلّغ عنه المزوّد ([#1348](https://github.com/HKUDS/Vibe-Trading/pull/1348)). **جديد:** يمكن لسياق السوق المذكور سابقاً في المحادثة أن يضيّق تحليل الرموز، خلف `VIBE_CONTEXTUAL_IDENTITY_CONSTRAINTS` ([#1269](https://github.com/HKUDS/Vibe-Trading/pull/1269))؛ ويحصل عاملو لجنة الاستثمار على لوحة البيانات الأساسية التي كانت تعليماتهم تفترضها أصلاً ([#1345](https://github.com/HKUDS/Vibe-Trading/pull/1345))؛ ومعايرة حتمية لتفاوت USD-M انطلاقاً من مقارنات مسجّلة ([#1248](https://github.com/HKUDS/Vibe-Trading/pull/1248)). شكراً [@nandofmike](https://github.com/nandofmike), [@atomfive](https://github.com/atomfive), [@thisisjun786](https://github.com/thisisjun786), [@cgycorey](https://github.com/cgycorey), [@saju01](https://github.com/saju01Line truncated
|
||||
- **2026-09-04** 🩺 **كان كل تشغيل على Claude 5 يفشل عند أول طلب، وكان المركز الموقوف عن التداول يُقيَّم بسعر شرائه**: مع حزمة Anthropic الحالية صار `langchain-anthropic` ينقل `temperature` إلى `extra_body`، بينما كان الإصلاح الذاتي لدينا يزيل المفتاح العلوي فقط، فأعادت المحاولة إرسال الحقل نفسه الذي رفضته الواجهة للتو، ومات كل تشغيل على `claude-sonnet-5` / `claude-opus-5` عند أول نداء ([#1330](https://github.com/HKUDS/Vibe-Trading/pull/1330)، يغلق [#1329](https://github.com/HKUDS/Vibe-Trading/issues/1329)). وفي الاختبارات التاريخية كان المركز المحتفظ به بعد حد التعبئة الأمامية يُعاد تقييمه بسعر الدخول: فتظهر في منحنى رأس المال هبوطة لا يقف خلفها أي حدث سوقي، ويجري حساب أحجام إعادة التوازن على ذلك السعر الوهمي. صار التقييم الآن على آخر سعر تداول مهما طال التوقف، بينما ما زال تنفيذ الأوامر يرفض أي سعر قديم ([#1332](https://github.com/HKUDS/Vibe-Trading/pull/1332)، يغلق [#1318](https://github.com/HKUDS/Vibe-Trading/issues/1318)). **إصلاحات:** ثلاث طرق كان بإمكان تعديل لحظة الاعتماد أن يوسّع بها التفويض الذي وافقت عليه — رقم مكتوب كنص يتجاوز فحص الأرقام، و`True` يمر بوصفه رقمًا، وقائمة الأدوات المسموح بها لم يكن لها فرع مقارنة أصلًا. كما أن وضع النقد فقط (cash-only) هو الحد الأدنى لمحور الرافعة لا نوعًا غير صالح، فبقي أكثر التفويضات تحفّظًا قابلًا للاعتماد ([#1285](https://github.com/HKUDS/Vibe-Trading/pull/1285)). ويصمد عدّاد الوقت المنقضي أمام تبديل الصفحات وإعادة التحميل وإعادة فتح الجلسة من السجل ([#1340](https://github.com/HKUDS/Vibe-Trading/pull/1340)، يغلق [#1339](https://github.com/HKUDS/Vibe-Trading/issues/1339))، كما رُقِّعت تنبيهات npm الأمنية السبعة المفتوحة في ملفي القفل للواجهة وتطبيق سطح المكتب. شكرًا [@averatec0773](https://github.com/averatec0773) و[@he-yufeng](https://github.com/he-yufeng) و[@Jackzigen](https://github.com/Jackzigen)!
|
||||
|
||||
+3
-2
@@ -52,15 +52,16 @@
|
||||
|
||||
> ⚠️ **Advertencia de seguridad:** la cuenta de X `VibeTrading_HKU`, el proyecto de Virtuals `101845` y el contrato de token `0x640BDBF77b6447E8b7DB7894cED84BD1c40571f4` no son activos oficiales de Vibe-Trading. Nunca hemos lanzado ni respaldado ningún token o memecoin. No compres, conectes una wallet ni firmes nada. [Detalles](SECURITY.md#official-channels--impersonation).
|
||||
|
||||
- **2026-09-09** 🚀 **v0.1.15 publicada** ([Notas de la versión](https://github.com/HKUDS/Vibe-Trading/releases/tag/v0.1.15), `pip install -U vibe-trading-ai`): 551 commits y 162 pull requests fusionadas desde 0.1.14, de 35 personas colaboradoras. **El tema de este ciclo es que los datos digan lo que son**, y las tres correcciones mayores resultaron ser el mismo fallo con distinta ropa: un valor por defecto que sustituye en silencio lo que falta por algo verosímil, indistinguible aguas abajo de una observación real. El contrato NaN del Alpha Zoo pasó de cada alpha individual al registro: un alpha que se bifurca con una comparación dentro de `np.where` nunca ve un NaN —la comparación es `False`—, de modo que al vaciar todas las entradas declaradas en una barra **84 de 462 alphas seguían devolviendo un número**, y cada uno se consumía como señal real porque `dropna()` es justo lo que mantiene un hueco fuera del IC. Ahora el registro enmascara la salida en cualquier barra a la que le falte una dependencia declarada, y el mismo barrido posterior no encuentra ninguno ([#1377](https://github.com/HKUDS/Vibe-Trading/pull/1377), cierra [#1376](https://github.com/HKUDS/Vibe-Trading/issues/1376)). La mitad del calentamiento queda abierta y declarada en lugar de arrastrarse en silencio: **52 alphas siguen emitiendo un valor dentro de sus propios `min_warmup_bars` declarados**, y una máscara de calentamiento a nivel de registro también borraría filas de alphas que solo declaran dos o tres barras de más, así que esa mitad necesita una decisión de rumbo y no 52 PR. Segundo caso de la misma clase: pandas mantiene el relleno hacia adelante como valor por defecto de `pct_change()`, así que un cierre ausente se convierte en **una rentabilidad del 0,0 % que nunca ocurrió**. Cuatro PR corrigieron un punto de llamada cada una, y un barrido exhaustivo encontró **24 puntos en 10 archivos**, dos de ellos dentro de los mismos archivos que esas PR estaban editando. Tercer caso: la cadena de cargadores de `futures` nombraba `tushare` y `akshare`, y **ninguno implementaba endpoint de futuros**, así que todos los contratos caían en el endpoint de acciones chinas. AKShare sirve ahora los contratos chinos desde los endpoints diarios de Sina sin clave —con vencimiento y continuo principal, verificados en vivo en las bolsas de Shanghái, financiera china, Guangzhou y Zhengzhou—, mientras que un contrato global devuelve vacío y llega a `local` en lugar de valorarse como una acción ([#1395](https://github.com/HKUDS/Vibe-Trading/issues/1395)). Los propios precios llevan ahora el calibre de ajuste con el que se sirvieron, y una fuente cuyo calibre nunca se midió contra una respuesta real informa `unknown` en vez de suponer uno ([#1317](https://github.com/HKUDS/Vibe-Trading/pull/1317)). **La operativa real falla en cerrado en cinco puntos más**: una lectura de posiciones del bróker que devuelve un error de API, sobres de error llegados a mitad del barrido de parada, el pestillo de liquidación a través de reinicios del runner, las órdenes pendientes de Alpaca recuperadas por identificador de cliente exacto tras un reinicio, y el dimensionado de órdenes limitadas de compra al peor valor entre cotización y límite en ambos transportes. **En el backtest**: las señales de opciones se ejecutan en la barra siguiente y no en aquella de la que se calcularon, las patas vendidas de opciones retienen margen y condicionan las aperturas al poder de compra, la financiación de perpetuos se liquida por amplitud de barra en marcos de 8 h o más, una cesta de reajuste sobrecomprometida se escala en vez de abortar, y una posición suspendida se valora al último cierre negociado y no al coste de entrada. **En el bucle del agente**: una sesión que ya había obtenido estados financieros, flujo de fondos, margen e informes vio esos resultados borrados para liberar contexto, y el registro de deduplicación siguió negándose a volver a pedirlos —**44 reintentos bloqueados en una sola ejecución**— hasta responder «no se obtuvieron datos fundamentales» sobre datos que el modelo ya había recibido; ahora los resultados se concilian por identidad de llamada exacta y el presupuesto de falta de progreso cuenta **observaciones** en lugar de actividad. **Novedades del ciclo:** renta variable británica (LSE `.L`/`.IL`, con el SDRT modelado como un impuesto solo del lado comprador, porque cobrarlo en ambos lados sobrestimaba en la mitad el coste de cada ida y vuelta), **Zerodha Kite Connect** como decimocuarto bróker (limitado a papel y solo lectura, ya que Kite no expone ningún discriminador de operativa real en tiempo de ejecución), una **cartera multibróker de solo lectura** en Web, REST, CLI y herramienta del agente, donde una fuente que falla al actualizarse es un error excluido de los totales y no una caché obsoleta, **quince incorporaciones a la Quant Library** (Heston, paridad de riesgo jerárquica, cópulas, micrLine truncated
|
||||
|
||||
- **2026-09-09** 🛢️ **Un contrato de crudo estadounidense liquidado en yuanes, y una plantilla de estrategia que inventaba un 0% de rentabilidad a partir de un precio ausente**: `CL2412.NYMEX` no coincidía con ningún patrón de símbolo —la forma con vencimiento sin más (`CL2412`) coincidía y la forma con mercado (`ES.CME`) también, pero la manera en que realmente se escribe un contrato no coincidía con ninguna—, así que caía en el valor por defecto de a_share y se ejecutaba con T+1, sin posibilidad de vender en corto y liquidando en CNY. En el lado chino, las propias grafías de intercambio de Tushare tenían el problema simétrico ([#1396](https://github.com/HKUDS/Vibe-Trading/pull/1396), cierra [#1394](https://github.com/HKUDS/Vibe-Trading/issues/1394)); ahora ambas mitades se clasifican bien. Aparte, pandas sigue rellenando hacia adelante por defecto en `pct_change()`, de modo que un cierre ausente se convierte en **una rentabilidad del 0,0% que nunca ocurrió** y la barra siguiente informa el movimiento de dos días como si fuera de uno. Dos PR corrigieron un punto cada uno ([#1397](https://github.com/HKUDS/Vibe-Trading/pull/1397), [#1398](https://github.com/HKUDS/Vibe-Trading/pull/1398)); un barrido exhaustivo de las skills encontró **24 puntos en 10 archivos**, dos de ellos en los mismos archivos que esos PR estaban editando, y una comprobación en todo el repositorio mantiene la clase cerrada. Los backtests de futuros de China también declaran qué productos se valoraron con un valor por defecto genérico en lugar de una entrada de tabla: el margen real de `rb` es 0,10, el mismo número que el valor por defecto, y «consultado» no debe leerse como «supuesto» (cierra [#1393](https://github.com/HKUDS/Vibe-Trading/issues/1393)). También fusionado: purga de etiquetas futuras en el ejemplo de walk-forward de ML ([#1392](https://github.com/HKUDS/Vibe-Trading/pull/1392)), exclusión del TopN de activos sin ninguna observación de factor ([#1399](https://github.com/HKUDS/Vibe-Trading/pull/1399)) y ortogonalización del factor de sentimiento que ya no hace la regresión sobre los ceros que ella misma rellenaba ([#1400](https://github.com/HKUDS/Vibe-Trading/pull/1400)).
|
||||
|
||||
- **2026-09-08** 🧪 **Un alfa que imprimía un número en una barra cuyas entradas estaban vacías, y una búsqueda de oro al contado que respondió con un ETP sueco de Bitcoin**: el contrato del Alpha Zoo preserva los NaN a través del warmup y de los datos ausentes, pero un alfa que se ramifica con una comparación dentro de `np.where` nunca ve un NaN: la comparación es `False`, así que el ternario cae a su constante. Vaciando todas las entradas declaradas en una barra a lo largo de un barrido de 462 alfas, **84 devolvieron igualmente un número**, y como lo que mantiene un hueco fuera del IC es `dropna()`, cada una de esas constantes se consumía como una señal real. La protección vive ahora en el registro y no en cada alfa —la salida se enmascara a NaN allí donde falte una dependencia declarada en esa barra— y el mismo barrido posterior no encuentra **ninguna** ([#1377](https://github.com/HKUDS/Vibe-Trading/pull/1377), cierra [#1376](https://github.com/HKUDS/Vibe-Trading/issues/1376)). Once alfas se corrigieron además para la otra mitad del contrato, la ventana de warmup ([#1379](https://github.com/HKUDS/Vibe-Trading/pull/1379), [#1380](https://github.com/HKUDS/Vibe-Trading/pull/1380), [#1381](https://github.com/HKUDS/Vibe-Trading/pull/1381), [#1382](https://github.com/HKUDS/Vibe-Trading/pull/1382), [#1383](https://github.com/HKUDS/Vibe-Trading/pull/1383)); medir esa mitad del mismo modo deja **52 alfas que siguen emitiendo un valor dentro de sus propios `min_warmup_bars` declarados**. Una máscara de warmup a nivel de registro también vaciaría filas de alfas cuya declaración es simplemente conservadora, así que esa mitad queda abierta y declarada aquí en lugar de arrastrarse en silencio. Aparte, `search_symbol("XAUUSD")` devolvía exactamente un candidato —`VALOUR-BTC-0-SEK.ST`, un ETP sueco de Bitcoin— que fijaba la identidad del instrumento para toda la ejecución; una consulta de par de metal o de divisas es ahora una afirmación exacta de instrumento y conserva solo los candidatos que nombran las mismas dos patas, en cualquier grafía ([#1282](https://github.com/HKUDS/Vibe-Trading/pull/1282)). **Corregido:** una fecha de anuncio no lleva hora, de modo que en un marco intradía una presentación quedaba visible desde la primera barra de su propio día de anuncio: una sesión entera de anticipación. Los marcos inferiores al diario se rechazan ahora, con `fundamental_subdaily="next_day"` como aceptación explícita (cierra [#1387](https://github.com/HKUDS/Vibe-Trading/issues/1387)). Una afirmación métrica escrita como tabla de encabezado genérico `| Métrica | Valor |` esquivaba la verificación de análisis que rechaza esa misma afirmación en prosa ([#1375](https://github.com/HKUDS/Vibe-Trading/pull/1375)), mientras que el error especular rechazaba una palabra de precio usada como variable de fórmula: `close/SMA50 > 1` se leía como un precio afirmado ([#1378](https://github.com/HKUDS/Vibe-Trading/pull/1378), cierra [#1354](https://github.com/HKUDS/Vibe-Trading/issues/1354)). Un código de bróker pegado (`HK.00700`, `US.AAPL`, `SH.600519`) no se reconocía como símbolo en absoluto, así que toda herramienta de mercado respondía `identity_required` ([#1384](https://github.com/HKUDS/Vibe-Trading/pull/1384)). Las tres CDF de cópulas arquimedianas devolvían valores extremos erróneos con dependencia fuerte —Clayton `0.0`, Gumbel `1.0`, Frank `inf`— y ahora se calculan en espacio logarítmico, verificadas contra una referencia de 2500 dígitos en θ ∈ [-5000, 5000] ([#1386](https://github.com/HKUDS/Vibe-Trading/pull/1386), cierra [#1385](https://github.com/HKUDS/Vibe-Trading/issues/1385)). Una orden MT5 por encima del volumen máximo del símbolo se recortaba en silencio y se enviaba, una orden limitada de eToro sin precio límite quedaba sin activarse mientras figuraba como aceptada, las velas de futu heredaban un criterio de ajuste no declarado, y `BTCUSDT` se enrutaba por las reglas de las acciones A: T+1 y prohibición de cortos, sobre un perpetuo ([#1388](https://github.com/HKUDS/Vibe-Trading/pull/1388)). ¡Gracias [@cgycorey](https://github.com/cgycorey), [@Shizoqua](https://github.com/Shizoqua), [@he-yufeng](https://github.com/he-yufeng), [@Robin1987China](https://github.com/Robin1987China), [@laiyierjiangsu](https://github.com/laiyierjiangsu), [@aminak58](https://github.com/aminak58) y [@nandofmike](https://github.com/nandofmike)!
|
||||
|
||||
- **2026-09-07** 🪙 **Una orden de 50 onzas de oro redondeada a nada, y un futuro de divisa valorado a 1/2500 del tamaño de su contrato**: en un backtest multimercado el motor compuesto despacha cada símbolo a través de un único submotor compartido por mercado, pero solo `apply_slippage` refrescaba el símbolo activo de ese submotor —así que `round_size` y `calc_commission` usaban el símbolo que lo hubiera sincronizado por última vez. Una posición de 50 oz de oro dimensionada con el microlote de 1.000 unidades del FX se redondeaba a **0**, a los futuros de oro se les cobraba la comisión por tasa del futuro sobre índice (6,90) en lugar de su propia tarifa plana (20,00), y el swap usaba el lote estándar de 100.000 unidades en vez del lote metálico de 100 oz ([#1370](https://github.com/HKUDS/Vibe-Trading/pull/1370)). Por separado, `_extract_product` no sabía leer un símbolo cuyo código de producto contiene un dígito o termina en una letra que también es código de mes: `6EZ4`, `6JH25`, `M2K`, `MYM2503` y `FESX2503` caían todos al multiplicador por defecto de 50 —para `6E` la cifra real es 125.000 ([#1369](https://github.com/HKUDS/Vibe-Trading/pull/1369)). Ahora los símbolos se resuelven contra la propia tabla de multiplicadores, con la coincidencia más larga primero, lo que cubre también las formas con vencimiento (`M2KZ4`) y las colisiones de prefijo (`SILZ4` frente a `SI`). **Corregido:** cuatro factores del Alpha Zoo imprimían un ±1 o un 0 fijos durante una suspensión de cotización y dentro de su propio periodo de calentamiento declarado, porque una comparación con NaN da `False` y no NaN, y el ternario caía a su constante. `min_warmup_bars` es metadato que nadie recorta, y lo que mantiene un hueco fuera de un IC es `dropna()` —de modo que esas constantes se consumían como señales reales ([#1371](https://github.com/HKUDS/Vibe-Trading/pull/1371), [#1372](https://github.com/HKUDS/Vibe-Trading/pull/1372), [#1373](https://github.com/HKUDS/Vibe-Trading/pull/1373), [#1374](https://github.com/HKUDS/Vibe-Trading/pull/1374)). Medir todo el zoo con el mismo criterio deja **otros 82 alfas con la misma forma**; en vez de un PR por factor, eso se sigue ahora como una protección a nivel de registro en [#1376](https://github.com/HKUDS/Vibe-Trading/issues/1376). La evidencia de strategy-discovery también resolvía el tamaño de posición una sola vez para toda la ejecución en lugar de por régimen, y una única celda de benchmark ilegible podía borrar todas las filas de evidencia de esa ejecución ([#1368](https://github.com/HKUDS/Vibe-Trading/pull/1368)). **Nuevo:** una ejecución que sigue lanzando llamadas a herramientas sin ganar información ahora se detiene tras ocho iteraciones con una petición de recuperación visible, en lugar de gastar todo su presupuesto en descubrir rutas —el caso reportado consumió unas 35 iteraciones adivinando las mismas rutas rechazadas. Una llamada idéntica se rechaza a partir de su **segundo** fallo, no del primero, así que un reintento honesto tras un límite de tasa o un timeout sí se ejecuta ([#1363](https://github.com/HKUDS/Vibe-Trading/pull/1363), cierra [#1353](https://github.com/HKUDS/Vibe-Trading/issues/1353)). ¡Gracias [@Shizoqua](https://github.com/Shizoqua), [@be-student](https://github.com/be-student) y [@nandofmike](https://github.com/nandofmike)!
|
||||
|
||||
<details>
|
||||
<summary>Noticias anteriores</summary>
|
||||
|
||||
- **2026-09-07** 🪙 **Una orden de 50 onzas de oro redondeada a nada, y un futuro de divisa valorado a 1/2500 del tamaño de su contrato**: en un backtest multimercado el motor compuesto despacha cada símbolo a través de un único submotor compartido por mercado, pero solo `apply_slippage` refrescaba el símbolo activo de ese submotor —así que `round_size` y `calc_commission` usaban el símbolo que lo hubiera sincronizado por última vez. Una posición de 50 oz de oro dimensionada con el microlote de 1.000 unidades del FX se redondeaba a **0**, a los futuros de oro se les cobraba la comisión por tasa del futuro sobre índice (6,90) en lugar de su propia tarifa plana (20,00), y el swap usaba el lote estándar de 100.000 unidades en vez del lote metálico de 100 oz ([#1370](https://github.com/HKUDS/Vibe-Trading/pull/1370)). Por separado, `_extract_product` no sabía leer un símbolo cuyo código de producto contiene un dígito o termina en una letra que también es código de mes: `6EZ4`, `6JH25`, `M2K`, `MYM2503` y `FESX2503` caían todos al multiplicador por defecto de 50 —para `6E` la cifra real es 125.000 ([#1369](https://github.com/HKUDS/Vibe-Trading/pull/1369)). Ahora los símbolos se resuelven contra la propia tabla de multiplicadores, con la coincidencia más larga primero, lo que cubre también las formas con vencimiento (`M2KZ4`) y las colisiones de prefijo (`SILZ4` frente a `SI`). **Corregido:** cuatro factores del Alpha Zoo imprimían un ±1 o un 0 fijos durante una suspensión de cotización y dentro de su propio periodo de calentamiento declarado, porque una comparación con NaN da `False` y no NaN, y el ternario caía a su constante. `min_warmup_bars` es metadato que nadie recorta, y lo que mantiene un hueco fuera de un IC es `dropna()` —de modo que esas constantes se consumían como señales reales ([#1371](https://github.com/HKUDS/Vibe-Trading/pull/1371), [#1372](https://github.com/HKUDS/Vibe-Trading/pull/1372), [#1373](https://github.com/HKUDS/Vibe-Trading/pull/1373), [#1374](https://github.com/HKUDS/Vibe-Trading/pull/1374)). Medir todo el zoo con el mismo criterio deja **otros 82 alfas con la misma forma**; en vez de un PR por factor, eso se sigue ahora como una protección a nivel de registro en [#1376](https://github.com/HKUDS/Vibe-Trading/issues/1376). La evidencia de strategy-discovery también resolvía el tamaño de posición una sola vez para toda la ejecución en lugar de por régimen, y una única celda de benchmark ilegible podía borrar todas las filas de evidencia de esa ejecución ([#1368](https://github.com/HKUDS/Vibe-Trading/pull/1368)). **Nuevo:** una ejecución que sigue lanzando llamadas a herramientas sin ganar información ahora se detiene tras ocho iteraciones con una petición de recuperación visible, en lugar de gastar todo su presupuesto en descubrir rutas —el caso reportado consumió unas 35 iteraciones adivinando las mismas rutas rechazadas. Una llamada idéntica se rechaza a partir de su **segundo** fallo, no del primero, así que un reintento honesto tras un límite de tasa o un timeout sí se ejecuta ([#1363](https://github.com/HKUDS/Vibe-Trading/pull/1363), cierra [#1353](https://github.com/HKUDS/Vibe-Trading/issues/1353)). ¡Gracias [@Shizoqua](https://github.com/Shizoqua), [@be-student](https://github.com/be-student) y [@nandofmike](https://github.com/nandofmike)!
|
||||
- **2026-09-06** 🛡️ **Una orden limitada de compra dimensionada a un precio al que nunca se ejecutaría, y una auditoría que devolvió PASS sin haber verificado nada**: la puerta de órdenes MCP valoraba una orden por cantidad solo con la cotización en vivo, así que un límite al doble del mercado superaba un tope dimensionado sobre la cotización y podía ejecutarse al doble del nocional autorizado. Ahora se dimensiona con el peor valor entre cotización y límite —la regla que la vía del SDK directo ya usaba— y un precio límite que no se puede interpretar se deniega en vez de dejarse pasar ([#1361](https://github.com/HKUDS/Vibe-Trading/pull/1361)). El auditor de informes omitía todo punto sin valor obtenido y luego devolvía **PASS** porque nada había fallado, certificando un informe sin ninguna evidencia; cero puntos verificados ahora falla en cerrado ([#1362](https://github.com/HKUDS/Vibe-Trading/pull/1362)). **Corregido:** las métricas sobrevivían a un fallo de la herramienta de análisis, y la nueva exención para cifras atribuidas —correcta para el Sharpe de un artículo, incorrecta para un precio que esta ejecución debe observar— habría dejado pasar «Los analistas dicen que TSLA.US se negoció por última vez a 412,35 USD.» sin ninguna llamada a herramienta ([#1338](https://github.com/HKUDS/Vibe-Trading/pull/1338), cierra [#1336](https://github.com/HKUDS/Vibe-Trading/issues/1336)); una fila de dividendo en efectivo tumbaba el análisis completo del diario de operaciones ([#1356](https://github.com/HKUDS/Vibe-Trading/pull/1356)); la compactación reabría el registro de deduplicación por nombre de herramienta, así que borrar una variante de argumentos dejaba el resto bloqueado ([#1358](https://github.com/HKUDS/Vibe-Trading/pull/1358)); el libro de cumplimiento encadenado por hash rechazaba su primera anotación en Windows ([#1261](https://github.com/HKUDS/Vibe-Trading/pull/1261)). **Nuevo:** Zerodha Kite Connect eleva a 14 los brókeres —solo lectura y papel, porque Kite no expone un discriminador paper/live en tiempo de ejecución ([#1193](https://github.com/HKUDS/Vibe-Trading/pull/1193))—; Nobitex y Wallex añaden pares en tomán iraní hasta 27 fuentes de datos, y ninguno puede degradarse en silencio a un mercado cotizado en dólares ([#1263](https://github.com/HKUDS/Vibe-Trading/pull/1263)); las llamadas nativas a Anthropic cachean el prefijo estático de herramientas y sistema en lugar de reenviarlo a precio completo cada turno ([#1366](https://github.com/HKUDS/Vibe-Trading/pull/1366)). ¡Gracias [@cgycorey](https://github.com/cgycorey), [@ashutoshsinghpr7](https://github.com/ashutoshsinghpr7), [@saju01](https://github.com/saju01), [@he-yufeng](https://github.com/he-yufeng), [@Emad211](https://github.com/Emad211), [@averatec0773](https://github.com/averatec0773), [@birdxs](https://github.com/birdxs) y [@AirHua-byte](https://github.com/AirHua-byte)!
|
||||
- **2026-09-05** 🔓 **Un precio inventado por el modelo pasaba el control en inglés pero se detectaba en chino, y un agente que no podía releer datos que ya había obtenido**: la verificación de fundamentación coincidía con `close` pero no con **`closed`**, así que `The stock closed at 412.35.` sin ninguna llamada a herramienta pasaba de largo, mientras que la misma afirmación inventada en chino (`该股收盘 412.35。`) sí se rechazaba. Para `last traded at` y `quoted at` no existía regla alguna, y el chino tenía el agujero simétrico: `成交价` / `最新价` / `股价` / `收报` se escapaban todos. Ahora ambos vocabularios están completos, las formas inglesas exigen un "at" a continuación para no confundir volumen ni operaciones corporativas, y una nueva batería comprueba que los dos idiomas lleguen al **mismo** veredicto en cada caso en lugar de verificarlos por separado. Aparte: una sesión que había obtenido correctamente datos de estados financieros, flujo de fondos, margen e informes vio esos resultados borrados para liberar contexto, y el registro de deduplicación siguió negándose a volver a pedirlos —44 reintentos bloqueados en una sola ejecución— hasta responder "no se obtuvieron datos fundamentales" sobre datos que el modelo ya había recibido. Ahora borrar un resultado reabre esa herramienta, el registro se indexa por argumentos y no por nombre de herramienta, y el presupuesto de tokens contabiliza los argumentos de las llamadas en vez de valorar una carga de 100 KB en diez tokens ([#1349](https://github.com/HKUDS/Vibe-Trading/pull/1349), [#1341](https://github.com/HKUDS/Vibe-Trading/pull/1341), [#1352](https://github.com/HKUDS/Vibe-Trading/pull/1352), cierra [#1343](https://github.com/HKUDS/Vibe-Trading/issues/1343)). **Corregido:** en aarch64, cada backtest lanzado desde la interfaz web terminaba en fallo de segmentación: los límites de recursos del entorno aislado ejecutaban Python en el proceso hijo bifurcado de un servidor multihilo, comportamiento indefinido según POSIX; ahora se aplican después de exec (cierra [#1355](https://github.com/HKUDS/Vibe-Trading/issues/1355)). `GC=F` y `XAUUSD` se clasificaban como acciones A de China ([#1280](https://github.com/HKUDS/Vibe-Trading/pull/1280)); `BRK.B.US` y otras clases de acción con punto devolvían datos vacíos ([#1351](https://github.com/HKUDS/Vibe-Trading/pull/1351)); una cartera totalmente invertida abortaba el reajuste por exceso de comisión en lugar de escalarlo ([#1344](https://github.com/HKUDS/Vibe-Trading/pull/1344), cierra [#1274](https://github.com/HKUDS/Vibe-Trading/issues/1274)); las variaciones en puntos porcentuales (`3.6pp`, `3.6 个百分点`, `250 基点`) se leían como precios cotizados ([#1346](https://github.com/HKUDS/Vibe-Trading/pull/1346)); los pares cripto unidos como `BTCUSDT` no se reconocían mientras el platino al contado se resolvía como un par cripto inexistente ([#1265](https://github.com/HKUDS/Vibe-Trading/pull/1265)); el historial del almacén de estrategias volvía del más antiguo al más reciente cuando coincidían las marcas de tiempo ([#1347](https://github.com/HKUDS/Vibe-Trading/pull/1347)); el adaptador de Codex descartaba el modelo que informa el proveedor ([#1348](https://github.com/HKUDS/Vibe-Trading/pull/1348)). **Nuevo:** el contexto de mercado indicado antes en la conversación puede acotar la resolución de símbolos, tras `VIBE_CONTEXTUAL_IDENTITY_CONSTRAINTS` ([#1269](https://github.com/HKUDS/Vibe-Trading/pull/1269)); los trabajadores del comité de inversión reciben el panel de datos fundamentales que sus instrucciones ya daban por hecho ([#1345](https://github.com/HKUDS/Vibe-Trading/pull/1345)); calibración determinista de tolerancia USD-M a partir de comparaciones registradas ([#1248](https://github.com/HKUDS/Vibe-Trading/pull/1248)). ¡Gracias [@nandofmike](https://github.com/nandofmike), [@atomfive](https://github.com/atomfive), [@thisisjun786](https://github.com/thisisjun786), [@cgycorey](https://github.com/cgycorey), [@saju01](https://github.com/saju01), [@he-yufeng](https://github.com/he-yufeng), [@aminak58](https://github.com/aminak58), [@AirHua-byte](https://github.com/AirHua-byte), [@lorenzozanee](https://github.com/lorenzozanee), [@ethanstoner](https://github.com/ethanstoner), [@Shizoqua](https://github.com/Shizoqua)!
|
||||
- **2026-09-04** 🩺 **Todas las ejecuciones con Claude 5 fallaban en la primera petición, y una posición suspendida se valoraba de nuevo a lo que pagaste por ella**: con el SDK actual de Anthropic, `langchain-anthropic` traslada `temperature` a `extra_body`, y nuestra autorreparación solo quitaba la clave de primer nivel, así que el reintento reenviaba exactamente el campo que la API acababa de rechazar y toda ejecución con `claude-sonnet-5` / `claude-opus-5` moría en la primera llamada ([#1330](https://github.com/HKUDS/Vibe-Trading/pull/1330), cierra [#1329](https://github.com/HKUDS/Vibe-Trading/issues/1329)). En los backtests, una posición mantenida más allá del límite de relleno hacia adelante se revaloraba a su precio de entrada: la curva de capital mostraba una caída sin ningún evento de mercado detrás, y el dimensionado del rebalanceo trabajaba sobre esa marca fantasma. Ahora una suspensión de cualquier duración se valora al último cierre negociado, mientras que las ejecuciones de órdenes siguen rechazando un precio obsoleto ([#1332](https://github.com/HKUDS/Vibe-Trading/pull/1332), cierra [#1318](https://github.com/HKUDS/Vibe-Trading/issues/1318)). **Corregido:** tres formas en que un ajuste en el momento de confirmar podía ampliar el mandato que aprobaste — un número escrito como texto se saltaba la comprobación numérica, `True` pasaba como número y la lista blanca de instrumentos no tenía comparación alguna. Además, solo efectivo (cash-only) es el suelo del eje de apalancamiento y no un tipo inválido, así que el mandato más conservador sigue siendo confirmable ([#1285](https://github.com/HKUDS/Vibe-Trading/pull/1285)). El reloj de tiempo transcurrido sobrevive a cambiar de página, recargar y reabrir una sesión desde el historial ([#1340](https://github.com/HKUDS/Vibe-Trading/pull/1340), cierra [#1339](https://github.com/HKUDS/Vibe-Trading/issues/1339)), y se han parcheado los siete avisos de seguridad npm abiertos en los archivos de bloqueo del frontend y del escritorio. ¡Gracias [@averatec0773](https://github.com/averatec0773), [@he-yufeng](https://github.com/he-yufeng) y [@Jackzigen](https://github.com/Jackzigen)!
|
||||
|
||||
+3
-2
@@ -52,15 +52,16 @@
|
||||
|
||||
> ⚠️ **セキュリティ警告:** Xアカウント `VibeTrading_HKU`、Virtualsプロジェクト `101845`、およびトークンコントラクト `0x640BDBF77b6447E8b7DB7894cED84BD1c40571f4` は、いずれもVibe-Trading公式のものではありません。Vibe-Tradingはこれまで、いかなるトークンやミームコインも発行・公認していません。購入、ウォレットの接続、署名は行わないでください。[詳細](SECURITY.md#official-channels--impersonation)
|
||||
|
||||
- **2026-09-09** 🚀 **v0.1.15 リリース** ([リリースノート](https://github.com/HKUDS/Vibe-Trading/releases/tag/v0.1.15)、`pip install -U vibe-trading-ai`):0.1.14 以降 551 コミット / 162 マージ済み PR、35 名のコントリビューターによるものです。**今回のテーマは「データが自分の素性を明示すること」** ——そして最大の修正 3 件は、実は同じバグが装いを変えたものでした。欠損値をもっともらしい値でそっと置き換えるデフォルトは、下流から見れば本物の観測と区別がつきません。Alpha Zoo の NaN 契約は個々の alpha から registry へ移りました。`np.where` の比較で分岐する alpha は NaN を見ることがなく(比較結果が `False` になるため)、あるバーの宣言済み入力をすべて空にしても **462 個中 84 個の alpha が数値を返し続けました**。`dropna()` こそが欠損を IC から排除する仕組みなので、それらの定数は本物のシグナルとして消費されていたことになります。現在は宣言された依存が欠けているバーで registry が出力を NaN にマスクし、同じ掃引後には一つも残りません([#1377](https://github.com/HKUDS/Vibe-Trading/pull/1377)、[#1376](https://github.com/HKUDS/Vibe-Trading/issues/1376) をクローズ)。ウォームアップ側は黙って抱え込むのではなく、開いたまま明示します。**52 個の alpha が自身の宣言した `min_warmup_bars` の内側で値を出しており**、registry レベルのマスクは窓を 2〜3 本多めに宣言しているだけの alpha の行まで消してしまうため、この半分は 52 本の PR ではなく方針判断を要します。同じ種類の第二例:pandas は今も `pct_change()` を前方補完既定のままなので、欠けた終値が**実際には起きていない 0.0% のリターン**になります。4 本の PR がそれぞれ 1 箇所を修正し、網羅的な掃引で **10 ファイル 24 箇所**が見つかりました——うち 2 箇所は、その PR 自身が編集していたファイルの中でした。第三例:`futures` のローダーチェーンは `tushare` と `akshare` を名指ししながら、**どちらも先物エンドポイントを実装しておらず**、すべての限月が A 株の株式エンドポイントに落ちていました。AKShare はトークン不要の Sina 日足エンドポイント経由で中国の限月・主力連続を提供し(上海・中金・広州・鄭州の 4 取引所で実測)、グローバル契約は空を返して `local` に到達します——株式として価格が付くことはもうありません([#1395](https://github.com/HKUDS/Vibe-Trading/issues/1395))。価格自体も、どの調整キャリバーで提供されたかを刻印するようになり、実際のペイロードに対して計測されたことのないソースは推測せず `unknown` と報告します([#1317](https://github.com/HKUDS/Vibe-Trading/pull/1317))。**ライブ取引のフェイルクローズを 5 箇所追加**:ブローカーのポジション取得が API エラーを返した場合、halt sweep の途中でエラーエンベロープを受け取った場合、runner 再起動をまたぐ flatten ラッチ、再起動をまたいで正確な client ID で回収される未解決の Alpaca 注文、そして両トランスポートで「気配値と指値の悪い方」に基づく買い指値のサイジング。**バックテスト側**:オプションのシグナルはそれを算出したバーではなく次のバーで約定し、オプションの売り建て玉は証拠金を拘束して買付余力で新規建てを制限、無期限先物の資金調達は 8 時間以上の足でバー幅に応じて決済、過大なリバランスバスケットは中止ではなく比例縮小、売買停止銘柄は取得原価ではなく最終約定値で評価されます。**エージェントループ**:財務・資金フロー・信用・レポートの各データを取得済みだったセッションで、コンテキスト確保のためそれらの結果が消去された後も重複排除台帳が再取得を拒み続け——**1 回の実行で 44 回ブロック**、すでに受け取っていたデータについて「基礎データを取得できませんでした」と答えていました。現在は正確な呼び出し識別子で結果を突き合わせ、無進捗バジェットは活動量ではなく**観測**を数えます。**今回の新機能:** 英国株(LSE `.L`/`.IL`、SDRT は買い側のみの税としてモデル化。両側に課すと往復コストを 2 倍に見積もってしまいます)、14 番目のブローカーとしての **Zerodha Kite Connect**(Kite は実行時のライブ判別子を公開しないため、Line truncated
|
||||
|
||||
- **2026-09-09** 🛢️ **人民元で決済された米国原油の限月、そして欠損値から 0% のリターンを作り出していた戦略テンプレート**: `CL2412.NYMEX` はどのシンボルパターンにも一致しませんでした——限月付きの素の形(`CL2412`)は一致し、取引所付きの形(`ES.CME`)も一致するのに、実際に契約が書かれる形だけがどちらにも一致しない——結果として a_share の既定値に落ち、T+1・空売り不可・CNY 決済で実行されていました。中国側では Tushare 自身の取引所表記が同じ問題の鏡像でした([#1396](https://github.com/HKUDS/Vibe-Trading/pull/1396)、[#1394](https://github.com/HKUDS/Vibe-Trading/issues/1394) をクローズ)。両側とも正しく分類されます。別件として、pandas の `pct_change()` は今も既定で前方補完するため、欠損した終値が**実際には起きていない 0.0% のリターン**になり、次の bar が 2 日分の値動きを 1 日分として報告します。2 つの PR がそれぞれ 1 箇所を修正しましたが([#1397](https://github.com/HKUDS/Vibe-Trading/pull/1397)、[#1398](https://github.com/HKUDS/Vibe-Trading/pull/1398))、skills を網羅的に調べると **10 ファイル 24 箇所**あり、うち 2 箇所はその PR が編集中のファイル内でした。リポジトリ全体のガードでこの種類を閉じます。中国先物のバックテストは、どの銘柄がテーブル参照ではなく汎用の既定値で価格付けされたかを申告するようになりました——`rb` の実際の証拠金率は 0.10 で既定値と同じ数値であり、「参照した」が「仮定した」と同じに読めてはなりません([#1393](https://github.com/HKUDS/Vibe-Trading/issues/1393) をクローズ)。併せてマージ: ML ウォークフォワード例での将来ラベルの除去([#1392](https://github.com/HKUDS/Vibe-Trading/pull/1392))、ファクター観測が皆無の銘柄を TopN から除外([#1399](https://github.com/HKUDS/Vibe-Trading/pull/1399))、センチメントファクターの直交化が自ら埋めたゼロに回帰しないように([#1400](https://github.com/HKUDS/Vibe-Trading/pull/1400))。
|
||||
|
||||
- **2026-09-08** 🧪 **入力が欠けている bar でも数値を出力していたアルファと、スウェーデンのビットコイン ETP を返した現物金の検索**: Alpha Zoo の契約は warmup と欠損データを NaN のまま通すことですが、`np.where` の比較で分岐するアルファは NaN を見ることがありません —— 比較結果は `False` になり、三項演算子はそのまま定数の側に落ちます。462 本のアルファすべてについて、ある bar で宣言済み入力をすべて空にして測ったところ、**84 本が依然として数値を返しました**。欠損を IC から取り除いているのは `dropna()` なので、それらの定数は実シグナルとして消費されていました。ガードは各アルファではなく registry に置かれ —— その bar で宣言済み依存が欠けていれば出力を NaN にマスクします —— 修正後に同じ測定を行うと**一本も検出されません**([#1377](https://github.com/HKUDS/Vibe-Trading/pull/1377)、[#1376](https://github.com/HKUDS/Vibe-Trading/issues/1376) をクローズ)。契約のもう半分である warmup 期間についても 11 本を修正しました([#1379](https://github.com/HKUDS/Vibe-Trading/pull/1379)、[#1380](https://github.com/HKUDS/Vibe-Trading/pull/1380)、[#1381](https://github.com/HKUDS/Vibe-Trading/pull/1381)、[#1382](https://github.com/HKUDS/Vibe-Trading/pull/1382)、[#1383](https://github.com/HKUDS/Vibe-Trading/pull/1383))。同じ方法でその半分を測ると、**52 本が自ら宣言した `min_warmup_bars` の内側で値を出しています**。registry 段階で warmup をマスクすると、宣言が単に保守的なだけのアルファの行まで空になるため、この半分は未対応のまま、黙って抱え込まずにここに明記します。別件として、`search_symbol("XAUUSD")` が返した唯一の候補は `VALOUR-BTC-0-SEK.ST`(スウェーデンのビットコイン ETP)で、それがランの銘柄同一性を確定させていました。金属・FX ペアの問い合わせは正確な銘柄の主張として扱われ、表記が違っても同じ 2 本の脚を指す候補だけを残します([#1282](https://github.com/HKUDS/Vibe-Trading/pull/1282))。**修正:** 開示日には時刻がないため、日中足では開示日当日の最初の bar から財務データが見えていました —— まる一セッション分の先読みです。サブ日次のフレームは拒否され、`fundamental_subdaily="next_day"` が明示的なオプトインになります([#1387](https://github.com/HKUDS/Vibe-Trading/issues/1387) をクローズ)。汎用ヘッダーの `| 指標 | 数値 |` テーブルに整形された指標の主張が、同じ主張を散文では拒否する分析ゲートをすり抜けていました([#1375](https://github.com/HKUDS/Vibe-Trading/pull/1375))。逆向きの誤りもあり、数式の変数として使われた価格語 —— `close/SMA50 > 1` —— が主張された価格として読まれていました([#1378](https://github.com/HKUDS/Vibe-Trading/pull/1378)、[#1354](https://github.com/HKUDS/Vibe-Trading/issues/1354) をクローズ)。貼り付けられた証券会社形式のコード(`HK.00700`、`US.AAPL`、`SH.600519`)はそもそも銘柄として認識されず、すべての market ツールが `identity_required` を返していました([#1384](https://github.com/HKUDS/Vibe-Trading/pull/1384))。3 つの Archimedean copula の CDF は強い依存パラメータの下で誤った極値 —— Clayton `0.0`、Gumbel `1.0`、Frank `inf` —— を返していましたが、対数空間で計算するようになり、2500 桁精度の参照値に対して θ ∈ [-5000, 5000] で検証済みです([#1386](https://github.com/HKUDS/Vibe-Trading/pull/1386)、[#1385](https://github.com/HKUDS/Vibe-Trading/issues/1385) をクローズ)。銘柄の数量上限を超える MT5 注文は黙って上限に切り詰められて送信され、指値のない eToro の指値注文は約定条件を持たないまま受理として表示され、futu の K 線は宣言のない調整基準を引き継ぎ、`BTCUSDT` は A 株ルート —— 無期限契約に T+1 と空売り禁止 —— で処理されていました([#1388](https://github.com/HKUDS/Vibe-Trading/pull/1388))。[@cgycorey](https://github.com/cgycorey)、[@Shizoqua](https://github.com/Shizoqua)、[@he-yufeng](https://github.com/he-yufeng)、[@Robin1987China](https://github.com/Robin1987China)、[@laiyierjiangsu](https://github.com/laiyierjiangsu)、[@aminak58](https://github.com/aminak58)、[@nandofmike](https://github.com/nandofmike) に感謝します!
|
||||
|
||||
- **2026-09-07** 🪙 **50 オンスの金注文がゼロに丸められ、通貨先物が契約サイズの 1/2500 で評価されていました**:クロスマーケットのバックテストでは、複合エンジンが市場ごとに 1 つの共有サブエンジンへ全銘柄をディスパッチしますが、そのサブエンジン自身のアクティブ銘柄を更新していたのは `apply_slippage` だけでした。そのため `round_size` と `calc_commission` は最後に同期された銘柄を使っていました。50 オンスの金建玉は FX の 1,000 単位マイクロロットで丸められて **0** になり、金先物には自らの定額(20.00)ではなく株価指数先物の料率型手数料(6.90)が課され、スワップは 100 オンスの金属ロットではなく 100,000 単位の標準ロットで計算されていました([#1370](https://github.com/HKUDS/Vibe-Trading/pull/1370))。また `_extract_product` は、商品コードに数字を含むもの、または末尾の文字が限月コードと重なるものを読めませんでした。`6EZ4`、`6JH25`、`M2K`、`MYM2503`、`FESX2503` はすべて既定の乗数 50 に落ちていました——`6E` の正しい値は 125,000 です([#1369](https://github.com/HKUDS/Vibe-Trading/pull/1369))。現在は乗数テーブル自体に対して最長一致で解決し、限月付きの形式(`M2KZ4`)や接頭辞の衝突(`SILZ4` と `SI`)も同時に扱えます。**修正:** Alpha Zoo の 4 つのファクターが、売買停止日と自ら宣言したウォームアップ期間中に固定値の ±1 や 0 を出力していました。NaN の比較は NaN ではなく `False` になるため、三項分岐が定数側へ落ちていたのです。`min_warmup_bars` は何も切り詰めないメタデータであり、欠損を IC から除くのは `dropna()` です——つまりそれらの定数は本物のシグナルとして消費されていました([#1371](https://github.com/HKUDS/Vibe-Trading/pull/1371)、[#1372](https://github.com/HKUDS/Vibe-Trading/pull/1372)、[#1373](https://github.com/HKUDS/Vibe-Trading/pull/1373)、[#1374](https://github.com/HKUDS/Vibe-Trading/pull/1374))。同じ基準でゾー全体を計測すると、**同じ形の α があと 82 個**あります。1 ファクター 1 PR ではなく、レジストリ層のガードとして [#1376](https://github.com/HKUDS/Vibe-Trading/issues/1376) で追跡します。strategy-discovery の evidence も、レジームごとではなくラン全体で 1 度だけポジションサイズを解決しており、解析できないベンチマーク値が 1 セルあるだけでそのランの evidence 行がすべて消え得ました([#1368](https://github.com/HKUDS/Vibe-Trading/pull/1368))。**新規:** 新しい情報を得られないままツール呼び出しを続けるランは、予算全部をパス探索に費やす代わりに、8 反復で可視的な復旧要求を出して停止します——報告された事例では同じ拒否パスを約 35 反復にわたり推測し続けていました。同一の呼び出しは 1 回目ではなく**2 回目**の失敗から拒否されるため、レート制限やタイムアウト後の正当な 1 回の再試行は実行されます([#1363](https://github.com/HKUDS/Vibe-Trading/pull/1363)、[#1353](https://github.com/HKUDS/Vibe-Trading/issues/1353) をクローズ)。[@Shizoqua](https://github.com/Shizoqua)、[@be-student](https://github.com/be-student)、[@nandofmike](https://github.com/nandofmike) に感謝します!
|
||||
|
||||
<details>
|
||||
<summary>過去のニュース</summary>
|
||||
|
||||
- **2026-09-07** 🪙 **50 オンスの金注文がゼロに丸められ、通貨先物が契約サイズの 1/2500 で評価されていました**:クロスマーケットのバックテストでは、複合エンジンが市場ごとに 1 つの共有サブエンジンへ全銘柄をディスパッチしますが、そのサブエンジン自身のアクティブ銘柄を更新していたのは `apply_slippage` だけでした。そのため `round_size` と `calc_commission` は最後に同期された銘柄を使っていました。50 オンスの金建玉は FX の 1,000 単位マイクロロットで丸められて **0** になり、金先物には自らの定額(20.00)ではなく株価指数先物の料率型手数料(6.90)が課され、スワップは 100 オンスの金属ロットではなく 100,000 単位の標準ロットで計算されていました([#1370](https://github.com/HKUDS/Vibe-Trading/pull/1370))。また `_extract_product` は、商品コードに数字を含むもの、または末尾の文字が限月コードと重なるものを読めませんでした。`6EZ4`、`6JH25`、`M2K`、`MYM2503`、`FESX2503` はすべて既定の乗数 50 に落ちていました——`6E` の正しい値は 125,000 です([#1369](https://github.com/HKUDS/Vibe-Trading/pull/1369))。現在は乗数テーブル自体に対して最長一致で解決し、限月付きの形式(`M2KZ4`)や接頭辞の衝突(`SILZ4` と `SI`)も同時に扱えます。**修正:** Alpha Zoo の 4 つのファクターが、売買停止日と自ら宣言したウォームアップ期間中に固定値の ±1 や 0 を出力していました。NaN の比較は NaN ではなく `False` になるため、三項分岐が定数側へ落ちていたのです。`min_warmup_bars` は何も切り詰めないメタデータであり、欠損を IC から除くのは `dropna()` です——つまりそれらの定数は本物のシグナルとして消費されていました([#1371](https://github.com/HKUDS/Vibe-Trading/pull/1371)、[#1372](https://github.com/HKUDS/Vibe-Trading/pull/1372)、[#1373](https://github.com/HKUDS/Vibe-Trading/pull/1373)、[#1374](https://github.com/HKUDS/Vibe-Trading/pull/1374))。同じ基準でゾー全体を計測すると、**同じ形の α があと 82 個**あります。1 ファクター 1 PR ではなく、レジストリ層のガードとして [#1376](https://github.com/HKUDS/Vibe-Trading/issues/1376) で追跡します。strategy-discovery の evidence も、レジームごとではなくラン全体で 1 度だけポジションサイズを解決しており、解析できないベンチマーク値が 1 セルあるだけでそのランの evidence 行がすべて消え得ました([#1368](https://github.com/HKUDS/Vibe-Trading/pull/1368))。**新規:** 新しい情報を得られないままツール呼び出しを続けるランは、予算全部をパス探索に費やす代わりに、8 反復で可視的な復旧要求を出して停止します——報告された事例では同じ拒否パスを約 35 反復にわたり推測し続けていました。同一の呼び出しは 1 回目ではなく**2 回目**の失敗から拒否されるため、レート制限やタイムアウト後の正当な 1 回の再試行は実行されます([#1363](https://github.com/HKUDS/Vibe-Trading/pull/1363)、[#1353](https://github.com/HKUDS/Vibe-Trading/issues/1353) をクローズ)。[@Shizoqua](https://github.com/Shizoqua)、[@be-student](https://github.com/be-student)、[@nandofmike](https://github.com/nandofmike) に感謝します!
|
||||
- **2026-09-06** 🛡️ **約定するはずのない価格で算定された買い指値と、何も検証せずに PASS を返した監査**:MCP の発注ゲートは数量注文をライブ気配だけで算定していたため、市場価格の 2 倍の指値が気配基準の上限を通過し、承認済み想定元本の 2 倍で約定し得ました。現在は気配と指値の不利な側で算定され——直接 SDK 経路が既に用いていた規則です——解析できない指値は素通しではなく拒否されます([#1361](https://github.com/HKUDS/Vibe-Trading/pull/1361))。レポート監査は取得値のない検証点をすべてスキップしたうえで「失敗がない」ことを理由に **PASS** を返し、根拠ゼロのレポートを認証していました。検証点ゼロは fail-closed になります([#1362](https://github.com/HKUDS/Vibe-Trading/pull/1362))。**修正:** 分析ツールが失敗した後も指標を主張でき、新設の出典付き数値の免除——論文のシャープレシオには妥当、この実行が観測すべき価格には不当——により「アナリストによれば TSLA.US の直近約定は 412.35 USD。」がツール呼び出しゼロで通過し得ました([#1338](https://github.com/HKUDS/Vibe-Trading/pull/1338)、[#1336](https://github.com/HKUDS/Vibe-Trading/issues/1336) をクローズ)。現金配当の 1 行が取引履歴の解析全体を落としていました([#1356](https://github.com/HKUDS/Vibe-Trading/pull/1356))。コンテキスト圧縮が重複排除ロックをツール名単位で解除するため、ある引数バリアントを消すと他が塞がれたままでした([#1358](https://github.com/HKUDS/Vibe-Trading/pull/1358))。ハッシュ連鎖のコンプライアンス台帳が Windows で初回追記を拒否していました([#1261](https://github.com/HKUDS/Vibe-Trading/pull/1261))。**新規:** Zerodha Kite Connect でブローカーは 14 社に——Kite が実行時の paper/live 判別子を持たないため読み取りとペーパーのみ([#1193](https://github.com/HKUDS/Vibe-Trading/pull/1193))。Nobitex と Wallex がイラン・トマン建てペアを追加してデータソースは 27 に、いずれも米ドル建て市場へ黙って劣化しません([#1263](https://github.com/HKUDS/Vibe-Trading/pull/1263))。ネイティブ Anthropic 呼び出しは静的なツール+システムの前置きをキャッシュし、毎ターン全額で再送しません([#1366](https://github.com/HKUDS/Vibe-Trading/pull/1366))。[@cgycorey](https://github.com/cgycorey)、[@ashutoshsinghpr7](https://github.com/ashutoshsinghpr7)、[@saju01](https://github.com/saju01)、[@he-yufeng](https://github.com/he-yufeng)、[@Emad211](https://github.com/Emad211)、[@averatec0773](https://github.com/averatec0773)、[@birdxs](https://github.com/birdxs)、[@AirHua-byte](https://github.com/AirHua-byte) に感謝します!
|
||||
- **2026-09-05** 🔓 **モデルが捏造した価格が英語では素通りし、中国語では捕捉されていた。そして、自分が取得済みのデータを読み直せないエージェント**:グラウンディング・ゲートは `close` に一致しても **`closed`** には一致せず、ツール呼び出しのない `The stock closed at 412.35.` がそのまま通過する一方、同じ捏造を中国語で書いた `该股收盘 412.35。` は拒否されていました。`last traded at` と `quoted at` には規則自体が存在せず、中国語側にも鏡像の穴(`成交价` / `最新价` / `股价` / `收报`)がありました。両方の語彙を補完し、英語形は後続の "at" を必須にして出来高やディール表現を除外。さらに新しいテストが、各ケースについて両言語が**同一の**判定に至ることを検証します。別件として、財務・資金フロー・信用・レポートの各データ取得に成功したセッションで、コンテキスト確保のためその結果が消去された後も重複排除台帳が再取得を拒み続け、1 回の実行で 44 回ブロックされ、すでに受け取っていたデータについて「基本データを取得できず」と回答していました。結果の消去時にそのツールを再開放し、台帳はツール名ではなく引数でキーを取り、トークン予算もツール呼び出しの引数を計上します(100 KB のペイロードを 10 トークンと見積もることはなくなりました)([#1349](https://github.com/HKUDS/Vibe-Trading/pull/1349)、[#1341](https://github.com/HKUDS/Vibe-Trading/pull/1341)、[#1352](https://github.com/HKUDS/Vibe-Trading/pull/1352)、[#1343](https://github.com/HKUDS/Vibe-Trading/issues/1343) をクローズ)。**修正:** aarch64 では Web UI から起動したバックテストが毎回セグメンテーション違反を起こしていました。サンドボックスの rlimit がマルチスレッド・サーバの fork 済み子プロセスで Python を実行しており、POSIX 上は未定義動作です。現在は exec 後に適用します([#1355](https://github.com/HKUDS/Vibe-Trading/issues/1355) をクローズ)。`GC=F` と `XAUUSD` が中国 A 株に分類されていた件([#1280](https://github.com/HKUDS/Vibe-Trading/pull/1280))、`BRK.B.US` などドット付きクラス株が空データを取得していた件([#1351](https://github.com/HKUDS/Vibe-Trading/pull/1351))、フルインベストのリバランスが手数料超過で縮小せず中断していた件([#1344](https://github.com/HKUDS/Vibe-Trading/pull/1344)、[#1274](https://github.com/HKUDS/Vibe-Trading/issues/1274) をクローズ)、パーセンテージポイント(`3.6pp`、`3.6 个百分点`、`250 基点`)が提示価格として読まれていた件([#1346](https://github.com/HKUDS/Vibe-Trading/pull/1346))、`BTCUSDT` 形式の暗号ペアが認識されない一方で現物プラチナが存在しない暗号ペアに解決されていた件([#1265](https://github.com/HKUDS/Vibe-Trading/pull/1265))、戦略ストアの履歴がタイムスタンプ同着時に古い順で返っていた件([#1347](https://github.com/HKUDS/Vibe-Trading/pull/1347))、Codex アダプタがプロバイダ報告のモデル名を破棄していた件([#1348](https://github.com/HKUDS/Vibe-Trading/pull/1348))。**新規:** 会話の前段で示された市場コンテキストでシンボル解決を絞り込めます(`VIBE_CONTEXTUAL_IDENTITY_CONSTRAINTS` で制御、[#1269](https://github.com/HKUDS/Vibe-Trading/pull/1269))。投資委員会ワーカーが、プロンプトが前提としていた基本データパネルを取得([#1345](https://github.com/HKUDS/Vibe-Trading/pull/1345))。記録済み比較による決定的な USD-M 許容誤差キャリブレーション([#1248](https://github.com/HKUDS/Vibe-Trading/pull/1248))。[@nandofmike](https://github.com/nandofmike), [@atomfive](https://github.com/atomfive), [@thisisjun786](https://github.com/thisisjun786), [@cgycorey](https://github.com/cgycorey), [@saju01](https://github.com/saju01), [@he-yufeng](https://github.com/he-yufeng), [@aminak58](https://github.com/aminak58), [@AirHua-byte](https://github.com/AirHua-byte), [@lorenzozanee](https://github.com/lorenzozanee), [@ethanstoner](https://github.com/ethanstoner), [@Shizoqua](https://github.com/Shizoqua) に感謝します!
|
||||
- **2026-09-04** 🩺 **Claude 5 の実行が最初のリクエストで必ず失敗し、売買停止中の建玉が取得原価に戻して評価されていた**:現行の Anthropic SDK では `langchain-anthropic` が `temperature` を `extra_body` に移すようになったが、自己修復は最上位のキーしか取り除いていなかった。そのため再試行は API が拒否したばかりのフィールドをそのまま送り直し、`claude-sonnet-5` / `claude-opus-5` での実行は最初の呼び出しで落ちていた([#1330](https://github.com/HKUDS/Vibe-Trading/pull/1330)、closes [#1329](https://github.com/HKUDS/Vibe-Trading/issues/1329))。バックテストでは、前方補完の上限を超えて保有した建玉が取得原価で再評価され、市場イベントが何もないのにエクイティにドローダウンが現れ、リバランスの数量計算もその幻のマークに対して走っていた。停止期間の長さにかかわらず最終約定値で評価するようになり、注文の約定は依然として古い価格を拒否する([#1332](https://github.com/HKUDS/Vibe-Trading/pull/1332)、closes [#1318](https://github.com/HKUDS/Vibe-Trading/issues/1318))。**修正:**コミット時の調整が承認済み mandate を緩められる経路が 3 つあった —— 文字列化された数値が数値チェックを回避し、`True` が数値として通り、銘柄ホワイトリストには比較分岐そのものが無かった。あわせて現金のみ(cash-only)はレバレッジ軸の下限であって不正な型ではないため、最も保守的な mandate は今も提出できる([#1285](https://github.com/HKUDS/Vibe-Trading/pull/1285))。経過時間の表示はページ切り替え・再読み込み・履歴からのセッション再オープンを越えて保持される([#1340](https://github.com/HKUDS/Vibe-Trading/pull/1340)、closes [#1339](https://github.com/HKUDS/Vibe-Trading/issues/1339))。フロントエンドとデスクトップの lock ファイルに残っていた 7 件の npm 脆弱性も修正済み。[@averatec0773](https://github.com/averatec0773)、[@he-yufeng](https://github.com/he-yufeng)、[@Jackzigen](https://github.com/Jackzigen) に感謝します!
|
||||
|
||||
+3
-2
@@ -52,15 +52,16 @@
|
||||
|
||||
> ⚠️ **보안 경고:** X 계정 `VibeTrading_HKU`, Virtuals 프로젝트 `101845`, 토큰 컨트랙트 `0x640BDBF77b6447E8b7DB7894cED84BD1c40571f4`는 모두 Vibe-Trading 공식과 무관합니다. Vibe-Trading은 어떠한 토큰이나 밈코인도 발행하거나 공식적으로 지지한 적이 없습니다. 해당 토큰을 구매하거나 지갑을 연결하거나 어떠한 서명도 하지 마세요. [자세히 보기](SECURITY.md#official-channels--impersonation).
|
||||
|
||||
- **2026-09-09** 🚀 **v0.1.15 릴리스** ([릴리스 노트](https://github.com/HKUDS/Vibe-Trading/releases/tag/v0.1.15), `pip install -U vibe-trading-ai`): 0.1.14 이후 551개 커밋 / 162개 병합된 PR, 35명의 기여자가 참여했습니다. **이번 사이클의 주제는 「데이터가 스스로 무엇인지 말하게 하는 것」**이며, 가장 큰 수정 세 건은 결국 같은 버그가 옷만 바꿔 입은 것이었습니다. 결측값을 그럴듯한 값으로 조용히 대체하는 기본 동작은 하류에서 보면 실제 관측과 구별되지 않습니다. Alpha Zoo의 NaN 계약은 개별 alpha에서 registry로 옮겨졌습니다. `np.where` 비교로 분기하는 alpha는 NaN을 볼 수 없고(비교 결과가 `False`이므로), 어떤 바에서 선언된 입력을 모두 비워도 **462개 중 84개의 alpha가 여전히 숫자를 반환했습니다**. `dropna()`가 결측을 IC에서 걸러내는 장치이기 때문에 그 상수들은 실제 시그널로 소비되고 있었습니다. 이제 registry가 선언된 의존성이 없는 바에서 출력을 NaN으로 마스킹하며, 동일한 스윕 후에는 하나도 남지 않습니다([#1377](https://github.com/HKUDS/Vibe-Trading/pull/1377), [#1376](https://github.com/HKUDS/Vibe-Trading/issues/1376) 종료). 워밍업 쪽은 조용히 안고 가지 않고 열어둔 채 명시합니다. **52개의 alpha가 자신이 선언한 `min_warmup_bars` 안에서 값을 내보내고 있으며**, registry 수준의 워밍업 마스크는 창을 두세 개 더 넉넉히 선언했을 뿐인 alpha의 행까지 지워버리므로 이 절반은 52개의 PR이 아니라 방향 결정이 필요합니다. 같은 부류의 두 번째 사례: pandas는 여전히 `pct_change()`의 기본값이 전방 채움이라, 누락된 종가가 **실제로는 없었던 0.0% 수익률**이 됩니다. 네 개의 PR이 각각 한 곳씩 고쳤고, 전수 조사 결과 **10개 파일에 24곳**이 발견되었습니다 — 그중 두 곳은 바로 그 PR들이 편집하던 파일 안에 있었습니다. 세 번째 사례: `futures` 로더 체인은 `tushare`와 `akshare`를 지목했지만 **둘 다 선물 엔드포인트를 전혀 구현하지 않아** 모든 계약이 A주 주식 엔드포인트로 떨어졌습니다. 이제 AKShare가 토큰이 필요 없는 Sina 일봉 엔드포인트로 중국 계약(만기물 및 주력 연속물, 상하이·중금·광저우·정저우 4개 거래소에서 실측)을 제공하고, 글로벌 계약은 빈 결과를 반환해 `local`에 도달합니다([#1395](https://github.com/HKUDS/Vibe-Trading/issues/1395)). 가격 자체도 어떤 조정 캘리버로 제공되었는지 표기하며, 실제 응답으로 검증된 적이 없는 소스는 추측하지 않고 `unknown`으로 보고합니다([#1317](https://github.com/HKUDS/Vibe-Trading/pull/1317)). **실거래의 페일클로즈가 다섯 곳 추가**되었습니다: 브로커 포지션 조회가 API 오류를 반환한 경우, halt sweep 도중 오류 봉투를 받은 경우, runner 재시작을 넘는 flatten 래치, 재시작을 가로질러 정확한 client ID로 회수되는 미결 Alpaca 주문, 그리고 두 전송 경로 모두에서 호가와 지정가 중 나쁜 쪽으로 매수 지정가 주문 수량을 산정하는 것. **백테스트**: 옵션 시그널은 그것을 계산한 바가 아니라 다음 바에서 체결되고, 옵션 매도 레그는 증거금을 잡고 매수 여력으로 신규 진입을 통제하며, 무기한 선물의 펀딩은 8시간 이상 주기에서 바 구간 기준으로 정산되고, 초과 편입된 리밸런싱 바스켓은 중단이 아니라 비례 축소되며, 거래정지 종목은 취득원가가 아니라 최종 체결가로 평가됩니다. **에이전트 루프**: 재무·자금흐름·신용·리서치 데이터를 이미 받아온 세션에서 컨텍스트 확보를 위해 그 결과들이 지워진 뒤에도 중복 제거 원장이 재요청을 계속 거부해 — **한 번의 실행에서 44회 차단** — 이미 받은 데이터에 대해 "기본 데이터를 가져오지 못했습니다"라고 답했습니다. 이제 결과는 정확한 호출 신원으로 대조되고, 무진전 예산은 활동량이 아니라 **관측**을 셉니다. **이번 사이클 신규:** 영국 주식(LSE `.L`/`.IL`, SDRT는 매수 측에만 부과되는 세금으로 모델링 — 양쪽에 부과하면 왕복 비용을 두 배로 과대평가합니다), 14번째 브로커 **Zerodha Kite Connect**(Kite는 런타임 실거래 판별자를 노출하지 않으므로 페이퍼 + 읽기 전용으로 제한), **읽기 전용 멀티 브로커 포트폴리오**(Web / REST / CLI / 에이전트 도구, 갱신에 실패한 소스는 오래된 캐시가 아니라 합계에서 제외되는 오류), **Quant Library 15개 추가**(Heston, 계층적 리스크 패리티, 코퓰러, VPIN/Roll/Amihud/Kyle 미시구조, 유한차분 그릭스를 갖춘 Line truncated
|
||||
|
||||
- **2026-09-09** 🛢️ **위안화로 정산된 미국 원유 선물, 그리고 결측 가격에서 0% 수익률을 만들어내던 전략 템플릿**: `CL2412.NYMEX`는 어떤 심볼 패턴에도 걸리지 않았습니다 — 만기만 붙은 형태(`CL2412`)도 걸리고 거래소만 붙은 형태(`ES.CME`)도 걸리는데, 계약이 실제로 표기되는 형태만 둘 다 걸리지 않았습니다 — 그래서 a_share 기본값으로 떨어져 T+1·공매도 불가·CNY 정산으로 실행되었습니다. 중국 쪽에서는 Tushare 자체의 거래소 표기가 정확히 대칭인 문제였습니다([#1396](https://github.com/HKUDS/Vibe-Trading/pull/1396), [#1394](https://github.com/HKUDS/Vibe-Trading/issues/1394) 종료). 이제 양쪽 모두 올바르게 분류됩니다. 별개로, pandas의 `pct_change()`는 여전히 기본값이 전방 채우기여서 결측 종가가 **실제로 일어난 적 없는 0.0% 수익률**이 되고, 다음 bar는 이틀치 움직임을 하루치로 보고합니다. 두 PR이 각각 한 곳씩 고쳤지만([#1397](https://github.com/HKUDS/Vibe-Trading/pull/1397), [#1398](https://github.com/HKUDS/Vibe-Trading/pull/1398)), skills를 전수 조사하니 **10개 파일 24곳**이었고 그중 두 곳은 바로 그 PR들이 수정 중이던 파일 안에 있었습니다. 이제 저장소 전역 가드가 이 부류를 닫아 둡니다. 중국 선물 백테스트는 어떤 품목이 테이블 조회가 아니라 일반 기본값으로 가격이 매겨졌는지도 밝힙니다 — `rb`의 실제 증거금률은 0.10으로 기본값과 같은 숫자이며, "조회한 값"이 "가정한 값"처럼 읽혀서는 안 됩니다([#1393](https://github.com/HKUDS/Vibe-Trading/issues/1393) 종료). 함께 병합: ML 워크포워드 예제의 미래 레이블 제거([#1392](https://github.com/HKUDS/Vibe-Trading/pull/1392)), 팩터 관측이 전혀 없는 종목을 TopN에서 제외([#1399](https://github.com/HKUDS/Vibe-Trading/pull/1399)), 감성 팩터 직교화가 스스로 채운 0에 회귀하지 않도록 수정([#1400](https://github.com/HKUDS/Vibe-Trading/pull/1400)).
|
||||
|
||||
- **2026-09-08** 🧪 **입력이 비어 있는 bar에서도 숫자를 출력하던 알파, 그리고 스웨덴 비트코인 ETP를 돌려준 현물 금 검색**: Alpha Zoo의 계약은 warmup과 결측 데이터를 NaN 그대로 통과시키는 것이지만, `np.where` 비교로 분기하는 알파는 NaN을 볼 수 없습니다 —— 비교 결과가 `False`가 되어 삼항식이 상수 쪽으로 떨어지기 때문입니다. 462개 알파 전체를 대상으로 특정 bar에서 선언된 입력을 모두 비운 뒤 측정하니 **84개가 그래도 숫자를 반환**했고, 결측을 IC에서 걸러내는 것이 바로 `dropna()`이므로 그 상수들은 실제 시그널로 소비되고 있었습니다. 이제 가드는 각 알파가 아니라 registry에 있으며 —— 해당 bar에서 선언된 의존성이 하나라도 없으면 출력을 NaN으로 마스킹합니다 —— 수정 후 같은 측정에서는 **한 개도 나오지 않습니다**([#1377](https://github.com/HKUDS/Vibe-Trading/pull/1377), [#1376](https://github.com/HKUDS/Vibe-Trading/issues/1376) 종료). 계약의 나머지 절반인 warmup 구간에 대해서도 11개 알파를 고쳤습니다([#1379](https://github.com/HKUDS/Vibe-Trading/pull/1379), [#1380](https://github.com/HKUDS/Vibe-Trading/pull/1380), [#1381](https://github.com/HKUDS/Vibe-Trading/pull/1381), [#1382](https://github.com/HKUDS/Vibe-Trading/pull/1382), [#1383](https://github.com/HKUDS/Vibe-Trading/pull/1383)). 같은 방식으로 그 절반을 측정하면 **52개 알파가 자신이 선언한 `min_warmup_bars` 안쪽에서 값을 내보내고 있습니다**. registry 차원의 warmup 마스킹은 선언이 단지 보수적일 뿐인 알파의 행까지 비우게 되므로, 이 절반은 미해결로 두되 조용히 안고 가는 대신 여기에 명시합니다. 한편 `search_symbol("XAUUSD")`가 돌려준 유일한 후보는 스웨덴 비트코인 ETP인 `VALOUR-BTC-0-SEK.ST`였고, 그것이 실행 전체의 종목 정체성을 고정했습니다. 이제 금속·FX 페어 질의는 정확한 종목 주장으로 취급되어, 표기가 달라도 같은 두 다리를 가리키는 후보만 남깁니다([#1282](https://github.com/HKUDS/Vibe-Trading/pull/1282)). **수정:** 공시 날짜에는 시각이 없어서, 분봉 프레임에서는 공시 당일 첫 bar부터 재무 데이터가 보였습니다 —— 한 세션 전체 분량의 선행 정보입니다. 이제 일간보다 짧은 프레임은 거부되며 `fundamental_subdaily="next_day"`가 명시적 선택지입니다([#1387](https://github.com/HKUDS/Vibe-Trading/issues/1387) 종료). 일반 헤더 `| 지표 | 값 |` 표로 작성된 지표 주장이 같은 주장을 산문에서는 거부하는 분석 게이트를 통과했고([#1375](https://github.com/HKUDS/Vibe-Trading/pull/1375)), 거울상 오류로 수식 변수로 쓰인 가격 단어 —— `close/SMA50 > 1` —— 는 주장된 가격으로 읽혔습니다([#1378](https://github.com/HKUDS/Vibe-Trading/pull/1378), [#1354](https://github.com/HKUDS/Vibe-Trading/issues/1354) 종료). 붙여넣은 증권사 코드(`HK.00700`, `US.AAPL`, `SH.600519`)는 애초에 심볼로 인식되지 않아 모든 시세 도구가 `identity_required`로 답했습니다([#1384](https://github.com/HKUDS/Vibe-Trading/pull/1384)). 세 가지 Archimedean copula CDF는 강한 의존 파라미터에서 잘못된 극단값 —— Clayton `0.0`, Gumbel `1.0`, Frank `inf` —— 을 반환했으나 이제 로그 공간에서 계산되며, 2500자리 정밀도 기준값에 대해 θ ∈ [-5000, 5000] 구간에서 검증했습니다([#1386](https://github.com/HKUDS/Vibe-Trading/pull/1386), [#1385](https://github.com/HKUDS/Vibe-Trading/issues/1385) 종료). 종목 수량 상한을 넘는 MT5 주문은 조용히 상한으로 깎여 전송되고, 지정가 없는 eToro 지정가 주문은 발동되지 않은 채 접수된 것처럼 표시되며, futu K선은 선언되지 않은 수정주가 기준을 물려받고, `BTCUSDT`는 A주 규칙 —— 무기한 계약에 T+1과 공매도 금지 —— 을 탔습니다([#1388](https://github.com/HKUDS/Vibe-Trading/pull/1388)). [@cgycorey](https://github.com/cgycorey), [@Shizoqua](https://github.com/Shizoqua), [@he-yufeng](https://github.com/he-yufeng), [@Robin1987China](https://github.com/Robin1987China), [@laiyierjiangsu](https://github.com/laiyierjiangsu), [@aminak58](https://github.com/aminak58), [@nandofmike](https://github.com/nandofmike) 감사합니다!
|
||||
|
||||
- **2026-09-07** 🪙 **50온스 금 주문이 0으로 반올림되고, 통화 선물이 계약 규모의 1/2500로 산정되었습니다**: 크로스마켓 백테스트에서 복합 엔진은 시장마다 하나의 공유 서브엔진으로 모든 종목을 디스패치하지만, 그 서브엔진 자신의 활성 종목을 갱신하는 것은 `apply_slippage` 뿐이었습니다. 그래서 `round_size`와 `calc_commission`은 마지막으로 동기화된 종목을 사용했습니다. 50온스 금 포지션은 FX의 1,000단위 마이크로 랏 기준으로 반올림되어 **0**이 되었고, 금 선물에는 자체 정액 수수료(20.00) 대신 지수 선물의 요율제 수수료(6.90)가 부과되었으며, 스왑은 100온스 금속 랏이 아니라 100,000단위 표준 랏으로 계산되었습니다([#1370](https://github.com/HKUDS/Vibe-Trading/pull/1370)). 또한 `_extract_product`는 상품 코드에 숫자가 들어가거나 마지막 글자가 월물 코드와 겹치는 심볼을 읽지 못했습니다. `6EZ4`, `6JH25`, `M2K`, `MYM2503`, `FESX2503`이 모두 기본 승수 50으로 떨어졌습니다——`6E`의 실제 값은 125,000입니다([#1369](https://github.com/HKUDS/Vibe-Trading/pull/1369)). 이제 승수 테이블 자체에 대해 최장 일치로 해석하며, 월물 형태(`M2KZ4`)와 접두사 충돌(`SILZ4` 대 `SI`)까지 함께 처리합니다. **수정:** Alpha Zoo의 네 개 팩터가 거래정지일과 스스로 선언한 워밍업 구간에서 고정된 ±1 또는 0을 출력했습니다. NaN 비교는 NaN이 아니라 `False`가 되므로 삼항 분기가 상수 쪽으로 떨어졌기 때문입니다. `min_warmup_bars`는 아무것도 잘라내지 않는 메타데이터이고, 결측을 IC에서 빼주는 것은 `dropna()`입니다——즉 그 상수들이 진짜 신호로 소비되고 있었습니다([#1371](https://github.com/HKUDS/Vibe-Trading/pull/1371), [#1372](https://github.com/HKUDS/Vibe-Trading/pull/1372), [#1373](https://github.com/HKUDS/Vibe-Trading/pull/1373), [#1374](https://github.com/HKUDS/Vibe-Trading/pull/1374)). 같은 기준으로 전체 zoo를 측정하면 **같은 형태의 알파가 82개 더** 있습니다. 팩터마다 PR을 하나씩 내는 대신 레지스트리 계층 가드로 [#1376](https://github.com/HKUDS/Vibe-Trading/issues/1376)에서 추적합니다. strategy-discovery의 evidence도 레짐별이 아니라 실행 전체에 대해 포지션 크기를 한 번만 해석했고, 파싱할 수 없는 벤치마크 값 한 칸이 그 실행의 evidence 행 전체를 지워버릴 수 있었습니다([#1368](https://github.com/HKUDS/Vibe-Trading/pull/1368)). **신규:** 새로운 정보를 얻지 못한 채 도구 호출을 계속하는 실행은, 예산 전체를 경로 탐색에 쓰는 대신 여덟 번의 반복 후 눈에 보이는 복구 요청과 함께 멈춥니다——보고된 사례는 같은 거부 경로를 약 35회 반복해 추측했습니다. 동일한 호출은 첫 번째가 아니라 **두 번째** 실패부터 거부되므로, 레이트 리밋이나 타임아웃 뒤의 정당한 재시도 한 번은 실행됩니다([#1363](https://github.com/HKUDS/Vibe-Trading/pull/1363), [#1353](https://github.com/HKUDS/Vibe-Trading/issues/1353) 종료). [@Shizoqua](https://github.com/Shizoqua), [@be-student](https://github.com/be-student), [@nandofmike](https://github.com/nandofmike) 님 감사합니다!
|
||||
|
||||
<details>
|
||||
<summary>이전 뉴스</summary>
|
||||
|
||||
- **2026-09-07** 🪙 **50온스 금 주문이 0으로 반올림되고, 통화 선물이 계약 규모의 1/2500로 산정되었습니다**: 크로스마켓 백테스트에서 복합 엔진은 시장마다 하나의 공유 서브엔진으로 모든 종목을 디스패치하지만, 그 서브엔진 자신의 활성 종목을 갱신하는 것은 `apply_slippage` 뿐이었습니다. 그래서 `round_size`와 `calc_commission`은 마지막으로 동기화된 종목을 사용했습니다. 50온스 금 포지션은 FX의 1,000단위 마이크로 랏 기준으로 반올림되어 **0**이 되었고, 금 선물에는 자체 정액 수수료(20.00) 대신 지수 선물의 요율제 수수료(6.90)가 부과되었으며, 스왑은 100온스 금속 랏이 아니라 100,000단위 표준 랏으로 계산되었습니다([#1370](https://github.com/HKUDS/Vibe-Trading/pull/1370)). 또한 `_extract_product`는 상품 코드에 숫자가 들어가거나 마지막 글자가 월물 코드와 겹치는 심볼을 읽지 못했습니다. `6EZ4`, `6JH25`, `M2K`, `MYM2503`, `FESX2503`이 모두 기본 승수 50으로 떨어졌습니다——`6E`의 실제 값은 125,000입니다([#1369](https://github.com/HKUDS/Vibe-Trading/pull/1369)). 이제 승수 테이블 자체에 대해 최장 일치로 해석하며, 월물 형태(`M2KZ4`)와 접두사 충돌(`SILZ4` 대 `SI`)까지 함께 처리합니다. **수정:** Alpha Zoo의 네 개 팩터가 거래정지일과 스스로 선언한 워밍업 구간에서 고정된 ±1 또는 0을 출력했습니다. NaN 비교는 NaN이 아니라 `False`가 되므로 삼항 분기가 상수 쪽으로 떨어졌기 때문입니다. `min_warmup_bars`는 아무것도 잘라내지 않는 메타데이터이고, 결측을 IC에서 빼주는 것은 `dropna()`입니다——즉 그 상수들이 진짜 신호로 소비되고 있었습니다([#1371](https://github.com/HKUDS/Vibe-Trading/pull/1371), [#1372](https://github.com/HKUDS/Vibe-Trading/pull/1372), [#1373](https://github.com/HKUDS/Vibe-Trading/pull/1373), [#1374](https://github.com/HKUDS/Vibe-Trading/pull/1374)). 같은 기준으로 전체 zoo를 측정하면 **같은 형태의 알파가 82개 더** 있습니다. 팩터마다 PR을 하나씩 내는 대신 레지스트리 계층 가드로 [#1376](https://github.com/HKUDS/Vibe-Trading/issues/1376)에서 추적합니다. strategy-discovery의 evidence도 레짐별이 아니라 실행 전체에 대해 포지션 크기를 한 번만 해석했고, 파싱할 수 없는 벤치마크 값 한 칸이 그 실행의 evidence 행 전체를 지워버릴 수 있었습니다([#1368](https://github.com/HKUDS/Vibe-Trading/pull/1368)). **신규:** 새로운 정보를 얻지 못한 채 도구 호출을 계속하는 실행은, 예산 전체를 경로 탐색에 쓰는 대신 여덟 번의 반복 후 눈에 보이는 복구 요청과 함께 멈춥니다——보고된 사례는 같은 거부 경로를 약 35회 반복해 추측했습니다. 동일한 호출은 첫 번째가 아니라 **두 번째** 실패부터 거부되므로, 레이트 리밋이나 타임아웃 뒤의 정당한 재시도 한 번은 실행됩니다([#1363](https://github.com/HKUDS/Vibe-Trading/pull/1363), [#1353](https://github.com/HKUDS/Vibe-Trading/issues/1353) 종료). [@Shizoqua](https://github.com/Shizoqua), [@be-student](https://github.com/be-student), [@nandofmike](https://github.com/nandofmike) 님 감사합니다!
|
||||
- **2026-09-06** 🛡️ **체결될 리 없는 가격으로 산정된 매수 지정가, 그리고 아무것도 검증하지 않고 PASS를 반환한 감사**: MCP 주문 게이트가 수량 주문을 실시간 호가만으로 산정해, 시장가의 두 배인 지정가가 호가 기준 한도를 통과했고 승인된 명목금액의 두 배로 체결될 수 있었습니다. 이제 호가와 지정가 중 불리한 쪽으로 산정하며——직접 SDK 경로가 이미 쓰던 규칙입니다——파싱할 수 없는 지정가는 통과가 아니라 거부됩니다([#1361](https://github.com/HKUDS/Vibe-Trading/pull/1361)). 리포트 감사기는 가져온 값이 없는 검증점을 모두 건너뛴 뒤 "실패가 없다"는 이유로 **PASS**를 반환해 근거가 전혀 없는 리포트를 인증했습니다. 검증점이 0이면 이제 fail-closed 입니다([#1362](https://github.com/HKUDS/Vibe-Trading/pull/1362)). **수정:** 분석 도구가 실패한 뒤에도 지표를 주장할 수 있었고, 새로 추가된 출처 표기 수치 면제——논문의 샤프지수에는 타당하지만 이 실행이 관측해야 할 가격에는 부당——때문에 "애널리스트에 따르면 TSLA.US 최근 체결가는 412.35 USD."가 도구 호출 없이 통과할 수 있었습니다([#1338](https://github.com/HKUDS/Vibe-Trading/pull/1338), [#1336](https://github.com/HKUDS/Vibe-Trading/issues/1336) 종료). 현금 배당 한 줄이 거래 내역 파싱 전체를 무너뜨렸습니다([#1356](https://github.com/HKUDS/Vibe-Trading/pull/1356)). 컨텍스트 압축이 중복 제거 잠금을 도구 이름 단위로 해제해, 한 인자 변형을 지우면 나머지가 계속 막혔습니다([#1358](https://github.com/HKUDS/Vibe-Trading/pull/1358)). 해시 체인 컴플라이언스 원장이 Windows에서 첫 추가를 거부했습니다([#1261](https://github.com/HKUDS/Vibe-Trading/pull/1261)). **신규:** Zerodha Kite Connect로 브로커가 14곳이 되었습니다——Kite가 런타임 paper/live 판별자를 제공하지 않아 읽기와 페이퍼 전용입니다([#1193](https://github.com/HKUDS/Vibe-Trading/pull/1193)). Nobitex와 Wallex가 이란 토만 페어를 더해 데이터 소스가 27개가 되었고, 둘 다 달러 표시 거래소로 조용히 강등되지 않습니다([#1263](https://github.com/HKUDS/Vibe-Trading/pull/1263)). 네이티브 Anthropic 호출은 정적 도구+시스템 프리픽스를 캐시해 매 턴 전액으로 재전송하지 않습니다([#1366](https://github.com/HKUDS/Vibe-Trading/pull/1366)). [@cgycorey](https://github.com/cgycorey)、[@ashutoshsinghpr7](https://github.com/ashutoshsinghpr7)、[@saju01](https://github.com/saju01)、[@he-yufeng](https://github.com/he-yufeng)、[@Emad211](https://github.com/Emad211)、[@averatec0773](https://github.com/averatec0773)、[@birdxs](https://github.com/birdxs), [@AirHua-byte](https://github.com/AirHua-byte) 님 감사합니다!
|
||||
- **2026-09-05** 🔓 **모델이 지어낸 가격이 영어에서는 통과하고 중국어에서는 걸렸으며, 이미 가져온 데이터를 다시 읽지 못하는 에이전트**: 그라운딩 게이트가 `close`는 매칭했지만 **`closed`**는 매칭하지 못해, 도구 호출이 전혀 없는 `The stock closed at 412.35.`가 그대로 통과한 반면 동일한 조작 주장을 중국어로 쓴 `该股收盘 412.35。`는 거부되었습니다. `last traded at`과 `quoted at`에는 규칙 자체가 없었고, 중국어 쪽에도 거울상 구멍(`成交价` / `最新价` / `股价` / `收报`)이 있었습니다. 이제 양쪽 어휘를 모두 채웠고, 영어 형태는 뒤에 "at"을 요구해 거래량·인수합병 표현을 배제하며, 새 테스트가 각 사례에 대해 두 언어가 **동일한** 판정에 도달하는지 검증합니다. 별건으로, 재무·자금흐름·신용·리서치 데이터를 성공적으로 가져온 세션에서 컨텍스트 확보를 위해 그 결과가 지워진 뒤에도 중복 제거 원장이 재조회를 계속 거부해 한 번의 실행에서 44회 차단되었고, 이미 받은 데이터에 대해 "기본 데이터를 가져오지 못함"이라고 답했습니다. 이제 결과가 지워지면 해당 도구가 다시 열리고, 원장은 도구 이름이 아니라 인자를 키로 사용하며, 토큰 예산이 도구 호출 인자를 계산합니다(100 KB 페이로드를 10 토큰으로 보지 않습니다) ([#1349](https://github.com/HKUDS/Vibe-Trading/pull/1349), [#1341](https://github.com/HKUDS/Vibe-Trading/pull/1341), [#1352](https://github.com/HKUDS/Vibe-Trading/pull/1352), [#1343](https://github.com/HKUDS/Vibe-Trading/issues/1343) 종료). **수정:** aarch64에서 Web UI로 시작한 모든 백테스트가 세그멘테이션 오류를 일으켰습니다 — 샌드박스 rlimit이 멀티스레드 서버의 fork된 자식 프로세스에서 Python을 실행했고 이는 POSIX상 미정의 동작입니다. 이제 exec 이후에 적용합니다([#1355](https://github.com/HKUDS/Vibe-Trading/issues/1355) 종료). `GC=F`와 `XAUUSD`가 중국 A주로 분류되던 문제([#1280](https://github.com/HKUDS/Vibe-Trading/pull/1280)), `BRK.B.US` 등 점이 있는 클래스 주식이 빈 데이터를 가져오던 문제([#1351](https://github.com/HKUDS/Vibe-Trading/pull/1351)), 완전 투자 리밸런싱이 수수료 초과 시 비율 축소 대신 중단되던 문제([#1344](https://github.com/HKUDS/Vibe-Trading/pull/1344), [#1274](https://github.com/HKUDS/Vibe-Trading/issues/1274) 종료), 퍼센트포인트 변동(`3.6pp`, `3.6 个百分点`, `250 基点`)이 호가로 읽히던 문제([#1346](https://github.com/HKUDS/Vibe-Trading/pull/1346)), `BTCUSDT` 형태의 암호화폐 쌍은 인식되지 않으면서 현물 백금이 존재하지 않는 암호화폐 쌍으로 해석되던 문제([#1265](https://github.com/HKUDS/Vibe-Trading/pull/1265)), 전략 저장소 이력이 타임스탬프 동률 시 오래된 순으로 반환되던 문제([#1347](https://github.com/HKUDS/Vibe-Trading/pull/1347)), Codex 어댑터가 제공자가 보고한 모델명을 버리던 문제([#1348](https://github.com/HKUDS/Vibe-Trading/pull/1348)). **신규:** 대화 앞부분에서 제시된 시장 컨텍스트로 심볼 해석을 좁힐 수 있습니다(`VIBE_CONTEXTUAL_IDENTITY_CONSTRAINTS`로 제어, [#1269](https://github.com/HKUDS/Vibe-Trading/pull/1269)); 투자위원회 워커가 프롬프트가 이미 전제하던 기본 데이터 패널을 갖게 됩니다([#1345](https://github.com/HKUDS/Vibe-Trading/pull/1345)); 기록된 비교에 기반한 결정론적 USD-M 허용오차 보정([#1248](https://github.com/HKUDS/Vibe-Trading/pull/1248)). [@nandofmike](https://github.com/nandofmike), [@atomfive](https://github.com/atomfive), [@thisisjun786](https://github.com/thisisjun786), [@cgycorey](https://github.com/cgycorey), [@saju01](https://github.com/saju01), [@he-yufeng](https://github.com/he-yufeng), [@aminak58](https://github.com/aminak58), [@AirHua-byte](https://github.com/AirHua-byte), [@lorenzozanee](https://github.com/lorenzozanee), [@ethanstoner](https://github.com/ethanstoner), [@Shizoqua](https://github.com/Shizoqua) 감사합니다!
|
||||
- **2026-09-04** 🩺 **모든 Claude 5 실행이 첫 요청에서 실패했고, 거래정지 포지션이 매입 원가로 되돌려 평가되었습니다**:현재 Anthropic SDK에서는 `langchain-anthropic`이 `temperature`를 `extra_body`로 옮기는데, 자가 복구는 최상위 키만 제거했습니다. 그래서 재시도가 API가 방금 거부한 바로 그 필드를 그대로 다시 보냈고, `claude-sonnet-5` / `claude-opus-5` 실행은 첫 호출에서 죽었습니다([#1330](https://github.com/HKUDS/Vibe-Trading/pull/1330), closes [#1329](https://github.com/HKUDS/Vibe-Trading/issues/1329)). 백테스트에서는 전방 채움 한도를 넘겨 보유한 포지션이 진입가로 재평가되어, 시장 이벤트가 전혀 없는데도 자산곡선에 낙폭이 찍히고 리밸런싱 수량 계산까지 그 유령 가격 위에서 돌았습니다. 이제 정지 기간이 얼마든 마지막 체결가로 평가하며, 주문 체결은 여전히 오래된 가격을 거부합니다([#1332](https://github.com/HKUDS/Vibe-Trading/pull/1332), closes [#1318](https://github.com/HKUDS/Vibe-Trading/issues/1318)). **수정:** 커밋 시점 조정이 승인된 mandate를 넓힐 수 있는 경로가 셋 있었습니다 — 문자열로 된 숫자가 숫자 검사를 건너뛰고, `True`가 숫자로 통과하고, 종목 화이트리스트에는 비교 분기 자체가 없었습니다. 또한 현금 전용(cash-only)은 레버리지 축의 하한이지 잘못된 타입이 아니므로, 가장 보수적인 mandate도 여전히 제출됩니다([#1285](https://github.com/HKUDS/Vibe-Trading/pull/1285)). 경과 시간 표시는 페이지 전환·새로고침·히스토리에서 세션 재오픈을 견딥니다([#1340](https://github.com/HKUDS/Vibe-Trading/pull/1340), closes [#1339](https://github.com/HKUDS/Vibe-Trading/issues/1339)). 프런트엔드와 데스크톱 lock 파일에 열려 있던 npm 취약점 7건도 패치했습니다. [@averatec0773](https://github.com/averatec0773), [@he-yufeng](https://github.com/he-yufeng), [@Jackzigen](https://github.com/Jackzigen) 님 감사합니다!
|
||||
|
||||
+3
-2
@@ -52,15 +52,16 @@
|
||||
|
||||
> ⚠️ **安全警告:** X 账号 `VibeTrading_HKU`、Virtuals 项目 `101845` 及代币合约 `0x640BDBF77b6447E8b7DB7894cED84BD1c40571f4` 均非 Vibe-Trading 官方。我们从未发行或背书任何代币或 meme 币。请勿购买、连接钱包或签名。[详细说明](SECURITY.md#official-channels--impersonation)。
|
||||
|
||||
- **2026-09-09** 🚀 **v0.1.15 发布** ([发布说明](https://github.com/HKUDS/Vibe-Trading/releases/tag/v0.1.15),`pip install -U vibe-trading-ai`):自 0.1.14 起 551 个 commit、162 个已合并 PR,来自 35 位贡献者。**这一轮的主题是「数据要讲清楚自己是什么」**——而其中三个最大的修复其实是同一个 bug 换了三身衣服:一个默认值把缺失悄悄替换成看起来合理的数,而这个数在下游与真实观测完全无法区分。Alpha Zoo 的 NaN 契约从各个 alpha 内部上移到了 registry:用 `np.where` 对比较式分支的 alpha 永远看不到 NaN——比较结果是 `False`——于是把某一根 bar 上所有声明输入置空之后,**462 个 alpha 里仍有 84 个照样返回了数字**,而 `dropna()` 正是把缺口挡在 IC 之外的机制,所以这些常数都被当成真实信号消费了。现在 registry 会在任一声明依赖缺失的 bar 上把输出掩成 NaN,同一套扫描之后一个都不剩([#1377](https://github.com/HKUDS/Vibe-Trading/pull/1377),关闭 [#1376](https://github.com/HKUDS/Vibe-Trading/issues/1376))。warmup 那一半明确留开而不是悄悄带过:**仍有 52 个 alpha 在自己声明的 `min_warmup_bars` 之内就出值**,而 registry 级的 warmup 掩码会连带把「只是把窗口多声明了两三根」的 alpha 也一起抹掉,所以这一半需要的是一个方向决策,而不是 52 个 PR。同一类的第二例:pandas 至今仍把 `pct_change()` 默认为前向填充,于是一根缺失的收盘价变成**一个从未发生过的 0.0% 收益**;四个 PR 各修了一个调用点,而穷举清查找出**10 个文件里的 24 处**——其中两处就在那些 PR 正在改的文件里。第三例:`futures` 数据源链点名 `tushare` 和 `akshare`,而**两家都根本没实现期货端点**,于是每一个合约都掉进了 A 股股票端点。AKShare 现在通过免 token 的新浪日线端点提供中国合约(含具体合约与主力连续,已在上期所/中金所/广期所/郑商所四家实测),而全球合约返回空、落到 `local`,不再被当成股票定价([#1395](https://github.com/HKUDS/Vibe-Trading/issues/1395))。价格本身现在也会标注自己所用的复权口径;口径从未对真实返回体实测过的数据源,报 `unknown` 而不是猜一个([#1317](https://github.com/HKUDS/Vibe-Trading/pull/1317))。**实盘侧新增五处 fail-closed**:券商持仓查询返回 API 错误、halt sweep 中途收到错误信封、flatten 闩锁跨 runner 重启、未决 Alpaca 委托按精确 client ID 跨重启找回、以及买入限价单按「报价与限价中较差的一侧」定量(两条通路都改)。**回测侧**:期权信号改在下一根 bar 成交,不再用生成信号的那根 bar 的价格;期权空头腿占用保证金并按购买力把关开仓;永续资金费在 8 小时以上周期按 bar 跨度结算;超额再平衡篮子按比例缩放而不是直接中止;停牌持仓按最后成交价而非成本价估值。**Agent 循环**:某次会话已经成功取到财报、资金流、融资盘和研报数据,随后这些结果为腾出上下文被清除,而去重账本仍拒绝重新获取——**单次运行被拦 44 次**,最终对已经拿到过的数据回答「未取得基本面数据」;现在结果按精确调用身份对账,无进展预算也改为计**观测**而不是计活动量。**本轮新增:** 英国股票(LSE `.L`/`.IL`,SDRT 按「只在买入侧」建模——两侧都收会把每一次往返成本高估一半)、**Zerodha Kite Connect** 作为第 14 家券商(因 Kite 不暴露任何运行时实盘判据,按红线封顶为模拟盘 + 只读)、**只读多券商组合**(Web / REST / CLI / agent 工具四条入口,刷新失败的数据源是「被排除在合计之外的错误」而不是陈旧缓存)、**Quant Library 新增 15 项**(Heston、层次风险平价、Copula、VPIN/Roll/Amihud/Kyle 微观结构、含有限差分希腊字母的障碍期权、ISDA CDS、关键利率久期、Vasicek、因子 IC、Ornstein-Uhlenbeck、Ulcer/Pain、事件研究检验、分组净化交叉验证)、**巴西葡萄牙语**成为第 8 种语言、只读的 **Nobitex 与 Wallex**、日历触发的部分再平衡、swarm 重放与重试,以及一套**离线 evals 校验器**——所需插桩缺失时它输出 `NOT_EVALUABLE` 而不是判过。感谢本轮全部 35 位贡献者!
|
||||
|
||||
- **2026-09-09** 🛢️ **在 A 股规则下按人民币结算的美国原油合约,以及一份把缺失价格算成 0% 收益的策略模板**:`CL2412.NYMEX` 匹配不上任何符号规则——裸的带月份写法(`CL2412`)能中,带场所的写法(`ES.CME`)也能中,唯独合约真正的写法两条都不中——于是落到 a_share 默认值,按 T+1、不可做空、以 CNY 结算跑完。中国这一侧的镜像问题是 Tushare 自己的交易所拼写([#1396](https://github.com/HKUDS/Vibe-Trading/pull/1396),关闭 [#1394](https://github.com/HKUDS/Vibe-Trading/issues/1394));两侧现已都能正确分类。另一件事:pandas 的 `pct_change()` 至今默认前向填充,于是一根缺失的收盘价会变成**一个从未发生过的 0.0% 收益**,紧接着的那根把两天的涨跌当成一天报出来。两个 PR 各修了一个调用点([#1397](https://github.com/HKUDS/Vibe-Trading/pull/1397)、[#1398](https://github.com/HKUDS/Vibe-Trading/pull/1398));把 skills 穷举一遍,找到 **10 个文件里的 24 处**,其中两处就在这两个 PR 当时正在改的文件里,现已加上全仓守卫把这一类关死。中国期货回测现在还会声明哪些品种是按通用默认值定价、而非查表得来的——`rb` 真实的保证金率就是 0.10,和默认值同一个数,「查到的」不能读起来像「假设的」(关闭 [#1393](https://github.com/HKUDS/Vibe-Trading/issues/1393))。同时合并:ML 滚动训练示例清除未来标签([#1392](https://github.com/HKUDS/Vibe-Trading/pull/1392))、无任何因子观测的标的不再进入 TopN([#1399](https://github.com/HKUDS/Vibe-Trading/pull/1399))、情绪因子正交化不再对自己填出来的 0 做回归([#1400](https://github.com/HKUDS/Vibe-Trading/pull/1400))。
|
||||
|
||||
- **2026-09-08** 🧪 **在输入为空的那根 bar 上照样打印出数字的因子,以及一次返回瑞典比特币 ETP 的现货黄金搜索**:Alpha Zoo 的契约是让 NaN 穿过 warmup 与缺失数据,但用 `np.where` 比较分支的因子永远看不到 NaN —— 比较结果是 `False`,三元表达式于是落到它的常量分支。把 462 个因子逐一测过,在某根 bar 上清空其申报的全部输入后,**仍有 84 个因子照样给出数字**;而把缺口挡在 IC 之外的正是 `dropna()`,所以这些常量被当成真实信号消费掉了。守卫现在放在 registry 而不是每个因子里 —— 只要该 bar 上有申报依赖缺失,输出就被置为 NaN —— 同一套测量在修复后**一个都测不出来**([#1377](https://github.com/HKUDS/Vibe-Trading/pull/1377),关闭 [#1376](https://github.com/HKUDS/Vibe-Trading/issues/1376))。契约的另一半 warmup 窗口也修了 11 个因子([#1379](https://github.com/HKUDS/Vibe-Trading/pull/1379)、[#1380](https://github.com/HKUDS/Vibe-Trading/pull/1380)、[#1381](https://github.com/HKUDS/Vibe-Trading/pull/1381)、[#1382](https://github.com/HKUDS/Vibe-Trading/pull/1382)、[#1383](https://github.com/HKUDS/Vibe-Trading/pull/1383))—— 用同样方式测这一半,**仍有 52 个因子在自己申报的 `min_warmup_bars` 之内就出值**。registry 级的 warmup 屏蔽会连带清空那些只是申报保守的因子的行,所以这半边暂不合并,写在这里而不是悄悄带过。另外,`search_symbol("XAUUSD")` 返回的唯一候选是 `VALOUR-BTC-0-SEK.ST` —— 一只瑞典比特币 ETP —— 并就此锁定了整轮运行的标的身份;金属/外汇货币对查询现在被当作精确标的断言,只保留写法不同但两条腿相同的候选([#1282](https://github.com/HKUDS/Vibe-Trading/pull/1282))。**修复:** 公告日期不带时刻,因此在日内 K 线上,一份财报从它自己公告日的第一根 bar 起就可见 —— 整整一个交易日的前视。日内帧现在直接拒绝,`fundamental_subdaily="next_day"` 是显式的选择项(关闭 [#1387](https://github.com/HKUDS/Vibe-Trading/issues/1387))。写成通用表头 `| 指标 | 数值 |` 的指标断言能绕过在散文里会拒绝同一断言的分析闸门([#1375](https://github.com/HKUDS/Vibe-Trading/pull/1375));镜像的错误则相反 —— 被当作公式变量使用的价格词 `close/SMA50 > 1` 被读成了断言的价格([#1378](https://github.com/HKUDS/Vibe-Trading/pull/1378),关闭 [#1354](https://github.com/HKUDS/Vibe-Trading/issues/1354))。粘贴进来的券商代码(`HK.00700`、`US.AAPL`、`SH.600519`)根本扫不出符号,于是每个行情工具都回答 `identity_required`([#1384](https://github.com/HKUDS/Vibe-Trading/pull/1384))。三个 Archimedean copula 的 CDF 在强相依参数下返回错误的极值 —— Clayton `0.0`、Gumbel `1.0`、Frank `inf` —— 现在改在对数空间计算,并用 2500 位精度的参照在 θ ∈ [-5000, 5000] 上逐点校验([#1386](https://github.com/HKUDS/Vibe-Trading/pull/1386),关闭 [#1385](https://github.com/HKUDS/Vibe-Trading/issues/1385))。超过品种手数上限的 MT5 委托会被静默截断后发出,没有限价的 eToro 限价单挂在盘上永不触发却显示为已接受,futu K 线沿用了未声明的复权口径,`BTCUSDT` 走的是 A 股规则 —— 在一个永续合约上执行 T+1 与禁止做空([#1388](https://github.com/HKUDS/Vibe-Trading/pull/1388))。感谢 [@cgycorey](https://github.com/cgycorey)、[@Shizoqua](https://github.com/Shizoqua)、[@he-yufeng](https://github.com/he-yufeng)、[@Robin1987China](https://github.com/Robin1987China)、[@laiyierjiangsu](https://github.com/laiyierjiangsu)、[@aminak58](https://github.com/aminak58) 和 [@nandofmike](https://github.com/nandofmike)!
|
||||
|
||||
- **2026-09-07** 🪙 **一笔 50 盎司的黄金委托被静默抹成 0,以及一张按合约规模 1/2500 计价的货币期货**:跨市场回测里,复合引擎每个市场只持有一个共享子引擎,但只有 `apply_slippage` 会刷新该子引擎自己的活动品种——于是 `round_size` 和 `calc_commission` 用的是最后一次同步进去的那个品种。50 盎司黄金按外汇 1000 单位的微型手计算,直接舍成 **0**;黄金期货被收了股指期货的费率制手续费(6.90)而不是它自己的定额(20.00);隔夜利息也按 100000 单位的标准手而非 100 盎司的金属手计算([#1370](https://github.com/HKUDS/Vibe-Trading/pull/1370))。另外 `_extract_product` 读不出品种码里带数字、或末位字母恰好也是月份码的合约:`6EZ4`、`6JH25`、`M2K`、`MYM2503`、`FESX2503` 全部落到默认乘数 50——而 `6E` 的真值是 125000([#1369](https://github.com/HKUDS/Vibe-Trading/pull/1369))。现在一律先对着乘数表按最长匹配解析,带月份的形式(`M2KZ4`)和前缀撞车(`SILZ4` 与 `SI`)一并覆盖。**修复:** 四个 Alpha Zoo 因子会在停牌日和自己声明的预热期内打印硬编码的 ±1 或 0——NaN 比较的结果是 `False` 而不是 NaN,三元分支于是落到常量上。`min_warmup_bars` 只是元数据、没有任何环节会裁掉那些行,真正把缺口挡在 IC 之外的是 `dropna()`,所以这些常量被当成真信号消费了([#1371](https://github.com/HKUDS/Vibe-Trading/pull/1371)、[#1372](https://github.com/HKUDS/Vibe-Trading/pull/1372)、[#1373](https://github.com/HKUDS/Vibe-Trading/pull/1373)、[#1374](https://github.com/HKUDS/Vibe-Trading/pull/1374))。用同一口径实测整个因子库,**还有 82 个因子是同一形状**;与其一个 PR 修一个,现在按 registry 级统一守卫记在 [#1376](https://github.com/HKUDS/Vibe-Trading/issues/1376)。策略发现的证据行此前对整轮只解析一次仓位规模而不是按 regime 分别解析,且一格无法解析的基准值就能让该轮产出的全部证据行消失([#1368](https://github.com/HKUDS/Vibe-Trading/pull/1368))。**新增:** 一个不断发起工具调用却拿不到新信息的运行,现在会在 8 轮后带着一条可见的恢复请求停下,而不是把整个预算耗在路径猜测上——被报告的那一次花了约 35 轮反复猜同样被拒的路径。相同调用从**第二次**失败起才被拒绝,而不是第一次,所以限流或超时后的一次诚实重试仍然会跑([#1363](https://github.com/HKUDS/Vibe-Trading/pull/1363),关闭 [#1353](https://github.com/HKUDS/Vibe-Trading/issues/1353))。感谢 [@Shizoqua](https://github.com/Shizoqua)、[@be-student](https://github.com/be-student) 和 [@nandofmike](https://github.com/nandofmike)!
|
||||
|
||||
<details>
|
||||
<summary>更早的新闻</summary>
|
||||
|
||||
- **2026-09-07** 🪙 **一笔 50 盎司的黄金委托被静默抹成 0,以及一张按合约规模 1/2500 计价的货币期货**:跨市场回测里,复合引擎每个市场只持有一个共享子引擎,但只有 `apply_slippage` 会刷新该子引擎自己的活动品种——于是 `round_size` 和 `calc_commission` 用的是最后一次同步进去的那个品种。50 盎司黄金按外汇 1000 单位的微型手计算,直接舍成 **0**;黄金期货被收了股指期货的费率制手续费(6.90)而不是它自己的定额(20.00);隔夜利息也按 100000 单位的标准手而非 100 盎司的金属手计算([#1370](https://github.com/HKUDS/Vibe-Trading/pull/1370))。另外 `_extract_product` 读不出品种码里带数字、或末位字母恰好也是月份码的合约:`6EZ4`、`6JH25`、`M2K`、`MYM2503`、`FESX2503` 全部落到默认乘数 50——而 `6E` 的真值是 125000([#1369](https://github.com/HKUDS/Vibe-Trading/pull/1369))。现在一律先对着乘数表按最长匹配解析,带月份的形式(`M2KZ4`)和前缀撞车(`SILZ4` 与 `SI`)一并覆盖。**修复:** 四个 Alpha Zoo 因子会在停牌日和自己声明的预热期内打印硬编码的 ±1 或 0——NaN 比较的结果是 `False` 而不是 NaN,三元分支于是落到常量上。`min_warmup_bars` 只是元数据、没有任何环节会裁掉那些行,真正把缺口挡在 IC 之外的是 `dropna()`,所以这些常量被当成真信号消费了([#1371](https://github.com/HKUDS/Vibe-Trading/pull/1371)、[#1372](https://github.com/HKUDS/Vibe-Trading/pull/1372)、[#1373](https://github.com/HKUDS/Vibe-Trading/pull/1373)、[#1374](https://github.com/HKUDS/Vibe-Trading/pull/1374))。用同一口径实测整个因子库,**还有 82 个因子是同一形状**;与其一个 PR 修一个,现在按 registry 级统一守卫记在 [#1376](https://github.com/HKUDS/Vibe-Trading/issues/1376)。策略发现的证据行此前对整轮只解析一次仓位规模而不是按 regime 分别解析,且一格无法解析的基准值就能让该轮产出的全部证据行消失([#1368](https://github.com/HKUDS/Vibe-Trading/pull/1368))。**新增:** 一个不断发起工具调用却拿不到新信息的运行,现在会在 8 轮后带着一条可见的恢复请求停下,而不是把整个预算耗在路径猜测上——被报告的那一次花了约 35 轮反复猜同样被拒的路径。相同调用从**第二次**失败起才被拒绝,而不是第一次,所以限流或超时后的一次诚实重试仍然会跑([#1363](https://github.com/HKUDS/Vibe-Trading/pull/1363),关闭 [#1353](https://github.com/HKUDS/Vibe-Trading/issues/1353))。感谢 [@Shizoqua](https://github.com/Shizoqua)、[@be-student](https://github.com/be-student) 和 [@nandofmike](https://github.com/nandofmike)!
|
||||
- **2026-09-06** 🛡️ **按一个永远不会成交的价格计算的限价买单,以及一次什么都没核验却返回 PASS 的审计**:MCP 下单闸门只用实时报价给数量单计价,于是一张两倍于市价的限价单通过了按报价计算的上限,实际可能以两倍于授权名义金额成交。现在按报价与限价中较差的一侧计价——这正是直连 SDK 路径早就在用的规则——无法解析的限价直接拒绝而不是放行([#1361](https://github.com/HKUDS/Vibe-Trading/pull/1361))。报告审计器会跳过所有没有取到数值的核验点,然后因为"没有失败项"而返回 **PASS**,等于给一份毫无证据支撑的报告盖章;现在零核验点一律 fail-closed([#1362](https://github.com/HKUDS/Vibe-Trading/pull/1362))。**修复:** 分析工具失败后仍能断言指标,而新加的引用豁免——对论文的夏普比率成立,对本次运行本就该观测的价格不成立——会让"分析师称 TSLA.US 最新成交价 412.35 美元。"在零工具调用下通过([#1338](https://github.com/HKUDS/Vibe-Trading/pull/1338),关闭 [#1336](https://github.com/HKUDS/Vibe-Trading/issues/1336));一行现金分红记录会让整个交易流水解析失败([#1356](https://github.com/HKUDS/Vibe-Trading/pull/1356));上下文压缩按工具名解除去重锁,导致清掉一个参数变体后其余变体仍被拦([#1358](https://github.com/HKUDS/Vibe-Trading/pull/1358));哈希链合规账本在 Windows 上拒绝首次追加([#1261](https://github.com/HKUDS/Vibe-Trading/pull/1261))。**新增:** Zerodha Kite Connect 使券商数达到 14 家——仅读取与模拟盘,因为 Kite 不提供运行时的模拟/实盘判别器([#1193](https://github.com/HKUDS/Vibe-Trading/pull/1193));Nobitex 与 Wallex 带来伊朗托曼计价交易对,数据源增至 27 个,且两者都不会静默退化到美元计价的场所([#1263](https://github.com/HKUDS/Vibe-Trading/pull/1263));原生 Anthropic 调用会缓存静态的工具与系统提示前缀,不再每轮按全价重发([#1366](https://github.com/HKUDS/Vibe-Trading/pull/1366))。感谢 [@cgycorey](https://github.com/cgycorey)、[@ashutoshsinghpr7](https://github.com/ashutoshsinghpr7)、[@saju01](https://github.com/saju01)、[@he-yufeng](https://github.com/he-yufeng)、[@Emad211](https://github.com/Emad211)、[@averatec0773](https://github.com/averatec0773)、[@birdxs](https://github.com/birdxs) 和 [@AirHua-byte](https://github.com/AirHua-byte)!
|
||||
- **2026-09-05** 🔓 **模型编造的价格,英文放行、中文却被拦下;以及一个再也读不回自己已取数据的智能体**:接地闸门只认 `close` 不认 **`closed`**,于是零工具调用的 `The stock closed at 412.35.` 直接通过,而同一句编造的中文(`该股收盘 412.35。`)被拒。`last traded at` 和 `quoted at` 根本没有规则,中文侧则有镜像漏洞 —— `成交价` / `最新价` / `股价` / `收报` 全部漏掉。两边词表现已补齐,英文形式必须跟 "at",成交量和并购措辞不会误判;新增测试断言两种语言对同一句给出**相同**判定,而不是各测各的。另一件事:某次会话成功取到了财报、资金流、融资盘和研报数据,随后这些结果为腾出上下文被清除,而去重账本仍拒绝重新获取 —— 单次运行被拦 44 次,最终对已经拿到过的数据回答"未取得基本面数据"。现在清除结果会同时解封该工具,账本按参数而非工具名计键,token 预算也真正计入工具调用参数,不再把 100 KB 负载算成十个 token([#1349](https://github.com/HKUDS/Vibe-Trading/pull/1349)、[#1341](https://github.com/HKUDS/Vibe-Trading/pull/1341)、[#1352](https://github.com/HKUDS/Vibe-Trading/pull/1352),关闭 [#1343](https://github.com/HKUDS/Vibe-Trading/issues/1343))。**修复:** 在 aarch64 上,从 Web UI 发起的每一次回测都段错误 —— 沙箱资源限制在多线程服务进程 fork 出的子进程里执行 Python,这是 POSIX 未定义行为;现改为 exec 之后再施加(关闭 [#1355](https://github.com/HKUDS/Vibe-Trading/issues/1355))。`GC=F` 与 `XAUUSD` 被判为 A 股([#1280](https://github.com/HKUDS/Vibe-Trading/pull/1280));`BRK.B.US` 等带点号的类别股取回空数据([#1351](https://github.com/HKUDS/Vibe-Trading/pull/1351));满仓再平衡遇手续费超支时直接中止而非按比例缩放([#1344](https://github.com/HKUDS/Vibe-Trading/pull/1344),关闭 [#1274](https://github.com/HKUDS/Vibe-Trading/issues/1274));百分点变动 —— `3.6pp`、`3.6 个百分点`、`250 基点` —— 被读成报价([#1346](https://github.com/HKUDS/Vibe-Trading/pull/1346));`BTCUSDT` 这类合并写法的加密对无法识别,而现货铂金却被解析成并不存在的加密对([#1265](https://github.com/HKUDS/Vibe-Trading/pull/1265));策略库历史在时间戳并列时返回最旧优先([#1347](https://github.com/HKUDS/Vibe-Trading/pull/1347));Codex 适配器丢弃了提供方上报的模型名([#1348](https://github.com/HKUDS/Vibe-Trading/pull/1348))。**新增:** 对话中先前给出的市场语境可用于收窄符号解析,由 `VIBE_CONTEXTUAL_IDENTITY_CONSTRAINTS` 控制([#1269](https://github.com/HKUDS/Vibe-Trading/pull/1269));投委会 worker 拿到其提示词本就假定存在的基本面数据面板([#1345](https://github.com/HKUDS/Vibe-Trading/pull/1345));基于录制对比的确定性 USD-M 容差校准([#1248](https://github.com/HKUDS/Vibe-Trading/pull/1248))。感谢 [@nandofmike](https://github.com/nandofmike), [@atomfive](https://github.com/atomfive), [@thisisjun786](https://github.com/thisisjun786), [@cgycorey](https://github.com/cgycorey), [@saju01](https://github.com/saju01), [@he-yufeng](https://github.com/he-yufeng), [@aminak58](https://github.com/aminak58), [@AirHua-byte](https://github.com/AirHua-byte), [@lorenzozanee](https://github.com/lorenzozanee), [@ethanstoner](https://github.com/ethanstoner), [@Shizoqua](https://github.com/Shizoqua)!
|
||||
- **2026-09-04** 🩺 **每一次 Claude 5 运行都在第一个请求就失败,而停牌持仓被重新按你的买入成本计价**:当前 Anthropic SDK 下 `langchain-anthropic` 会把 `temperature` 挪进 `extra_body`,而我们的自愈只弹掉了顶层的那个键 —— 于是重试原样送回 API 刚刚拒绝的字段,`claude-sonnet-5` / `claude-opus-5` 上的每一次运行都在首次调用就死掉([#1330](https://github.com/HKUDS/Vibe-Trading/pull/1330),closes [#1329](https://github.com/HKUDS/Vibe-Trading/issues/1329))。回测里,持有超过前向填充上限的仓位会被重新按入场价计价:净值打印出一段背后没有任何市场事件的回撤,再平衡的仓位测算也跑在这个幻影价上。现在无论停牌多久都按最后成交价计价,而下单成交仍然拒绝陈旧价格([#1332](https://github.com/HKUDS/Vibe-Trading/pull/1332),closes [#1318](https://github.com/HKUDS/Vibe-Trading/issues/1318))。**修复:**提交时的调整有三条路可以放宽你已批准的 mandate —— 字符串形式的数字绕过数值检查、`True` 被当作数字通过、标的白名单根本没有比较分支;同时纯现金(cash-only)是杠杆轴的下界而不是非法类型,所以最保守的 mandate 依然提交得上去([#1285](https://github.com/HKUDS/Vibe-Trading/pull/1285))。计时器现在能挺过切换页面、刷新和从历史里重开会话([#1340](https://github.com/HKUDS/Vibe-Trading/pull/1340),closes [#1339](https://github.com/HKUDS/Vibe-Trading/issues/1339)),前端与桌面两个 lock 文件里 7 条未修的 npm 安全通告也已打上补丁。感谢 [@averatec0773](https://github.com/averatec0773)、[@he-yufeng](https://github.com/he-yufeng) 和 [@Jackzigen](https://github.com/Jackzigen)!
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: vibe-trading
|
||||
version: 0.1.14
|
||||
version: 0.1.15
|
||||
description: Professional finance research toolkit — backtesting (10 engines + benchmark comparison panel), factor analysis, Alpha Zoo (462 pre-built alphas across qlib158/alpha101/gtja191/academic/fundamental), options pricing, 90 finance skills, 30 multi-agent swarm teams, Trade Journal analyzer, and Shadow Account (extract → backtest → render) across 27 market-data sources (tushare, yfinance, okx, binance, akshare, baostock, tencent, mootdx, ccxt, futu, mt5, tickerall, local, eastmoney, sina, stooq, yahoo, pykrx, india_broker, qveris, longbridge, nobitex, wallex, plus optional-key finnhub/alphavantage/tiingo/fmp).
|
||||
dependencies:
|
||||
python: ">=3.11"
|
||||
|
||||
@@ -183,7 +183,9 @@ def test_already_up_to_date_no_pip(monkeypatch, capsys: pytest.CaptureFixture[st
|
||||
"""Latest PyPI version <= installed version: exit 0, no pip call at all."""
|
||||
calls, fake_run = _fake_subprocess()
|
||||
monkeypatch.setattr(update_mod.subprocess, "run", fake_run)
|
||||
# "0.0.1" is below the repo's dev version (0.1.14), and also below any real release.
|
||||
# "0.0.1" is below the repo's dev version, and also below any real release.
|
||||
# Deliberately not naming the current one: a version in a comment has no
|
||||
# guard and goes stale at the next bump.
|
||||
_monkeypatch_upgrade_env(monkeypatch, latest="0.0.1")
|
||||
|
||||
assert update_mod.cmd_update() == update_mod.EXIT_OK
|
||||
|
||||
Generated
+2
-2
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "vibe-trading-frontend",
|
||||
"version": "0.1.14",
|
||||
"version": "0.1.15",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "vibe-trading-frontend",
|
||||
"version": "0.1.14",
|
||||
"version": "0.1.15",
|
||||
"dependencies": {
|
||||
"@fontsource/inter": "^5.3.0",
|
||||
"@fontsource/jetbrains-mono": "^5.3.0",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "vibe-trading-frontend",
|
||||
"private": true,
|
||||
"version": "0.1.14",
|
||||
"version": "0.1.15",
|
||||
"type": "module",
|
||||
"engines": {
|
||||
"node": ">=22.22.0"
|
||||
|
||||
@@ -12,7 +12,7 @@ const sessions = [
|
||||
vi.mock("react-i18next", () => ({
|
||||
useTranslation: () => ({
|
||||
t: (key: string) => ({
|
||||
"app.version": "v0.1.14",
|
||||
"app.version": "v0.1.15",
|
||||
"layout.agent": "Agent",
|
||||
"layout.alphaZoo": "Alpha Zoo",
|
||||
"layout.cancel": "Cancel",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"app": {
|
||||
"version": "v0.1.14"
|
||||
"version": "v0.1.15"
|
||||
},
|
||||
"layout": {
|
||||
"home": "الرئيسية",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"app": {
|
||||
"version": "v0.1.14"
|
||||
"version": "v0.1.15"
|
||||
},
|
||||
"charts": {
|
||||
"noPriceData": "Noch keine Kursdaten für dieses Symbol",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"app": {
|
||||
"version": "v0.1.14"
|
||||
"version": "v0.1.15"
|
||||
},
|
||||
"charts": {
|
||||
"noPriceData": "No price data for this symbol yet",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"app": {
|
||||
"version": "v0.1.14"
|
||||
"version": "v0.1.15"
|
||||
},
|
||||
"charts": {
|
||||
"noPriceData": "Aún no hay datos de precio para este símbolo",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"app": {
|
||||
"version": "v0.1.14"
|
||||
"version": "v0.1.15"
|
||||
},
|
||||
"layout": {
|
||||
"home": "ホーム",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"app": {
|
||||
"version": "v0.1.14"
|
||||
"version": "v0.1.15"
|
||||
},
|
||||
"layout": {
|
||||
"home": "홈",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"app": {
|
||||
"version": "v0.1.14"
|
||||
"version": "v0.1.15"
|
||||
},
|
||||
"charts": {
|
||||
"noPriceData": "Ainda não há dados de preço para este símbolo",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"app": {
|
||||
"version": "v0.1.14"
|
||||
"version": "v0.1.15"
|
||||
},
|
||||
"layout": {
|
||||
"home": "首页",
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
[project]
|
||||
name = "vibe-trading-ai"
|
||||
version = "0.1.14"
|
||||
version = "0.1.15"
|
||||
description = "Natural-language finance research AI agent with backtesting"
|
||||
requires-python = ">=3.11"
|
||||
license = "MIT"
|
||||
|
||||
Reference in new issue
Block a user