summaryrefslogtreecommitdiff
path: root/src/FundLab.Api/akshare_collector.py
diff options
context:
space:
mode:
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