新增行情查询、价差图表和 spread 分析表
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -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()
|
||||
Reference in New Issue
Block a user