import argparse import sys from . import fetcher, notifier, scorer, storage def run(ts_code: str) -> int: storage.init_db() print(f"[1/4] 拉取 {ts_code} 数据...") df = fetcher.fetch_contract(ts_code) print(f" 返回 {len(df)} 行") print(f"[2/4] 写入/更新 SQLite...") storage.save_candles(df) print(f"[3/4] 计算打分...") result = scorer.score_daily(df) print(f"[4/4] 保存打分结果...") storage.save_score(result) # 输出 print("\n" + "=" * 65) print(f"合约: {result.ts_code:<20} 日期: {result.trade_date}") print(f"收盘: {result.close:>10.2f} 持仓: {result.oi:>12,.0f}") print(f"持仓变动: {result.oi_chg:>+8,.0f}") print("=" * 65) print(f"\n{'模块':<12} {'分数':>8} {'权重':>6} {'加权':>8}") print("-" * 40) print(f"{'短期动力':<12} {result.short_term:>8.1f} {0.4:>6.2f} {result.short_term * 0.4:>8.2f}") print(f"{'中期趋势':<12} {result.medium_term:>8.1f} {0.35:>6.2f} {result.medium_term * 0.35:>8.2f}") print(f"{'长期结构':<12} {result.long_term:>8.1f} {0.25:>6.2f} {result.long_term * 0.25:>8.2f}") print("-" * 40) print(f"{'综合分数':<12} {result.composite:>8.1f}") print(f"\n信号: {result.signal}") print("=" * 65) print("\n[短期动力] 近7日逐日打分:") print("-" * 65) for d in result.detail.short_details: tag = "增仓" if d["oi_chg"] > 0 else "减仓" if abs(d["oi_chg"] / d["oi"]) < 0.01: tag = "持平" price_dir = "涨" if d["close"] >= d["pre_close"] else "跌" print(f" {d['trade_date']} {tag:>4} + {price_dir} " f"持仓{d['oi_chg']:>+8,.0f} 得分: {d['score']:>3}") md = result.detail.medium_detail print(f"\n[中期趋势] 明细:") print(f" 15日价格收益率: {md['price_return_pct']:+.2f}%") print(f" 价格信号得分: {md['price_signal']:.1f}") print(f" 增仓上涨天数: {md['long_up_days']} 天") print(f" 增仓下跌天数: {md['long_down_days']} 天") print(f" 资金意愿得分: {md['fund_signal']} 分") ld = result.detail.long_detail print(f"\n[长期结构] 明细:") print(f" 近30日日均持仓: {ld['avg_oi']:,.0f}") print(f" 30日前持仓量: {ld['oi_before']:,.0f}") print(f" 持仓变化幅度: {ld['change_pct']:+.2f}%") print(f"\n[OK] 数据已持久化到 SQLite") push_title = f"{result.ts_code.split('.')[0]} {result.trade_date}" push_body = ( f"综合 {result.composite:.1f}\n" f"短期 {result.short_term:.1f} | 中期 {result.medium_term:.1f} | 长期 {result.long_term:.1f}\n" f"{result.signal}" ) if notifier.push_bark(push_title, push_body): print("[Bark] 推送成功") return 0 def main() -> int: parser = argparse.ArgumentParser(description="期货合约三层打分模型") parser.add_argument("ts_code", help="合约代码,如 FG2609.ZCE") args = parser.parse_args() return run(args.ts_code) if __name__ == "__main__": sys.exit(main())