Commit Graph
1119 Commits
Author SHA1 Message Date
Santh ae1cb2d19e fix(loaders): accept lowercase 1h/4h in local resample rules (#832)
Connector-style 1h/4h missed _RESAMPLE_RULES and returned native bars
unchanged, while 1H/4H correctly downsampled.

Signed-off-by: santhreal <64453045+santhreal@users.noreply.github.com>
2026-07-24 22:11:52 +08:00
Santh c4e73777fe fix(loaders): map yfinance lowercase 4h/1w like 4H/1W (#833)
Lowercase 4h/1w fell through to .lower() as invalid Yahoo tokens while 4H/1W already mapped to 1h/1wk.

Signed-off-by: santhreal <64453045+santhreal@users.noreply.github.com>
2026-07-24 22:11:47 +08:00
Santh 211baefbf9 fix(loaders): accept lowercase 1d/1w in Longbridge interval map (#834)
Loader rejected 1d/1w while the connector already maps them to Day/Week.

Signed-off-by: santhreal <64453045+santhreal@users.noreply.github.com>
2026-07-24 22:11:43 +08:00
Santh 32290a22c8 fix(loaders): map MT5 1W/1M and reject unknown intervals (#835)
* fix(loaders): map MT5 1W/1M and reject unknown intervals

Unknown intervals silently fell back to daily bars; week/month tokens missed the map while the connector already exposes W1/MN1.

Signed-off-by: santhreal <64453045+santhreal@users.noreply.github.com>

* fix(loaders): tighten MT5 unknown-interval reject comment

---------

Signed-off-by: santhreal <64453045+santhreal@users.noreply.github.com>
2026-07-24 22:11:39 +08:00
Santh 7d4767c96d fix(loaders): accept lowercase 1d/1w in AKShare daily map (#836)
1d/1w missed the daily period map while 1D/1W already mapped to daily/weekly.

Signed-off-by: santhreal <64453045+santhreal@users.noreply.github.com>
2026-07-24 22:11:33 +08:00
Santh 6c743bb4d2 fix(loaders): treat lowercase 1d as Tushare daily bars (#837)
* fix(loaders): treat lowercase 1d as Tushare daily bars

interval=1d missed the exact 1D daily gate and fell into the minute path, which returned empty.

Signed-off-by: santhreal <64453045+santhreal@users.noreply.github.com>

* fix(loaders): tighten Tushare daily-alias gate comment

---------

Signed-off-by: santhreal <64453045+santhreal@users.noreply.github.com>
2026-07-24 22:11:29 +08:00
Santh 6d5c1678a6 fix(loaders): accept lowercase 1d/1w in Eastmoney KLT map (#838)
1d/1w missed KLT_BY_INTERVAL while 1D/1W already mapped to daily/weekly codes.

Signed-off-by: santhreal <64453045+santhreal@users.noreply.github.com>
2026-07-24 22:11:24 +08:00
Dvir Arad 170722e31b docs: fix broken Contributing nav anchor in README (#840)
The header nav links to #-contributing, but the 'Contributing' heading
has no leading emoji, so GitHub renders its anchor as #contributing (no
leading hyphen). Clicking 'Contributing' in the nav therefore does not
scroll to the section. README_ja.md already uses the correct #contributing
target; align README.md and README_zh.md with it.

Signed-off-by: dvir arad <dvirarad@gmail.com>
2026-07-24 22:10:46 +08:00
Haozhe Wu 43c444292c docs(readme): add 2026-07-23 news across all 5 READMEs 2026-07-23 13:44:46 +08:00
Haozhe Wu 27e6dbde0f Merge PR #796: feat(alpha): expose the strict bench gate via alpha bench --strict
feat(alpha): expose the strict bench gate via alpha bench --strict
2026-07-23 11:59:55 +08:00
Haozhe Wu 33448d7d7a Merge PR #733: feat(memory): implement Phase 1 quality-driven lifecycle management
feat(memory): implement Phase 1 quality-driven lifecycle management
2026-07-23 11:39:34 +08:00
Haozhe Wu 71ed54d91f Merge PR #794: fix(journal): treat numpy int serials as Excel days in Tonghuashun
fix(journal): treat numpy int serials as Excel days in Tonghuashun
2026-07-23 11:24:05 +08:00
Haozhe Wu f1ed0cbba6 Merge PR #793: fix(journal): treat numpy int serials as Excel days in Futu Date
fix(journal): treat numpy int serials as Excel days in Futu Date
2026-07-23 11:23:59 +08:00
Haozhe Wu f4c5a78223 Merge PR #778: fix(journal): normalize Excel float YYYYMMDD dates in eastmoney parser
fix(journal): normalize Excel float YYYYMMDD dates in eastmoney parser
2026-07-23 11:23:54 +08:00
Haozhe Wu 6e4b5aedb4 Merge PR #795: feat(backtest): rebalance notes artifact + metrics (Portfolio Studio slice)
feat(backtest): rebalance notes artifact + metrics (Portfolio Studio slice)
2026-07-23 11:23:50 +08:00
Haozhe Wu e6148b0938 Merge PR #792: fix(loaders): accept lowercase 1h/4h/1d MT5 intervals
fix(loaders): accept lowercase 1h/4h/1d MT5 intervals
2026-07-23 11:23:46 +08:00
Haozhe Wu e10fd912dd Merge PR #791: fix(longbridge): accept project-style 1H/4H period tokens
fix(longbridge): accept project-style 1H/4H period tokens
2026-07-23 11:23:42 +08:00
Haozhe Wu 599e714a7e Merge PR #790: fix(shoonya): map 4h/1H periods and reject unknown intervals
fix(shoonya): map 4h/1H periods and reject unknown intervals
2026-07-23 11:23:39 +08:00
Haozhe Wu 5ad54fd16d Merge PR #789: fix(connectors): map OKX 1H/4H instead of falling to 1D
fix(connectors): map OKX 1H/4H instead of falling to 1D
2026-07-23 11:23:35 +08:00
Haozhe Wu 2cb4f90f71 Merge PR #788: fix(connectors): keep Alpaca 1H as hour bars, not day
fix(connectors): keep Alpaca 1H as hour bars, not day
2026-07-23 11:23:30 +08:00
Haozhe Wu 2db128c862 Merge PR #787: fix(cli): keep empty edge columns in terminal md tables
fix(cli): keep empty edge columns in terminal md tables
2026-07-23 11:23:27 +08:00
Haozhe Wu ceaa899487 Merge PR #786: fix(channels): keep empty edge columns in Feishu md tables
fix(channels): keep empty edge columns in Feishu md tables
2026-07-23 11:23:23 +08:00
Haozhe Wu 2e82d8e2f6 Merge PR #785: fix(loaders): reject unsupported akshare intervals instead of daily
fix(loaders): reject unsupported akshare intervals instead of daily
2026-07-23 11:23:19 +08:00
Haozhe Wu f359b71154 Merge PR #784: fix(connectors): keep Tiger 1H/4H as hour bars, not day
fix(connectors): keep Tiger 1H/4H as hour bars, not day
2026-07-23 11:23:15 +08:00
Haozhe Wu f10cb68660 Merge PR #783: fix(loaders): map CCXT 1W/1M intervals instead of silent daily
fix(loaders): map CCXT 1W/1M intervals instead of silent daily
2026-07-23 11:23:12 +08:00
Haozhe Wu 17414f7415 Merge PR #782: fix(loaders): keep yfinance 1M as monthly, not minute
fix(loaders): keep yfinance 1M as monthly, not minute
2026-07-23 11:23:08 +08:00
Haozhe Wu bebdb2dc61 Merge PR #781: fix(loaders): reject unsupported india-broker intervals
fix(loaders): reject unsupported india-broker intervals
2026-07-23 11:23:04 +08:00
Haozhe Wu f401c3640a Merge PR #780: fix(validation): accept blank holding_days in trades.csv
fix(validation): accept blank holding_days in trades.csv
2026-07-23 11:23:01 +08:00
Haozhe Wu 7cf43195ff Merge PR #779: fix(tools): keep report_audit verdict JSON finite
fix(tools): keep report_audit verdict JSON finite
2026-07-23 11:22:58 +08:00
Haozhe Wu fec31c1ce5 Merge PR #776: fix(mt5): convert numpy scalars to native Python types for JSON serialization
fix(mt5): convert numpy scalars to native Python types for JSON serialization
2026-07-23 11:22:54 +08:00
Haozhe Wu 08c84e8f0f Merge PR #772: fix(fundamentals): dedup restated rows and prevent period regression in PIT snapshots
fix(fundamentals): dedup restated rows and prevent period regression in PIT snapshots
2026-07-23 11:22:51 +08:00
Yufeng He 23174f28b7 feat(alpha): expose the strict bench gate via alpha bench --strict
The strict bench runner (mandatory same-universe random control plus an
optional train/test OOS split) has shipped since 0.1.9 but nothing
invoked it: no CLI flag, no API route, no tool reference, so the only
gate users could run was the raw-IC one its own docstring critiques.
This wires it into the CLI: --strict routes the bench through
bench_runner_strict with the random control on, --oos-split and
--random-seeds tune the gate, the pre-flight banner shows the mode, and
the JSON envelope carries the strict category counts. Passing
--oos-split/--random-seeds without --strict is rejected up front so
they cannot silently no-op.

Fixes #773.

Signed-off-by: Yufeng He <40085740+he-yufeng@users.noreply.github.com>
2026-07-23 11:06:34 +08:00
Yufeng He a6a57b2562 feat(backtest): rebalance notes artifact + metrics (Portfolio Studio slice)
Last backend slice of the Portfolio Studio epic: per-rebalance turnover
and weight-drift notes computed from the target position frame, so they
land for every optimizer and for the no-optimizer baseline. Writes
artifacts/rebalance_notes.json (strict JSON, same writer discipline as
validation.json) and a Markdown twin, and surfaces rebalance_count /
rebalance_turnover_mean / rebalance_turnover_max as scalar metrics that
the run card picks up on its own.

Signed-off-by: Yufeng He <40085740+he-yufeng@users.noreply.github.com>
2026-07-23 07:06:56 +08:00
santhreal 0f7983e595 fix(journal): treat numpy int serials as Excel days in Futu Date
iterrows yields np.int64 for int64 Date columns; use is_number so Excel
day serials convert instead of stringifying or ns-epoch parsing.

Signed-off-by: santhreal <64453045+santhreal@users.noreply.github.com>
2026-07-22 12:44:46 -07:00
santhreal b11ccc7c8b fix(journal): treat numpy int serials as Excel days in Tonghuashun
iterrows yields np.int64 for int64 成交时间 columns; isinstance(int)
missed them and bare pd.to_datetime treated the value as ns-epoch.

Signed-off-by: santhreal <64453045+santhreal@users.noreply.github.com>
2026-07-22 12:44:43 -07:00
santhreal ae435887ee fix(journal): normalize Tonghuashun Excel serial 成交时间 to ISO
同花顺 exports opened via Excel leave 成交时间 as a float serial; stringifying
it produced values like "45321.375" instead of a real timestamp. Convert
Excel day serials with pd.to_datetime before storing datetime.

Signed-off-by: santhreal <64453045+santhreal@users.noreply.github.com>
2026-07-22 12:39:35 -07:00
santhreal b7b942fb1d fix(journal): normalize Futu Excel serial Date/Time to ISO
Futu exports opened via Excel leave Date/Time as float serials; stringifying
them produced values like "45321.0 0.375" instead of a real timestamp.
Convert Excel day serials with pd.to_datetime before building datetime.

Signed-off-by: santhreal <64453045+santhreal@users.noreply.github.com>
2026-07-22 12:39:33 -07:00
santhreal 98f8544ac6 fix(loaders): accept lowercase 1h/4h/1d MT5 intervals
The MT5 loader only listed 1H/4H/1D, so trading-convention 1h fell through
to the daily fallback while the MT5 connector already maps 1h to H1.
Add the lowercase aliases.

Signed-off-by: santhreal <64453045+santhreal@users.noreply.github.com>
2026-07-22 12:39:32 -07:00
santhreal 64b751503e fix(longbridge): accept project-style 1H/4H period tokens
Connector _candlestick_enums only listed lowercase 1h/4h, so runner-style
1H fell through to Day while the Longbridge loader already maps 1H to
Min_60. Align the connector map with the loader.

Signed-off-by: santhreal <64453045+santhreal@users.noreply.github.com>
2026-07-22 12:39:30 -07:00
santhreal 5e5c5bb7de fix(shoonya): map 4h/1H periods and reject unknown intervals
Documented connector periods 4h/1H fell through to daily D. Map them to
Noren 240/60 minute candles and return an error for unsupported tokens
such as 1w/1M instead of silently substituting daily bars.

Signed-off-by: santhreal <64453045+santhreal@users.noreply.github.com>
2026-07-22 12:39:29 -07:00
santhreal a30271ddf9 merge(main): sync before thermo hold 2026-07-22 12:21:58 -07:00
santhreal 2dddec63f4 merge(main): sync before thermo hold 2026-07-22 12:21:57 -07:00
santhreal 9d05d5856e merge(main): sync before thermo hold 2026-07-22 12:21:31 -07:00
santhreal c2da481bff merge(main): sync before thermo hold 2026-07-22 12:21:29 -07:00
santhreal 98038eeae7 merge(main): sync before thermo hold 2026-07-22 12:21:27 -07:00
santhreal 74cdab3b28 merge(main): sync before thermo hold 2026-07-22 12:21:26 -07:00
santhreal a88de6caab merge(main): sync before thermo hold 2026-07-22 12:21:24 -07:00
santhreal 805a75713c merge(main): sync before thermo hold 2026-07-22 12:21:23 -07:00
santhreal 5432364770 merge(main): sync before thermo hold 2026-07-22 12:21:21 -07:00
santhreal 298e3ec1d0 merge(main): sync before thermo hold 2026-07-22 12:21:20 -07:00