去年初,我在复盘自己的交易习惯时发现一个痛点:每次分析股票都要在多个软件间反复切换。看K线用同花顺,查基本面用东方财富,找新闻又得打开财经网站,最后还要手动整理这些碎片信息。这种低效的信息获取方式,迫使我开始思考如何用技术手段优化这个流程。
这个AI交易助手(我称之为Trading Partner)的核心定位很明确:不是替代交易决策,而是通过结构化整合各类金融数据,帮助我快速形成对个股和市场更全面的认知。经过半年多的迭代,目前它已具备三大核心功能:
系统采用分层架构设计,主要分为数据层、分析层和交互层:
code复制数据层
├── Tushare Pro(结构化市场数据)
├── 东方财富API(实时行情)
├── 网络爬虫(新闻舆情)
└── 本地数据库(历史数据存储)
分析层
├── 选股引擎(多因子评分模型)
├── 个股分析模块(技术面/基本面/舆情)
└── 大盘分析流水线(市场结构解析)
交互层
├── OpenClaw(自然语言路由)
├── 飞书机器人(用户界面)
└── 妙想Skills(增强数据源)
选择Python作为主要开发语言,主要考虑其在量化领域的丰富生态(Pandas、NumPy、TA-Lib等)。服务部署采用Docker容器化,方便不同模块独立扩展。
数据更新机制:
分析结果缓存:
为避免频繁计算,所有分析结果都会持久化存储。例如选股结果会保存为CSV+PNG组合(数据+图表),大盘分析会生成结构化JSON。
失败处理策略:
为每个数据源配置备用API,当主数据源失效时自动切换。例如Tushare Pro请求失败时会尝试使用AKShare作为fallback。
选股不是简单的指标筛选,而是建立了一个多阶段过滤体系:
初筛阶段:
因子评分模型:
python复制# 示例因子权重配置
factors = {
'momentum': 0.3, # 20日涨幅
'volatility': 0.2, # 波动率
'liquidity': 0.15, # 成交额
'valuation': 0.15, # PE/PB分位数
'news_sentiment': 0.2 # 舆情分数
}
# 分数标准化处理
def normalize_scores(df):
for col in df.columns:
if col in factors:
df[col+'_score'] = (df[col]-df[col].mean())/df[col].std()
return df
当用户询问"某股票是否值得关注"时,系统会并行触发多个分析维度:
技术面分析:
基本面分析:
python复制def get_fundamental_analysis(code):
# 获取最新财报数据
fin_data = tushare.get_fina_indicator(ts_code=code)
# 计算关键指标
analysis = {
'ROE': fin_data['roe'].iloc[0],
'毛利率': fin_data['grossprofit_margin'].iloc[0],
'负债率': fin_data['debt_to_assets'].iloc[0],
'现金流': fin_data['ocfps'].iloc[0]
}
# 行业对比分析
industry_avg = get_industry_avg(fin_data['industry'])
return {**analysis, **industry_avg}
每日收盘后自动生成的市场报告包含:
指数全景:
市场宽度分析:
| 指标 | 数值 | 环比变化 |
|---|---|---|
| 上涨家数 | 1,892 | +15% |
| 涨停数量 | 56 | -8% |
| 连板高度 | 5板 | 持平 |
| 炸板率 | 32% | +5% |
行业轮动监测:
使用SW行业分类,计算当日行业强度指数:
python复制def calc_industry_strength():
industry_df = get_industry_data()
industry_df['strength'] = 0.4*industry_df['涨跌幅'] + 0.3*industry_df['成交额占比'] + 0.3*industry_df['资金流入']
return industry_df.sort_values('strength', ascending=False)
在飞书开发平台创建机器人后,需要配置OpenClaw的路由规则:
yaml复制routes:
- pattern: "推荐(今日|今天)股票"
service: "stock_recommend"
params: {"type": "daily"}
- pattern: "分析(.{2,6})(技术面|基本面)"
service: "stock_analysis"
params: {"code": "$1", "type": "$2"}
- pattern: "今天大盘(怎么样|情况)"
service: "market_report"
采用飞书交互式消息卡片展示分析结果,关键设计点:
预生成+缓存:
开盘前预计算常见问题的答案模板,运行时只填充变量数据。
异步处理:
对于耗时操作(如生成走势图),先返回文字结论,再通过飞书消息更新推送图片。
请求合并:
当多个用户查询同一只股票时,合并数据请求减少API调用。
遇到过几个典型问题:
财务数据异常值:
python复制# 处理PE为负或异常大的情况
def clean_pe(df):
df['PE'] = df['PE'].apply(lambda x: np.nan if x <0 or x >500 else x)
return df.fillna(df['PE'].median())
新闻去重策略:
K线数据校验:
对比不同数据源的收盘价,当差异>1%时触发报警人工复核。
避免过度拟合:
时间区间选择:
技术分析默认采用最近90个交易日数据,避免短期噪音干扰。
板块联动处理:
分析个股时自动关联其所属板块的近期表现,但会标注"相关性需验证"。
部署了以下保障措施:
健康检查:
异常检测:
python复制# 监控选股结果分布变化
def check_recommendation():
today = get_today_recommendation()
hist = load_historical_data()
# 检查行业分布突变
industry_change = calc_distribution_change(today, hist)
if industry_change > 0.3:
alert(f"行业分布变化过大: {industry_change}")
日志分析:
经过3个月的实际使用,这个系统帮我:
对于想尝试类似项目的开发者,我的建议是:
这个项目的代码我已部分开源在GitHub(隐去敏感配置),核心价值不在于具体实现,而在于展示如何将AI技术真正落地到专业领域的工作流中。下一步计划增强板块轮动监测能力,并尝试接入更多另类数据源。