继上一篇我们用AI辅助交易策略后,一个自然而然的问题浮出水面:好的策略应该用在哪些股票上?今天,我们将 tackles 这个核心问题,动手构建一个AI驱动的股票筛选器

我们的目标不是去预测短期股价的涨跌,而是创建一个系统化的流程,它能像一位经验丰富的研究总监,从茫茫股海中,依据我们设定的“好公司”标准,筛选出一份值得我们花时间深入研究的潜力股清单。

!!! 再次强调:这不是投资建议 !!!

在敲下第一行代码前,请允许我第三次重申:

  1. 这是一个教学工具:为了清晰地展示思路,本文的模型和因子被大大简化。真实的选股模型要复杂得多。
  2. AI部分是模拟的:文中获取“成长性”和“情绪”的AI函数是占位符,旨在展示AI在选股流程中的位置和作用。
  3. 筛选结果不是买入清单:这个工具的目的是缩小你的研究范围,而不是直接给你答案。筛选出的每一家公司,都需要你进行更深入的人工尽职调查。

筛选哲学:寻找“三好学生”

一个好的投资标的,往往在多个方面都表现出色。我们的筛选器将寻找这样的“三好学生”,它需要同时满足:

  1. 价值合理 (Value):不能太贵。我们用经典的**市盈率(P/E Ratio)**来衡量。
  2. 质量优秀 (Quality):公司本身得能赚钱。我们用**净资产收益率(ROE)**来评估其盈利能力。
  3. 成长可期 (Growth):未来有想象空间。这是我们的AI因子发挥作用的地方,它会分析一家公司的“创新动能”和“市场关注度”。

我们会为每只股票在这些维度上打分,最后计算出一个综合得分,并进行排名。


Let’s Code: 构建AI股票筛选器

第一步:环境与目标

确保你已安装所需库。我们的目标是对一批知名的科技股进行筛选。

import yfinance as yf
import pandas as pd
import numpy as np

# 我们要筛选的股票池 (以部分纳斯达克100成分股为例)
TICKERS = [
    'AAPL', 'MSFT', 'GOOGL', 'AMZN', 'NVDA', 'META', 'TSLA', 
    'AVGO', 'ASML', 'COST', 'AMD', 'PEP', 'CSCO', 'TMUS', 'INTC'
]

第二步:模拟AI因子

在真实世界中,这两个函数背后是复杂的NLP模型和数据管道。在这里,我们用模拟函数来代表它们的功能。

def get_ai_growth_score(ticker):
    """
    模拟AI分析公司的成长潜力。
    真实系统会分析:财报中"AI"等关键词频率、研发投入、新产品发布、专利申请等。
    这里我们用一个基于ticker哈希的伪随机数来模拟。
    返回一个0到100的分数。
    """
    np.random.seed(abs(hash(ticker)) % (10**8))
    return np.random.uniform(50, 95)

def get_ai_sentiment_score(ticker):
    """
    模拟AI分析市场的短期情绪。
    真实系统会分析:新闻文章、社交媒体评论的情绪倾向。
    返回一个-1 (极度悲观) 到 1 (极度乐观) 的分数。
    """
    np.random.seed(abs(hash(ticker)) % (10**8) + 1) # 使用不同的种子
    return np.random.uniform(-0.8, 0.8)

第三步:获取基本面数据

现在,我们用 yfinance 来获取真实的财务数据。注意,API返回的数据可能不全,需要做一些异常处理。

def get_fundamental_data(tickers):
    stock_data = []
    for ticker in tickers:
        try:
            stock = yf.Ticker(ticker)
            info = stock.info
            
            # 安全地获取数据,如果不存在则设为NaN
            pe_ratio = info.get('trailingPE', np.nan)
            roe = info.get('returnOnEquity', np.nan)
            
            if pd.isna(pe_ratio) or pd.isna(roe):
                print(f"警告:无法获取 {ticker} 的完整基本面数据,将跳过。")
                continue

            stock_data.append({
                'Ticker': ticker,
                'P/E Ratio': pe_ratio,
                'ROE (%)': roe * 100, # 转换为百分比
                'AI Growth Score': get_ai_growth_score(ticker),
                'AI Sentiment Score': get_ai_sentiment_score(ticker)
            })
        except Exception as e:
            print(f"获取 {ticker} 数据时出错: {e}")
            
    return pd.DataFrame(stock_data)

# --- 主程序区 ---
df = get_fundamental_data(TICKERS)
print("获取到的原始数据:")
print(df)

第四步:评分引擎

不同指标的量纲不同(P/E可能是几十,ROE是百分之十几),无法直接相加。我们需要先对它们进行“归一化”,将所有指标都转换成0-100分的格式。

  • 对于P/E Ratio,越小越好。
  • 对于ROE、成长性和情绪分,越大越好。
def normalize_and_score(df):
    scored_df = df.copy()
    
    # 评分 P/E Ratio (越小越好)
    # 使用排名来打分,避免极端值影响
    scored_df['Value Score'] = scored_df['P/E Ratio'].rank(ascending=True, pct=True) * 100
    
    # 评分 ROE (越大越好)
    scored_df['Quality Score'] = scored_df['ROE (%)'].rank(ascending=True, pct=True) * 100
    
    # AI分数已经是0-100范围或类似,可以直接用或微调
    # 这里我们直接使用AI成长分,并将情绪分调整到0-100
    scored_df['Growth Score'] = scored_df['AI Growth Score'] # 已经是0-100分制
    scored_df['Sentiment Score'] = (scored_df['AI Sentiment Score'] + 1) / 2 * 100 # 将-1到1映射到0-100
    
    return scored_df

scored_df = normalize_and_score(df)

第五步:计算综合分并排序

最后,我们为不同因子赋予权重,计算出最终的综合得分,并得出最终的排行榜。

# 定义权重
weights = {
    'Value Score': 0.20,
    'Quality Score': 0.30,
    'Growth Score': 0.40,
    'Sentiment Score': 0.10,
}

# 计算总分
scored_df['Total Score'] = (
    scored_df['Value Score'] * weights['Value Score'] +
    scored_df['Quality Score'] * weights['Quality Score'] +
    scored_df['Growth Score'] * weights['Growth Score'] +
    scored_df['Sentiment Score'] * weights['Sentiment Score']
)

# 按总分排序
final_ranking = scored_df.sort_values(by='Total Score', ascending=False)

print("\n--- 最终股票筛选排行榜 ---")
# 为了显示清晰,我们只选择几列最重要的
display_columns = ['Ticker', 'Total Score', 'Value Score', 'Quality Score', 'Growth Score', 'P/E Ratio', 'ROE (%)']
print(final_ranking[display_columns].round(2))

如何解读结果?

当你看到最终的排行榜时,它告诉你的是:根据我们设定的“价值、质量、成长、情绪”这四个标准和相应的权重,得分最高的公司是综合来看的“最优选”。

但这只是一个开始。你的下一步工作应该是:

  1. 深入分析第一名:为什么它排第一?是它的估值特别低,还是盈利能力超强,或是AI给了它极高的成长预期?
  2. 寻找预期差:有没有哪家公司,它的综合排名不高,但在你最看重的某个单项(比如“质量分”)上排第一?这可能也是一个机会。
  3. 提出批判性问题:AI给出的“成长分”靠谱吗?它是不是仅仅因为这家公司最近总提“AI”这个词?基本面数据是否存在会计窗口装饰的可能?

这个筛选器为你省去了大海捞针的功夫,让你能把精力集中在最有潜力的少数几家公司上,进行更深入、更有价值的研究。这,正是AI赋能投资的真正意义。