

今天星球同学问我, 怎么对 策略选出来的几只个股进行打分,因为竞价选出来个股较多,希望选择优质的个股进行交易, 时间短看不过来,希望有个评分。
可能一些同学也有这样的想法。但每个人的个股评分感觉不一样, 那这里采用AI大模型来实现。
在传统股票分析中,投资者需要手动查看K线图、计算技术指标、判断趋势形态,这个过程不仅耗时耗力,还容易受到主观情绪的影响。而AI分析系统可以:
系统使用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自动获取最近一年的股票数据,包括开盘价、收盘价、最高价、最低价和成交量等关键信息。
系统自动计算多种技术指标,为后续分析提供技术支持
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
系统计算的关键技术指标包括:
使用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线图包含:
这是整个系统的核心,使用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()系统会从五个维度对股票进行评分:
大体就这样,完整的代码放在星球了。 其实自己也可以借助AI实现。 这里不得不说,用AI编程辅助写代码也耗费token,烧的也是钱。
如果我的分享对你投资有所帮助,不吝啬给个点赞关注呗。