Files
python/run_pipeline.py
T

78 lines
2.5 KiB
Python

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 顺序同步股票数据"
)
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
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)
print("\n全部流程执行完成")
if __name__ == "__main__":
main()