Yahoo dividend adjustment, requested-vs-executed rebalance counts, the
calendar rebalance mask and the survivorship disclosure, plus the batch
of fixes. Notes that sina and longbridge still serve unadjusted prices
and points at #1301 rather than claiming the chain now speaks one
caliber. 2026-08-28 rolls into the folded section.
heston_price used e^{-iuk} in the Lewis integrand where the formula needs
e^{+iuk}. The consequence is not a small numerical error: it inverts the
volatility skew. A leverage-effect rho of -0.6 priced 120-strike calls at
4.668 where Monte Carlo says 4.246, and 90-strike calls at 13.719 where MC
says 14.204 — rich where it should be cheap, in both directions. The
corrected sign lands inside 2 standard errors of MC in all four cases.
Nothing in the incoming suite could see it. With sigma_v -> 0 the centered
characteristic function is real, so the Black-Scholes limit is bit-identical
under either sign; the Moodley benchmark and the put-call parity check are
both at the money, where k is 0 and the factor is 1. Two tests now pin the
skew direction, and a comment marks the sign as load-bearing.
Badge reconciliation: five PRs each bumped the function count from the same
286 base (289/290/294/290/287) and none touched the module count, which is
how four new modules landed while the badge still said nineteen. Measured:
306 functions across 23 modules, set across all six READMEs, with the four
new modules added to the module table. The badge check only ever asserted
the function half, so the module half is now guarded too.
Implement semi-analytical European option pricing under the Heston stochastic
volatility model via numerical quadrature of the continuous characteristic
function (Lewis 2001 / Albrecher et al. 2007 formulation).
Signed-off-by: santhreal <64453045+santhreal@users.noreply.github.com>
- 08-24 news entry (IBKR official MCP portfolio source, scheduled_research
confirmation tool, valuation/market-data/feishu/VaR-doc fixes) in all six
READMEs; 08-21 folds into earlier-news to keep three visible
- mirror #1188's feishu login persistence sentence into the five translations
- mirror #1187's new REST rows and a condensed scheduled_research paragraph
into the five translations
- README.md IM confirmation sentence now names both accepted token spellings
#1178 repointed README.md, SKILL.md and the seed; the zh/ja/ko/ar/es
READMEs still showed the unpublished /mcp URL. IBKR's own AI-integration
page documents https://api.ibkr.com/v1/api/mcp-public as the endpoint to
enter in an MCP client.
The 2026-08-22 bullet was written this morning for the six-PR batch and
the Portfolio landing was appended to it as one sentence. The page is the
day's headline; rewrite the bullet in all six READMEs so it leads, with
the six fixes under Fixed.
Replaces the 127-line English / 48-line Chinese walkthrough from #1072
with a ~25-line section present in every README (en/zh/ja/ko/es/ar):
what the Portfolio page aggregates, which profiles are eligible, that a
failed source is excluded rather than carried forward, where snapshots
and settings live, the local read-only connector plugins and the
[keyring] extra, the CLI, and that nothing on this path can place an
order. Restores the IBKR MCP example URL to /v1/api/mcp. The repository
tree's 'auto-discovered agent tools' line said 97 while the keyless
registry measured 105 before this PR and 106 after it; it now reads 106
in all six files and test_readme_counts pins it to the measured count
with the credential gates closed, so it cannot drift silently again.
Adds the Portfolio sentence and @goatyyc to today's news bullet.
Six PRs: Alpha Zoo returns keep NaN across gaps, per-connection MCP goal
sessions, memory GC/compression index cleanup, swarm cancellation reaching
the in-flight worker, MCP research-report date window, and options-chain
expiration validation. The 08-19 entry moves into Earlier news so three
stay visible.
Fourteen PRs: the bash tree-kill and stall watchdog, compaction keeping the
run's verification records, Tencent pagination, swarm replay, Market Watch
verdicts, and quantlib reaching 286 functions. The 08-18 entry moves into
Earlier news so three stay visible.
Each of the nine PRs in this batch bumped the same badge from the same base,
so the individually correct numbers were all wrong once stacked. 286 is what
_quantlib_export_count() reports on the merged tree; the module count is
unchanged because every PR extends an existing module.
Rolls up 272 commits / 74 merged pull requests since 0.1.13.
Run Detail grows four analysis tabs (factor research, positions structure,
tearsheet, research dashboard) and the Web UI gains an Options Lab, all
reading artifacts a run already writes. `smartmoneyconcepts` moves to an
opt-in `[smc]` extra so an Intel-Mac install stops becoming a CMake source
build for llvmlite. Strategy Discovery lands both phases; scheduled research
delivers itself through a leased outbox and persists each monitor's verdict.
MCP grows to 74 tools. Six READMEs carry the release news and the 30
contributors of this cycle.
Two published version strings had no guard and were still on 0.1.13 after
every other declaration moved: `agent/SKILL.md`, the manifest ClawHub serves
and no build step touches because it is not in the wheel, and the Docker
image's `org.opencontainers.image.version` label. The whole suite stayed
green. `test_release_version_consistency.py` now enumerates all eleven
declaration sites against pyproject rather than spot-checking remembered
ones, and globs the locale directory so a new language is covered the day it
lands. The desktop shell keeps its own 0.3.0 track on purpose — it has no
updater, and 0.3.1 is issue #1016's validation target, not a shipped build.
Implements #969 Phase 2 over the Phase 1 facade (#978). The evidence cache
is no longer empty-by-construction and no longer silent about age:
- refresh_strategy_evidence: agent tool (primary, scheduler-reachable) +
MCP wrapper + 'vibe-trading strategy-evidence refresh --manifest' CLI.
Manifest-driven only — runs carry no attribution, so explicit
{strategy_id, run_dir, position_size} specs are the honest path; entries
outside the runtime runs root / allowed run roots are skipped with a
stable path-outside-allowed-roots reason. Writes only the disposable
facade-owned cache.
- backtest-diagnose hookup: the skill's Hard-Gate Checklist becomes the
evidence ingestion gate — state.json success, metrics.csv present,
trade_count > 0, equity present and NaN-free, each with a stable
hard-gate:* skip token. NaN-equity runs are refused entirely instead of
yielding partial-curve evidence (fixes the Phase-1 silent-skip latent).
- atomic rebuild: compute all rows first, then one transaction swaps the
store — a failed rebuild can no longer leave the cache empty.
- decay status surfaced in query_strategies / get_strategy_evidence:
freshness computed at read time from the evidence-window age
(fresh/aging/stale, 90/180-day thresholds tied to the quarterly
re-backtest cadence; last_verified reported but never gating). Stale rows
fail closed out of default recommendations (include_stale opt-out);
sdm:* rows mirror the SDM lifecycle (decayed/disabled never recommended,
sdm-lifecycle: prefix); unparseable windows fail closed to stale.
Decay is never persisted — a stored decay field would go stale by
definition.
- docs + count sync: strategy-discovery SKILL.md gains the Decay &
Freshness Contract and Populating & Refreshing Evidence sections;
backtest-diagnose SKILL.md documents the gate hookup; phantom-guard test
now asserts every tool named in the SKILL.md recipe is registered;
MCP tools 73 -> 74 across five READMEs + agent/SKILL.md (65 -> 66
decorators).
Three fixes landed today, led by the one that touches a user's own state:
the project's test suite was appending fabricated order_rejected records to
the real live audit ledger -- on every platform, not only Windows -- because
conftest.py had no config-root sandbox and modules bake the home-derived
path at import time. Also covers the xirr underflow past ~51 years and the
backtest archive merging two runs' artifacts into one report.
Six community fixes landed today, led by two user-visible bugs: Anthropic runs dying on recovery paths with the multiple-system-messages error, and search_symbol reporting empty results as healthy while every downstream data tool hard-refused with identity_required. Also covers reasoning-effort forwarding on the Anthropic branch, the Tencent loader SSL fix, the gross_profit fallback revival, and the swarm truncation unification.
Signed-off-by: Haozhe Wu <haozhe_wu@connect.hku.hk>
Adds the execution rule book that lets the `.VN` data path from the previous
commit produce a meaningful backtest, and classifies `.VN` symbols now that
there is an engine to receive them. Vietnam gets a dedicated engine rather
than a GlobalEquity profile, following India and Korea: none of its rules —
the settlement hold, the board lot, the band arithmetic — are expressible as
parameters on the global model.
Settlement is the T+1.5 cycle in force since August 2022, under which shares
are credited around midday on T+2 and can be sold that afternoon. On daily
bars that is a two-session hold, counted from the position's entry bar rather
than from calendar dates, because a Friday buy settles on Tuesday and calendar
arithmetic would release it a session early. The lag is configurable so the
exchange's announced move to T+1 can be modelled without a code change.
Prices are quoted in whole VND on a three-tier tick grid, so the ±7% band is
computed the way the exchange publishes it — the ceiling truncated down onto
the grid and the floor rounded up — leaving both bounds tradeable rather than
one tick outside the band. Order sizes floor to whole 100-share lots: odd lots
trade in a separate session that a daily bar cannot represent, so a sub-lot
order is not executable at the continuous-session price. Shorting is refused
at construction, as the cash market provides no mechanism for it.
The sell-side cost carries the 0.1% transfer tax on proceeds, which the 2026
personal-income-tax overhaul left in place for listed securities; the 20%
gain-based rate effective 2026-07-01 applies to unlisted capital transfers.
Rates are revised periodically, so the `vn_*` keys are configurable and worth
checking against the current schedule before trusting absolute cost figures.
Tests cover the tick grid and band arithmetic against a published worked
example, the settlement hold at each elapsed-session count, lot flooring,
band-locked bars, the cost stack, and tick-quantized slippage.
Signed-off-by: Pham Van Ngoan <ngoanpham1196@gmail.com>
Leads with the reasoning-effort fix rather than the two new pages, because it is
the one users could already have hit: the setting existed, was documented, and
did nothing on almost every provider.
Covers the seven merges of the day - reasoning effort across both transports
with a verified allowlist, bounded grounding recovery, the Options Lab and
tearsheet pages, tickerall as the 25th market-data source, and Novita AI plus
GitHub Copilot as built-in providers. The vite 8 bump is a dev dependency and is
left out.
One conflict: main had added Novita AI to the README provider line while this
branch added GitHub Copilot. Kept both.
Also completes two lists this branch left partly filled, which is what CI was
failing on:
- `es.json` was missing `providerUsesManagedAuth` and `authentication`. This
branch was opened before the Spanish locale existed (#1087, 2026-08-13) and
added the pair to the other five, so the type check compared es to en and
found two keys short — `error TS2322 ... is missing the following properties`.
- The five non-English READMEs still listed the providers without GitHub
Copilot; only the English one was updated.
Two conflicts, both resolved toward main:
- README provider line: main had added ModelScope while this branch added
Novita AI. Kept both.
- `test_cli_init.py`: this branch bumped the hardcoded menu numbers 18/19
because inserting Novita shifts the list. Main had since replaced those
literals with `_provider_choice_number(<provider>)`, which looks the number
up from `_PROVIDER_CHOICES` and does not need touching when a provider is
inserted. Took main's helper, so the bumped literals are no longer needed.
Also lists Novita AI in the other five READMEs. The PR added it to the English
provider line only; the same sentence lives in all six and the count-consistency
tests compare them to each other, so five locales would have advertised a
shorter list than the code ships.
Leads with the backtest execution-truth fix, since positions.csv having held
target rather than filled weights meant a report could overstate exposure while
the same targets fed the invested-weight metrics and the risk x-ray. Then the
research dashboard and Spanish as the sixth UI language, with the rest of the
day's eight merged PRs compressed to one clause each.
Demotes the 2026-08-10 v0.1.13 entry into <details> so exactly three stay
visible, which is the convention for this section.
Registers "es" as a sixth supported UI language (i18next resource
bundle, lazy loader, RTL/parity test), and adds a full Spanish
translation of README.md as README_es.md, following the same
heading/anchor conventions as the existing zh/ja/ko/ar translations.
Adds the Español nav link to all five existing README variants.
Signed-off-by: daviddaco1 <daviddaco1@hotmail.com>
Prepares the 0.1.13 release and fixes the defects found while verifying its
claims. The pieces interlock — the documented counts are the code's surface —
so they land together rather than as commits that fail their own tests.
Code:
- attribution and impact carried no __all__, and quantlib_call dispatches on
__all__ alone, so the tool listed ZERO functions for both while the package
docstring advertised them. Both now export; exposed callables 184 -> 195.
- Six read-only analytics tools reach MCP for the first time (64 -> 70):
quantlib_call, cashflow_performance, orderbook_depth, sentiment,
technical_indicators, get_fundamentals. They use the existing mirrored path,
which refuses any class whose is_readonly is not True, so order-placing tools
remain structurally unreachable over MCP.
Tests that measured a proxy instead of the truth:
- The manifest tool count was derived from @mcp.tool decorators, which ignores
every mirrored tool. Four institutional-research tools were live over MCP and
absent from the published SKILL.md, and the contract test asserted that
absence was correct. Both now measure mcp.list_tools().
- test_every_allowlisted_module_actually_imports only asserted ok is True, which
can never catch an empty listing. A new guard fails when any allowlisted
module exposes no callables; removing an __all__ names exactly the two
offenders.
- The README count tests only proved the five files agreed with each other and
with a pinned constant, so a uniform error was invisible — that is how the
broker count sat at 12 after eToro shipped as the 13th. The pin is now
anchored to the profile registry, every connector must appear in the table,
and the quantlib export count joins the verified badges.
Docs, corrected against measurement rather than the previous text:
- merged PRs since 0.1.12: 42 -> 162 (42 counted merge commits only; squash
merges leave none)
- auto-discovered agent tools in the project tree: 68 -> 94
- broker connectors: 12 -> 13, with eToro added to the table in all five READMEs
- quantlib: 249 across 17 modules -> 265 across 19, now exactly the allowlist
- SKILL.md: skills 88 -> 89, MCP tools 60 -> 70, python ">=3.11" -> ">=3.11,<3.14"
to match pyproject
- zh/ja/ko/ar gain the eToro connector section and the
CONTENT_FILTER_WARNING_THRESHOLD row that only English carried
- v0.1.13 news entry and contributor credits across all five READMEs
Full suite 10147 passed / 54 skipped / 0 failed (baseline on a clean tree was
10140 / 54 / 0; the +7 are the new guards). CI grep gates pass.
Scope #1024 to its Canadian-market objective, retain the contributor history, and complete symbol routing, CAD-aware backtesting, Yahoo fallback, grounding, benchmark selection, documentation, and regression coverage.
Co-authored-by: Will Liao <liaotoca@yahoo.com>