summaryrefslogtreecommitdiff
path: root/src/FundLab.Api/akshare_collector.py
diff options
context:
space:
mode:
authorSomhairle H. Marisol <[email protected]>2026-09-22 01:12:52 +0800
committerSomhairle H. Marisol <[email protected]>2026-09-22 01:12:52 +0800
commit3cc0b4dcfeed042e5a69628c6b7f45580ad1e2f9 (patch)
treeb86805c2680327412d6f5d554d4506ebfe62fc2f /src/FundLab.Api/akshare_collector.py
parent70e1ad4fc8ba248f835d415faade8a91ac3dc1f8 (diff)
downloadfund-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.py42
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