Market Intel daily schedule¶
This page covers reports, delivery, data preparation, and recovery owned by market-intel. Research algorithms, factor experiments, ablations, and strategy production belong to quant-research and quant-platform. This repository restores official artifacts only through public CLIs when needed.
Production schedules and bridge scripts are maintained in quant-intel-deploy. The table describes tracked timer definitions and intended workflow; it does not establish which timers are enabled on a host. Bridge-script commands must be run from a quant-intel-deploy checkout, not this repository.
Operating principles¶
- Reports consume published artifacts that pass date, hash, and schema checks.
market-inteldoes not duplicate research models or use retired submodules to produce candidate pools or AI rankings.- DailyWatch20 strategy logic belongs to
quant-research(strategy_app.daily_watch20). The producer bridge calls its installed owner CLI and does not implement strategy logic. - Refresh data required by the day's evening report before 19:00. Later jobs are for backfills, the next morning report, or freshness repair.
- A systemd timer outside the Gateway handles Gateway recovery.
- Freshness is based on business dates and artifact receipts, not process exit codes alone.
- Automatic recovery has attempt and cooldown budgets. Validate before delivery; if a successful send exists but its receipt is not aligned, do not resend.
- Research-side factor observation, DailyWatch20 ablation, standalone hot-sector jobs, and the legacy AI freshness timer have been retired from this repository.
Linux / Hermes schedule¶
| Time | Entry point | Owner | Purpose |
|---|---|---|---|
| Weekdays 05:20 | daily-watch20-producer.timer → refresh_daily_watch20_quant_research.sh |
Deploy bridge → quant-research | Preflight the exact-date all-market artifact with daily-watch20-owner freshness and exit if it already passes; otherwise run daily-watch20-runtime with the configured data root and minute overlays to publish |
| 06:00 / 06:45 | local-fetch-cross-market.timer |
market-intel | Refresh cross-market snapshots; the second run retries later-updating sources |
| Weekdays 06:40 | a-share-morning-product-supervisor-preflight.timer |
market-intel | Check official DailyWatch20/D11-H5 artifacts and same-day recovery conditions |
| Weekdays 06:50 | hermes-gateway-preflight.timer |
market-intel | Start and recheck an inactive Gateway; no-op when healthy |
| Weekdays 07:00 | Hermes morning_pipeline.sh |
market-intel | Validate and deliver DailyWatch20, D11-H5, and the morning report; do not run the legacy AI picker |
| Weekdays 07:15 | a-share-morning-product-supervisor-postflight.timer |
market-intel | Check artifact hashes, delivery receipts, and idempotent resend conditions |
| 17:30 | asia-market-refresh.timer |
Data bridge | Fetch or consume A-share daily data and Asia close data for the evening report |
| 18:00 | a-share-current-publish.timer |
Data bridge | Build and validate the A-share current contract and report inputs |
| 18:20 / 18:40 | a-share-report-datasets-refresh.timer |
market-data-platform producer | Prepare TuShare evening-report data and write dated receipts |
| Weekdays 18:50 | hermes-gateway-preflight.timer |
market-intel | Check the Gateway before the evening report |
| Weekdays 19:00 | Hermes evening_pipeline.sh |
market-intel | Deliver the Asia post-close / US pre-market report |
| 19:20 / 20:30 | a-share-report-datasets-refresh.timer |
market-data-platform producer | Backfill evening data and repair next-day freshness |
| Saturdays 08:15 | a-share-style-factor-weekly-refresh.timer |
quant-research producer bridge | Call the standard publisher; factor calculation is not implemented here |
| Saturdays 09:00 | Hermes weekly_recap.sh |
market-intel | Consume published weekly research outputs and deliver a recap |
| About 5 minutes after boot, then every 45 minutes | market-intel-scheduled-recovery.timer |
market-intel | Check data, report inputs, official strategy artifacts, and delivery state; run bounded allowlisted recovery |
Retired tasks¶
market-intel no longer installs, schedules, or automatically recovers a-share-factor-observation-refresh.timer, daily-watch20-ablation.timer, hotsector-research-handoff.timer, a-share-ai-stock-picker-freshness.timer, or scheduled jobs from the three historical owner submodules. quant-intel-deploy/scripts/setup_cron.sh --layer2 disables and removes these old user-unit files. Research jobs belong in their owner repositories.
DailyWatch20 production boundary¶
market-data-platform data / report inputs
↓
quant-intel-deploy: refresh_daily_watch20_quant_research.sh
↓
quant-research: daily-watch20-owner freshness preflight → run daily-watch20-runtime only when needed
↓
versioned DailyWatch20 artifact + selection_receipt
↓
quant-intel-deploy bridge + quant-intel-platform: validate → render → delivery_receipt → Feishu
refresh_daily_watch20_quant_research.sh receives its minute-quota settings and data paths from Deploy. The systemd service controls bounded retries, and the 06:40 morning supervisor checks same-day recovery conditions. This bridge does not backfill minute data or implement candidate-pool algorithms, model training, Hermite research, or ablation. News heat is optional: the owner runtime consumes the requested-date artifact when available; this bridge does not build it or launch the retired hot-sector-screener producer.
Delivery windows and recovery¶
Hermes restarts can collapse missed recurring runs, so scripts check their delivery windows first:
- Morning: approximately 06:30–09:15; evening: approximately 17:30–23:30.
- Outside these windows, an audit artifact may be generated, but external delivery is disabled.
- If a successful send is evidenced for the business date but its receipt is not aligned, recovery records
delivery_unverifiedand does not resend.
The window is determined by ops_common.report_window and the official delivery receipt.
Critical systemd timers with Persistent=true trigger recently missed jobs after restart. They do not replay every historical schedule or retry a failed one-shot indefinitely. The recovery timer evaluates a business-date freshness DAG: core data/current contract, report enhancements/cross-market inputs, official DailyWatch20, and morning/evening delivery receipts. Research factor pipelines are excluded, so a missing report does not start a research experiment.
Deployments can pass --disable-stage <stage>. Downstream dependencies are marked disabled_dependency and are not probed, rerun, or alerted on. Disabling morning_model, for example, also skips its dependent morning_report. Per-stage retry counts are bounded and stored in state/scheduled_recovery/<YYYYMMDD>.json; latest.json and the heartbeat record current state. Failure alerts are deduplicated by fingerprint.
For report_datasets, recovery verifies the owner's a_share_evening_data_<YYYYMMDD>.json receipt: it must target the requested date, show premium enabled, mark all three required enhancement datasets ready, and have their partition files present. The legacy a_share_report_dataset_refresh_<YYYYMMDD>.json receipt is used only when the owner receipt is absent; it cannot mask a failed owner receipt. If financing-balance data in the public six-chart dashboard trails the trading-volume series by more than one previous trading day, the dashboard is degraded and preserves each point's observation date.
Manual recovery¶
Run the bridge commands below from a quant-intel-deploy checkout. They are deployment operations, not scripts shipped by this repository.
bash scripts/refresh_tushare_daily.sh YYYYMMDD
bash scripts/publish_a_share_current.sh YYYYMMDD
A_SHARE_ENABLE_TUSHARE_PREMIUM=1 bash scripts/refresh_tushare_report_datasets.sh YYYYMMDD
Restore an official DailyWatch20 artifact:
WATCHLIST20_SOURCE_DATE=YYYYMMDD WATCHLIST20_SIGNAL_DATE=YYYYMMDD \
bash scripts/refresh_daily_watch20_quant_research.sh
This bridge can publish a production artifact. Run it only for an explicitly authorized recovery; installation of the owner CLI alone does not authorize resuming a paused strategy.
Validate or deliver an already published artifact:
uv run python scripts/send_daily_watch20.py \
--date YYYYMMDD \
--signal-date YYYYMMDD \
--dry-run
Do not run retired run_daily_watch20_ablation.sh, refresh_a_share_factor_observation.sh, or legacy AI-picker/hot-sector production entry points.
Deployment¶
Run the deployment commands below from a quant-intel-deploy checkout. They install or inspect deployment-owned jobs and call the installed public CLI.
export DATA_PLATFORM_ROOT=/path/to/data/market-data-platform
export MDP_DIR=/path/to/quant-market-data-platform
export QUANT_RESEARCH_ROOT=/path/to/quant-research
bash scripts/setup_cron.sh --layer2
bash scripts/setup_cron.sh --layer3
uv run a-share-daily doctor --live
Inspect installed jobs with:
systemctl --user list-timers --all | rg 'hermes-gateway|scheduled-recovery|a-share|cross|asia|daily-watch20'
systemctl --user status hermes-gateway-preflight.timer
systemctl --user status market-intel-scheduled-recovery.timer
systemctl --user status daily-watch20-producer.timer
hermes cron list
Use quant-research / strategy-research documentation for research schedules and experiment cadence.