diff options
| author | Somhairle H. Marisol <[email protected]> | 2026-09-22 01:12:52 +0800 |
|---|---|---|
| committer | Somhairle H. Marisol <[email protected]> | 2026-09-22 01:12:52 +0800 |
| commit | 3cc0b4dcfeed042e5a69628c6b7f45580ad1e2f9 (patch) | |
| tree | b86805c2680327412d6f5d554d4506ebfe62fc2f /src/FundLab.Api/akshare_collector.py | |
| parent | 70e1ad4fc8ba248f835d415faade8a91ac3dc1f8 (diff) | |
| download | fund-lab-3cc0b4dcfeed042e5a69628c6b7f45580ad1e2f9.tar.gz | |
Add real AKShare bond quote probe slice (3d-14)
Diffstat (limited to 'src/FundLab.Api/akshare_collector.py')
| -rw-r--r-- | src/FundLab.Api/akshare_collector.py | 42 |
1 files changed, 40 insertions, 2 deletions
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 |
