新增行情查询、价差图表和 spread 分析表

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
fish
2026-07-18 17:35:05 +08:00
parent 1b39ad6887
commit ecf4d28961
4 changed files with 434 additions and 49 deletions
+87
View File
@@ -0,0 +1,87 @@
"""
查询指定交易日玻璃期货主力合约行情。
用法: 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()