

今天星球同学问我, 怎么对 策略选出来的几只个股进行打分,因为竞价选出来个股较多,希望选择优质的个股进行交易, 时间短看不过来,希望有个评分。
可能一些同学也有这样的想法。但每个人的个股评分感觉不一样, 那这里采用AI大模型来实现。
为什么用AI模型分析K线图?
在传统股票分析中,投资者需要手动查看K线图、计算技术指标、判断趋势形态,这个过程不仅耗时耗力,还容易受到主观情绪的影响。而AI分析系统可以:
- 1.快速处理海量数据:在几秒钟内分析多只股票
- 2.客观评估:避免情绪化决策
- 3.多维度评分:综合考虑趋势、形态、量价等关键因素
- 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.趋势强度(25分):评估上涨趋势是否明确且稳定
- 2.形态质量(25分):评估K线形态是否完整且符合看涨特征
- 3.量价配合(20分):评估价格上涨是否得到成交量支持
- 4.关键位置(20分):评估价格是否处于关键支撑位或刚突破阻力位
- 5.动量指标(10分):评估RSI、MACD等动量指标是否健康
原文链接:如何利用AI大模型对股票池个股进行打分