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>
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>
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>
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>
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>
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>
同花顺 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>
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>
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>
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>
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>