""" 查询指定交易日玻璃期货主力合约行情。 用法: python3 quote.py 20260717 """ import sqlite3 import sys from datetime import datetime DB_PATH = "/Users/vipg/Documents/futures-data-warehouse/db/futures.db" def main(): if len(sys.argv) < 2: print("用法: python3 quote.py YYYYMMDD") sys.exit(1) date_str = sys.argv[1] try: datetime.strptime(date_str, "%Y%m%d") except ValueError: print(f"日期格式错误: {date_str},应为 YYYYMMDD") sys.exit(1) conn = sqlite3.connect(DB_PATH) count = conn.execute( "SELECT COUNT(*) FROM daily WHERE trade_date=?", (date_str,) ).fetchone()[0] if count == 0: import urllib.request, json req_data = json.dumps({ "api_name": "trade_cal", "token": "76efd8465f9f2591aa42a385268e06acf6b80b7a15be2267ad2281b7", "params": {"exchange": "CZCE", "start_date": date_str, "end_date": date_str}, "fields": "cal_date,is_open", }).encode() resp = json.loads(urllib.request.urlopen( urllib.request.Request("https://api.tushare.pro", data=req_data, headers={"Content-Type": "application/json"}) ).read()) is_open = resp.get("data", {}).get("items", [[None, None]])[0][1] if is_open == 1: print(f"{date_str} 是交易日,但数据库尚无数据(需先运行 update.py 拉取)") elif is_open == 0: print(f"{date_str} 非交易日") else: print(f"{date_str} 无数据") conn.close() sys.exit(1) rows = conn.execute(""" SELECT d.ts_code, d.open, d.high, d.low, d.close FROM daily d JOIN contracts c ON d.ts_code = c.ts_code WHERE d.trade_date = ? AND c.delist_date > ? AND d.oi > 0 ORDER BY c.delist_date """, (date_str, date_str)).fetchall() if not rows: print(f"{date_str} 无活跃合约数据") conn.close() sys.exit(1) print(f"\n{date_str} 玻璃期货") print(f"{'合约':>12} 收盘价 差价") print("-" * 34) prev = None total_diff = 0.0 for r in rows: close = float(r[4]) if r[4] is not None and r[4] != "" else None close_str = f"{close:.1f}" if close else "-" diff = "" if close is not None and prev is not None: d = close - prev diff = f"{d:+.1f}" total_diff += d print(f"{r[0]:>12} {close_str:>7} {diff:>6}") if close is not None: prev = close print("-" * 34) print(f"{'差价合计':>20} {total_diff:+.1f}") conn.close() if __name__ == "__main__": main()