import argparse from datetime import datetime, timedelta from stock_config import TUSHARE_TOKEN def parse_yyyymmdd(value): try: return datetime.strptime(value, "%Y%m%d").date() except ValueError as exc: raise argparse.ArgumentTypeError("日期格式应为 YYYYMMDD") from exc def to_yyyymmdd(date_value): return date_value.strftime("%Y%m%d") def to_iso_date(date_value): return date_value.strftime("%Y-%m-%d") def run_stage(name, func, *args): print(f"\n========== {name} 开始 ==========") result = func(*args) if result is False: raise RuntimeError(f"{name} 执行失败,流程已停止") print(f"========== {name} 完成 ==========") def main(): today = datetime.now().date() parser = argparse.ArgumentParser( description=( "按 basic -> cal_date -> daily -> limit_up -> limit_list_d " "-> second_board_profit_cache 顺序同步股票数据" ) ) parser.add_argument( "--date", type=parse_yyyymmdd, default=today, help="同步单日数据,格式 YYYYMMDD;未指定时默认今天", ) parser.add_argument("--start-date", type=parse_yyyymmdd, help="区间开始日期,格式 YYYYMMDD") parser.add_argument("--end-date", type=parse_yyyymmdd, help="区间结束日期,格式 YYYYMMDD") parser.add_argument("--skip-basic", action="store_true", help="跳过股票基础信息同步") args = parser.parse_args() start_date = args.start_date or args.date end_date = args.end_date or args.date if start_date > end_date: raise SystemExit("开始日期不能大于结束日期") start_yyyymmdd = to_yyyymmdd(start_date) end_yyyymmdd = to_yyyymmdd(end_date) limit_start = to_iso_date(start_date - timedelta(days=1)) limit_end = to_iso_date(end_date) if not args.skip_basic: from basic import sync_stock_basic run_stage("basic 股票基础信息", sync_stock_basic) from cal_date import run as run_cal_date from daily import run as run_daily from limit_list_d import run as run_limit_list_d from limit_up import analyze_and_save_limits from second_board_profit_cache import run as run_second_board_profit_cache run_stage("cal_date 交易日历", run_cal_date, start_yyyymmdd, end_yyyymmdd, TUSHARE_TOKEN) run_stage("daily 日行情", run_daily, start_yyyymmdd, end_yyyymmdd) run_stage("limit_up 涨停/炸板", analyze_and_save_limits, limit_start, limit_end) run_stage("limit_list_d 原始涨跌停数据", run_limit_list_d, start_yyyymmdd, end_yyyymmdd) run_stage( "second_board_profit_cache 二板获利缓存", run_second_board_profit_cache, start_yyyymmdd, end_yyyymmdd, ) print("\n全部流程执行完成") if __name__ == "__main__": main()