继上一篇我们用AI辅助交易策略后,一个自然而然的问题浮出水面:好的策略应该用在哪些股票上?今天,我们将 tackles 这个核心问题,动手构建一个AI驱动的股票筛选器。
我们的目标不是去预测短期股价的涨跌,而是创建一个系统化的流程,它能像一位经验丰富的研究总监,从茫茫股海中,依据我们设定的“好公司”标准,筛选出一份值得我们花时间深入研究的潜力股清单。
!!! 再次强调:这不是投资建议 !!!
在敲下第一行代码前,请允许我第三次重申:
- 这是一个教学工具:为了清晰地展示思路,本文的模型和因子被大大简化。真实的选股模型要复杂得多。
- AI部分是模拟的:文中获取“成长性”和“情绪”的AI函数是占位符,旨在展示AI在选股流程中的位置和作用。
- 筛选结果不是买入清单:这个工具的目的是缩小你的研究范围,而不是直接给你答案。筛选出的每一家公司,都需要你进行更深入的人工尽职调查。
筛选哲学:寻找“三好学生”
一个好的投资标的,往往在多个方面都表现出色。我们的筛选器将寻找这样的“三好学生”,它需要同时满足:
- 价值合理 (Value):不能太贵。我们用经典的**市盈率(P/E Ratio)**来衡量。
- 质量优秀 (Quality):公司本身得能赚钱。我们用**净资产收益率(ROE)**来评估其盈利能力。
- 成长可期 (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))
如何解读结果?
当你看到最终的排行榜时,它告诉你的是:根据我们设定的“价值、质量、成长、情绪”这四个标准和相应的权重,得分最高的公司是综合来看的“最优选”。
但这只是一个开始。你的下一步工作应该是:
- 深入分析第一名:为什么它排第一?是它的估值特别低,还是盈利能力超强,或是AI给了它极高的成长预期?
- 寻找预期差:有没有哪家公司,它的综合排名不高,但在你最看重的某个单项(比如“质量分”)上排第一?这可能也是一个机会。
- 提出批判性问题:AI给出的“成长分”靠谱吗?它是不是仅仅因为这家公司最近总提“AI”这个词?基本面数据是否存在会计窗口装饰的可能?
这个筛选器为你省去了大海捞针的功夫,让你能把精力集中在最有潜力的少数几家公司上,进行更深入、更有价值的研究。这,正是AI赋能投资的真正意义。
...