Files
trade/tushare/src/main.py
fish b9975d6f91 打分结束后通过 Bark 推送结果
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-02 23:11:03 +08:00

86 lines
3.0 KiB
Python

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())