86 lines
3.0 KiB
Python
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())
|