11from __future__ import annotations
22
33import argparse
4+ from datetime import date , datetime , timezone
45from pathlib import Path
56
67import pandas as pd
@@ -15,16 +16,26 @@ def _read_csv(path: str | Path) -> pd.DataFrame:
1516 return pd .read_csv (Path (path ))
1617
1718
19+ def _ensure_snapshot_as_of (snapshot : pd .DataFrame , * , as_of : str | date | None = None ) -> pd .DataFrame :
20+ frame = snapshot .copy ()
21+ if "as_of" in frame .columns or "snapshot_date" in frame .columns :
22+ return frame
23+ stamp = as_of or datetime .now (timezone .utc ).date ().isoformat ()
24+ frame .insert (0 , "as_of" , str (stamp ))
25+ return frame
26+
27+
1828def build_and_write_snapshot (
1929 * ,
2030 factor_snapshot_path : str | Path ,
2131 output_dir : str | Path ,
2232 min_adv20_cny : float = 0.0 ,
2333 min_market_cap_cny : float = 0.0 ,
34+ as_of : str | date | None = None ,
2435) -> SnapshotBuildResult :
2536 contract = get_profile_contract (CN_DIVIDEND_QUALITY_SNAPSHOT_PROFILE )
2637 artifact_paths = contract .artifact_paths (output_dir )
27- snapshot = _read_csv (factor_snapshot_path )
38+ snapshot = _ensure_snapshot_as_of ( _read_csv (factor_snapshot_path ), as_of = as_of )
2839 ranking = score_candidates (
2940 snapshot ,
3041 min_adv20_cny = float (min_adv20_cny ),
@@ -74,13 +85,15 @@ def main(argv: list[str] | None = None) -> int:
7485 parser .add_argument ("--output-dir" , default = "data/output/dividend_quality" )
7586 parser .add_argument ("--min-adv20-cny" , type = float , default = 0.0 )
7687 parser .add_argument ("--min-market-cap-cny" , type = float , default = 0.0 )
88+ parser .add_argument ("--as-of" , default = None , help = "Snapshot as_of date (YYYY-MM-DD). Defaults to UTC today." )
7789 args = parser .parse_args (argv )
7890
7991 result = build_and_write_snapshot (
8092 factor_snapshot_path = args .factor_snapshot ,
8193 output_dir = args .output_dir ,
8294 min_adv20_cny = args .min_adv20_cny ,
8395 min_market_cap_cny = args .min_market_cap_cny ,
96+ as_of = args .as_of ,
8497 )
8598 print (f"snapshot={ result .artifact_paths ['snapshot' ]} " )
8699 print (f"manifest={ result .artifact_paths ['manifest' ]} " )
0 commit comments