From 3cc0b4dcfeed042e5a69628c6b7f45580ad1e2f9 Mon Sep 17 00:00:00 2001 From: "Somhairle H. Marisol" Date: Tue, 22 Sep 2026 01:12:52 +0800 Subject: Add real AKShare bond quote probe slice (3d-14) --- src/FundLab.Api/akshare_collector.py | 42 ++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) (limited to 'src/FundLab.Api/akshare_collector.py') diff --git a/src/FundLab.Api/akshare_collector.py b/src/FundLab.Api/akshare_collector.py index f988a61..6543923 100644 --- a/src/FundLab.Api/akshare_collector.py +++ b/src/FundLab.Api/akshare_collector.py @@ -150,15 +150,53 @@ def nav(code): } +def bond_quote(code): + code = text(code) + if code is None or not re.fullmatch(r"\d{6}", code): + raise ValueError("bond code must contain exactly six digits") + + frame = ak.bond_zh_cov_info(symbol=code, indicator="基本信息") + if frame is None or frame.empty: + raise ValueError(f"AKShare returned no bond info for {code}") + + row = frame.iloc[0] + name = text(row.get("SECURITY_NAME_ABBR")) + price = decimal_text(row.get("CURRENT_BOND_PRICE")) + maturity_date = date_text(row.get("EXPIRE_DATE")) + + if name is None and price is None and maturity_date is None: + raise ValueError(f"AKShare returned no usable bond quote fields for {code}") + + return { + "schema_version": SCHEMA_VERSION, + "operation": "bond-quote", + "source": "akshare", + "source_revision": source_revision(), + "collected_at": collected_at(), + "instrument": {"code": code}, + "quote": { + "name": name, + "price": price, + "maturity_date": maturity_date, + }, + } + + def main(): parser = argparse.ArgumentParser() - parser.add_argument("--operation", choices=("search", "nav"), required=True) + parser.add_argument("--operation", choices=("search", "nav", "bond-quote"), required=True) parser.add_argument("--query") parser.add_argument("--code") args = parser.parse_args() try: - payload = search(args.query) if args.operation == "search" else nav(args.code) + if args.operation == "search": + payload = search(args.query) + elif args.operation == "nav": + payload = nav(args.code) + else: + payload = bond_quote(args.code) + json.dump(payload, sys.stdout, ensure_ascii=False, separators=(",", ":")) sys.stdout.write("\n") return 0 -- cgit v1.2.3