加载中...

如何利用AI大模型对股票池个股进行打分

如何利用AI大模型对股票池个股进行打分

New Image



New Image



今天星球同学问我, 怎么对 策略选出来的几只个股进行打分,因为竞价选出来个股较多,希望选择优质的个股进行交易, 时间短看不过来,希望有个评分。

可能一些同学也有这样的想法。但每个人的个股评分感觉不一样, 那这里采用AI大模型来实现。


为什么用AI模型分析K线图

在传统股票分析中,投资者需要手动查看K线图、计算技术指标、判断趋势形态,这个过程不仅耗时耗力,还容易受到主观情绪的影响。而AI分析系统可以:

  1. 1.快速处理海量数据:在几秒钟内分析多只股票
  2. 2.客观评估:避免情绪化决策
  3. 3.多维度评分:综合考虑趋势、形态、量价等关键因素
  4. 4.可视化展示:自动生成K线图和技术指标图表

大概分为这几个模块

1. 数据获取模块

系统使用akshare库获取股票历史数据,虽然交易用没那么稳定,做分析还是可以的。

def fetch_stock_data(self, stock_codes: List[str], period: str = "daily") -> Dict:
    """
    获取股票最近一年的历史数据
    """
    # 计算日期范围(最近一年)
    end_date = datetime.now()
    start_date = end_date - timedelta(days=365)
    end_date_str = end_date.strftime("%Y%m%d")
    start_date_str = start_date.strftime("%Y%m%d")
    print(f"获取数据时间范围: {start_date_str} 到 {end_date_str}")
    for code in stock_codes:
        try:
            # 获取股票数据
            stock_df = ak.stock_zh_a_hist(
                symbol=code,
                period=period,
                start_date=start_date_str,
                end_date=end_date_str,
                adjust="qfq"
            )
            if stock_df is not None and len(stock_df) > 0:
                stock_df[''代码''] = code
                self.stock_data[code] = stock_df
                print(f"成功获取 {code} 的数据,共 {len(stock_df)} 条记录")
            else:
                print(f"获取 {code} 数据失败: 未获取到数据")
        except Exception as e:
            print(f"获取 {code} 数据失败: {e}")
    return self.stock_data

自动获取最近一年的股票数据,包括开盘价、收盘价、最高价、最低价和成交量等关键信息。


2. 技术指标计算

系统自动计算多种技术指标,为后续分析提供技术支持

def calculate_technical_indicators(self, df: pd.DataFrame) -> pd.DataFrame:
    """
    计算技术指标
    """
    # 确保日期索引
    df = df.set_index(''日期'')
    df.index = pd.to_datetime(df.index)
    df = df.sort_index()
    # 计算移动平均线
    df[''MA5''] = df[''收盘''].rolling(window=5).mean()
    df[''MA20''] = df[''收盘''].rolling(window=20).mean()
    df[''MA60''] = df[''收盘''].rolling(window=60).mean()
    # 计算MACD
    exp12 = df[''收盘''].ewm(span=12, adjust=False).mean()
    exp26 = df[''收盘''].ewm(span=26, adjust=False).mean()
    df[''MACD''] = exp12 - exp26
    df[''MACD_Signal''] = df[''MACD''].ewm(span=9, adjust=False).mean()
    df[''MACD_Histogram''] = df[''MACD''] - df[''MACD_Signal'']
    # 计算RSI
    delta = df[''收盘''].diff()
    gain = (delta.where(delta > 0, 0)).rolling(window=14).mean()
    loss = (-delta.where(delta < 0, 0)).rolling(window=14).mean()
    rs = gain / loss
    df[''RSI''] = 100 - (100 / (1 + rs))
    # 计算布林带
    df[''BB_Middle''] = df[''收盘''].rolling(window=20).mean()
    bb_std = df[''收盘''].rolling(window=20).std()
    df[''BB_Upper''] = df[''BB_Middle''] + (bb_std * 2)
    df[''BB_Lower''] = df[''BB_Middle''] - (bb_std * 2)
    # 计算成交量变化率
    df[''Volume_Change''] = df[''成交量''].pct_change() * 100
    return df


系统计算的关键技术指标包括:

  • ∙移动平均线(MA5、MA20、MA60)
  • ∙指数平滑移动平均线(MACD)
  • ∙相对强弱指标(RSI)
  • ∙布林带(Bollinger Bands)
  • ∙成交量变化率

3. K线图可视化

使用matplotlib自动生成专业的K线图:

def generate_kline_chart(self, df: pd.DataFrame, stock_code: str,
                         save_path: str = None) -> str:
    """
    生成K线图并保存
    """
    # 确保目录存在
    if save_path:
        import os
        os.makedirs(save_path, exist_ok=True)
    fig, axes = plt.subplots(2, 1, figsize=(12, 10),
                             gridspec_kw={''height_ratios'': [3, 1]})
    # 绘制K线图
    dates = df.index
    opens = df[''开盘'']
    highs = df[''最高'']
    lows = df[''最低'']
    closes = df[''收盘'']
    volumes = df[''成交量'']
    # 绘制价格和移动平均线
    axes[0].plot(dates, closes, label=''收盘价'', linewidth=1, color=''black'')
    axes[0].plot(dates, df[''MA5''], label=''5日均线'', linewidth=1)
    axes[0].plot(dates, df[''MA20''], label=''20日均线'', linewidth=1)
    axes[0].plot(dates, df[''MA60''], label=''60日均线'', linewidth=1)
    # 填充布林带
    axes[0].fill_between(dates, df[''BB_Upper''], df[''BB_Lower''],
                         alpha=0.2, label=''布林带'')
    # 标记价格和移动平均线的交叉点
    golden_cross = (df[''MA5''] > df[''MA20'']) & (df[''MA5''].shift(1) <= df[''MA20''].shift(1))
    death_cross = (df[''MA5''] < df[''MA20'']) & (df[''MA5''].shift(1) >= df[''MA20''].shift(1))
    axes[0].scatter(dates[golden_cross], df[''MA5''][golden_cross],
                    color=''red'', marker=''^'', s=100, label=''金叉'')
    axes[0].scatter(dates[death_cross], df[''MA5''][death_cross],
                    color=''green'', marker=''v'', s=100, label=''死叉'')
    axes[0].set_title(f''{stock_code} K线图与技术指标'')
    axes[0].set_ylabel(''价格'')
    axes[0].legend()
    axes[0].grid(True, linestyle=''--'', alpha=0.7)
    # 绘制成交量
    axes[1].bar(dates, volumes, color=[''red'' if close >= open else ''green''
                                       for close, open in zip(closes, opens)],
                alpha=0.7)
    axes[1].set_ylabel(''成交量'')
    axes[1].grid(True, linestyle=''--'', alpha=0.7)
    plt.tight_layout()
    if save_path:
        plt.savefig(f"{save_path}/{stock_code}_kline.png", dpi=300, bbox_inches=''tight'')
        print(f"K线图已保存至: {save_path}/{stock_code}_kline.png")
    plt.close()
    # 返回图像路径
    return f"{save_path}/{stock_code}_kline.png" if save_path else None
    

生成的K线图包含:

  • ∙价格走势和移动平均线
  • ∙布林带区域
  • ∙金叉死叉标记
  • ∙成交量柱状图


4. AI智能评分系统

这是整个系统的核心,使用LangChain框架和大语言模型进行多维度评分

# 定义提示词模板
template = """
你是一名专业的股票分析师。请根据以下技术分析数据对{stock_code}进行评分。
技术分析数据:
- 当前价格: {latest_price}
- 价格变化: {price_change}
- 价格变化百分比: {price_change_percent}
- 近期最高价: {high_price}
- 近期最低价: {low_price}
- 平均成交量: {avg_volume}
- 5日与20日均线关系: {trend_5_20}
- 20日与60日均线关系: {trend_20_60}
- 布林带位置: {bb_position}
- RSI值: {rsi_value} - {rsi_status}
- MACD趋势: {macd_trend}
- 成交量变化: {volume_change}
请按照以下五个维度进行评分(总分100分):
1. 趋势强度 (25分): 评估上涨趋势是否明确且稳定
2. 形态质量 (25分): 评估K线形态是否完整且符合看涨特征
3. 量价配合 (20分): 评估价格上涨是否得到成交量支持
4. 关键位置 (20分): 评估价格是否处于关键支撑位或刚突破阻力位
5. 动量指标 (10分): 评估RSI、MACD等动量指标是否健康
请以JSON格式返回结果,包含以下字段:
- trend_score: 趋势强度得分 (0-25)
- pattern_score: 形态质量得分 (0-25)
- volume_price_score: 量价配合得分 (0-20)
- key_position_score: 关键位置得分 (0-20)
- momentum_score: 动量指标得分 (0-10)
- total_score: 总分 (0-100)
- analysis: 简要分析说明
- suggestion: 投资建议 (买入/增持/中性/减持/卖出)
"""
# 创建提示词模板
prompt = PromptTemplate(
    input_variables=[
        "stock_code", "latest_price", "price_change", "price_change_percent",
        "high_price", "low_price", "avg_volume", "trend_5_20", "trend_20_60",
        "bb_position", "rsi_value", "rsi_status", "macd_trend", "volume_change"
    ],
    template=template
)
# 创建LLM链
llm = ChatOpenAI(
    temperature=0.95,
    model=Config.LLM_MODEL,
    openai_api_key=Config.LLM_API_KEY,
    openai_api_base=Config.LLM_API_BASE
)
chain = LLMChain(llm=llm, prompt=prompt)
# 初始化输出解析器
output_parser = JSONOutputParser()


系统会从五个维度对股票进行评分:

  1. 1.趋势强度(25分):评估上涨趋势是否明确且稳定
  2. 2.形态质量(25分):评估K线形态是否完整且符合看涨特征
  3. 3.量价配合(20分):评估价格上涨是否得到成交量支持
  4. 4.关键位置(20分):评估价格是否处于关键支撑位或刚突破阻力位
  5. 5.动量指标(10分):评估RSI、MACD等动量指标是否健康


原文链接:如何利用AI大模型对股票池个股进行打分