"""
案例5：wencai_nlp 自然语言查询完整案例
场景覆盖：选股 / 行情查询 / 板块排名 / 财务筛选 / 技术形态 / 复杂组合条件
"""

from thsdk import THS
import pandas as pd

# ══════════════════════════════════════════════════════════════
# 基础用法
# ══════════════════════════════════════════════════════════════

with THS() as ths:

    # wencai_nlp 接受自然语言字符串，多条件用逗号/分号/空格分隔
    # 返回 resp.data：list of dict（每行一只股票或一条记录）
    # resp.df：直接转 DataFrame

    resp = ths.wencai_nlp("涨幅大于5%的股票")
    df = resp.df
    print(df.head())


# ══════════════════════════════════════════════════════════════
# 场景1：行情 & 盘面查询（不需要 search_symbols）
# ══════════════════════════════════════════════════════════════

QUERIES_MARKET = {

    # ── 涨跌停 ──────────────────────────────────────────
    "今日涨停股":               "今日涨停，非ST",
    "连续两日涨停":             "连续2日涨停，非ST，非一字板",
    "今日跌停股":               "今日跌停",
    "炸板股（涨停后打开）":     "今日曾涨停且当前未涨停，非ST",
    "涨停原因分类":             "今日涨停原因类别，涨停封单额，封单量，非ST",

    # ── 竞价 & 异动 ──────────────────────────────────────
    "竞价高开强势股":           "竞价涨幅大于3%，竞价量大于昨日成交量5%，非ST",
    "今日异动股":               "今日异动，涨幅大于3%，成交量大于5日均量",

    # ── 资金流向 ─────────────────────────────────────────
    "主力净流入前20":           "主力净流入由大到小排名前20，非ST",
    "连续3日主力净流入":        "连续3日主力净流入，非ST，市值大于50亿",
    "大单净量前20":             "大单净量由大到小排名前20",
    "近10日主力净流入大":       "近10日区间主力资金流向大于5000万，市值大于100亿，日成交额大于30亿",

    # ── 量价 ─────────────────────────────────────────────
    "价升量涨":                 "价升量涨，换手率大于3%，涨幅大于2%，非ST",
    "放量突破":                 "成交量大于5日均量2倍，收盘价创20日新高，非ST",
    "缩量回调":                 "缩量，涨幅在-2%到0%之间，5日均线上方",
}

with THS() as ths:
    resp = ths.wencai_nlp(QUERIES_MARKET["今日涨停股"])
    df = resp.df
    print(f"\n=== 今日涨停 {len(df)} 只 ===")
    print(df.head(10).to_string(index=False))


# ══════════════════════════════════════════════════════════════
# 场景2：板块 & 行业查询
# ══════════════════════════════════════════════════════════════

QUERIES_SECTOR = {
    "行业涨跌幅排名":           "今日申万行业涨跌幅排名",
    "概念板块涨幅排名":         "今日概念板块涨幅排名前20",
    "领涨板块成分股":           "人工智能概念股，今日涨跌幅，成交额，主力净流入",
    "半导体板块行情":           "半导体行业股票，涨幅，换手率，市值，主力净流入",
    "新能源车核心标的":         "新能源汽车概念，市值大于100亿，换手率，涨幅",
    "今日热门板块":             "今日涨幅最大的5个概念板块，涨幅，成分股数量",
}

with THS() as ths:
    resp = ths.wencai_nlp(QUERIES_SECTOR["今日热门板块"])
    df = resp.df
    print(f"\n=== 今日热门板块 ===")
    print(df.to_string(index=False))


# ══════════════════════════════════════════════════════════════
# 场景3：财务指标选股
# ══════════════════════════════════════════════════════════════

QUERIES_FINANCIAL = {
    # ── 盈利能力 ─────────────────────────────────────────
    "高ROE稳定增长":            "连续3年ROE大于15%，非ST，非停牌，上市大于3年",
    "高净利润增长":             "净利润增长率大于30%，营业收入增长率大于20%，非ST",
    "营收利润双增":             "营业收入增长率大于10%；营业利润增长率大于10%；加权净资产收益率大于15%",

    # ── 估值 ─────────────────────────────────────────────
    "低估值高分红":             "市盈率小于15，股息率大于3%，市净率小于2，非ST",
    "低PB破净股":               "市净率小于1，非ST，非停牌，流通市值大于20亿",
    "PEG小于1成长股":           "市盈率增长比小于1，净利润增长率大于20%，非ST",

    # ── 现金流 ───────────────────────────────────────────
    "自由现金流充裕":           "近5年经营活动净现金流量除以净利润大于80%，连续3年ROE大于15%",
    "高股息稳定":               "连续5年分红，股息率大于4%，资产负债率小于60%，市值大于100亿",

    # ── 质地筛选 ──────────────────────────────────────────
    "价值股经典条件":           (
        "连续3年ROE大于15%，"
        "连续5年经营活动净现金流量除以净利润大于80%，"
        "连续5年毛利率大于40%，"
        "上市大于3年，市值大于500亿，"
        "连续5年资产负债率小于60%"
    ),
}

with THS() as ths:
    resp = ths.wencai_nlp(QUERIES_FINANCIAL["高ROE稳定增长"])
    df = resp.df
    print(f"\n=== 高ROE稳定增长股（{len(df)}只）===")
    print(df.head(10).to_string(index=False))


# ══════════════════════════════════════════════════════════════
# 场景4：技术形态选股
# ══════════════════════════════════════════════════════════════

QUERIES_TECHNICAL = {
    # ── 均线系统 ──────────────────────────────────────────
    "均线多头排列":             "均线多头排列，MACD金叉，换手率大于3%，非ST",
    "均线金叉":                 "5日均线上穿20日均线，成交量放大，涨幅大于1%",
    "均线密集粘合突破":         "均线粘合，平台突破，成交量大于5日均量1.5倍，非ST",

    # ── MACD ──────────────────────────────────────────────
    "MACD金叉底部":             "MACD金叉，DIFF上穿中轴，成交量放大，非ST",
    "MACD红柱放大":             "MACD红柱增大，股价在均线上方，换手率大于2%",

    # ── 形态 ──────────────────────────────────────────────
    "仙人指路":                 "仙人指路，非ST，非停牌，涨幅大于0%",
    "黄金坑":                   "黄金坑，成交量放大，非ST",
    "平台整理突破":             "平台整理，平台突破，成交量大于5日均量2倍",
    "创阶段新高":               "250日新高，非ST，沪深A，上市超过250天",
    "强势缩量回调":             "缩量回调至均线支撑，近20日最大涨幅大于20%，非ST",

    # ── 组合条件（复杂选股）────────────────────────────────
    "短线强势选股":             (
        "均线多头排列，MACD金叉，DIFF上穿中轴，"
        "最低价除以EXPMA50小于1.025，"
        "(10日均线大于20日均线)或(5日均线大于120日均线)，"
        "换手率大于1%且小于10%，"
        "30日内有2个交易日涨幅大于4%，"
        "非ST，非停牌"
    ),
    "竞价强势选股":             (
        "昨日非一字板涨停，"
        "今日竞价涨幅大于等于0%且小于等于9.9%，"
        "今日隔夜买单额小于10亿，"
        "非ST，非科创板，非创业板"
    ),
}

with THS() as ths:
    resp = ths.wencai_nlp(QUERIES_TECHNICAL["均线多头排列"])
    df = resp.df
    print(f"\n=== 均线多头排列+MACD金叉（{len(df)}只）===")
    print(df.head(10).to_string(index=False))


# ══════════════════════════════════════════════════════════════
# 场景5：融合 wencai_nlp + klines 做深度分析
# ══════════════════════════════════════════════════════════════

with THS() as ths:

    # Step 1：问财选出候选股
    resp = ths.wencai_nlp("连续3日主力净流入，换手率大于5%，涨幅大于2%，非ST，市值大于30亿")
    candidates = resp.df
    print(f"\n=== 候选股 {len(candidates)} 只 ===")

    # Step 2：从候选股中提取 ths_code（字段名可能是 '股票代码' 或 'THSCODE'）
    codes = []
    for _, row in candidates.iterrows():
        raw_code = str(row.get('股票代码') or row.get('代码') or '')
        if not raw_code:
            continue
        # 补全 ths_code（6位数字 → 判断沪深）
        if raw_code.startswith('6'):
            ths_code = f"USHA{raw_code}"
        elif raw_code.startswith(('0', '3')):
            ths_code = f"USZA{raw_code}"
        elif raw_code.startswith('8'):
            ths_code = f"USTM{raw_code}"
        else:
            continue
        codes.append({'name': row.get('股票简称', raw_code), 'code': ths_code})

    # Step 3：拉 K 线做技术验证（取前10只）
    qualified = []
    for s in codes[:10]:
        resp = ths.klines(s['code'], interval="day", count=20, adjust="forward")
        if not resp or resp.df.empty:
            continue
        df = resp.df
        df['ma5']  = df['收盘价'].rolling(5).mean()
        df['ma10'] = df['收盘价'].rolling(10).mean()
        df['ma20'] = df['收盘价'].rolling(20).mean()
        latest = df.iloc[-1]

        # 验证：收盘在5日均线上方，且5日>10日>20日（均线多头）
        if (latest['收盘价'] > latest['ma5'] > latest['ma10'] > latest['ma20']):
            qualified.append({
                'name': s['name'],
                'code': s['code'],
                '最新价': latest['收盘价'],
                '5日涨幅': f"{(latest['收盘价']/df['收盘价'].iloc[0]-1)*100:.1f}%",
            })

    print(f"\n=== 技术验证后剩余 {len(qualified)} 只 ===")
    for q in qualified:
        print(q)


# ══════════════════════════════════════════════════════════════
# 快速参考：wencai_nlp 支持的字段 & 关键词
# ══════════════════════════════════════════════════════════════

WENCAI_KEYWORDS = """
【行情类】
  涨幅、跌幅、涨跌幅、最新价、成交量、成交额、换手率、量比
  涨停、跌停、一字板、炸板、连续涨停
  竞价涨幅、竞价量、隔夜买单额、涨停封单额、封单量

【资金类】
  主力净流入、主力净流出、大单净量、大单净流入
  近N日区间主力资金流向、连续N日主力净流入

【技术指标】
  均线多头排列、均线粘合、平台突破、平台整理
  MACD金叉、MACD死叉、DIFF上穿中轴、MACD红柱增大
  KDJ金叉、KDJ死叉、RSI大于/小于N
  5日均线 > 20日均线、收盘价 > EXPMA50

【形态类】
  仙人指路、黄金坑、价升量涨、缩量回调
  创N日新高、创N日新低、阶段涨幅

【财务类】
  市盈率(PE)、市净率(PB)、市销率、PEG
  ROE、净利润增长率、营业收入增长率、毛利率
  股息率、分红、资产负债率、每股收益、每股净资产
  经营活动净现金流量、自由现金流

【筛选条件】
  非ST、非停牌、沪深A、非北交所、非科创板、非创业板
  上市大于N天、市值大于/小于N亿、流通市值

【排序】
  由大到小排名前N、由小到大排名前N
"""
