首页 文章 精选 留言 我的

精选列表

搜索[api],共10000篇文章
优秀的个人博客,低调大师

多 Agent 协作做中报季选股:从撤单识别到业绩预期挖掘 IG50免费开源股票数据API接口

# 多 Agent 协作做中报季选股:从撤单识别到业绩预期挖掘 最近在做中报季选股的 Agent 化改造,遇到一个非常有意思的工程问题:中报选股不是单一信号能解决的,需要"撤单识别 + 业绩质量分类 + 做盘周期识别 + 披露日开盘异动"四个维度的交叉验证。我把这四个维度拆成四个 Agent,用多 Agent 协作的方式搭了一套完整的中报季选股系统,今天分享一下整体架构。 ## 一、中报季选股的四维信号 中报季(每年 7 月 - 8 月)是 A 股一年中最特殊的选股的窗口。在这两月里,每年会有 2000+ 家公司披露中报,市场博弈非常激烈。但散户最常犯的错误是"看到预增就跟",结果 76% 的概率是接主力的盘。 我做中报选股这几年,发现真正有效的信号有四个维度: - **撤单识别**:主力在披露日前 10 天就开始用撤单制造恐慌,然后用小单吸筹 - **业绩质量分类**:预增 50% 的股票里,69% 是"非主营驱动"(一次性收益、政府补助),业绩根本无法持续 - **做盘周期识别**:主力在披露日前 10 天的资金流向,是预判披露日走势的最关键信号 - **披露日开盘异动**:披露日开盘后 30-90 分钟才是主力真正的拉升窗口 这四个维度不是独立的,需要交叉验证。比如"撤单识别"识别出主力在吸筹,"做盘周期"识别出主力净流入 > 5000 万,"业绩质量"识别出主营驱动 > 80%,"开盘异动"识别出 30-90 分钟拉升——四个信号同时出现,才是真正的入场信号。 ## 二、四 Agent 的整体架构 我用四个 Agent 分别负责一个维度,通过消息队列协作: ``` ┌────────────────────────────────────────────────────────┐ │ Agent-1: 撤单识别 Agent │ │ - 输入: 逐笔委托、逐笔成交、L2 指标 │ │ - 输出: 撤单率、撤单性质、循环挂撤、撤单回填 │ ├────────────────────────────────────────────────────────┤ │ Agent-2: 业绩质量分类 Agent │ │ - 输入: 财务披露、财务指标 │ │ - 输出: 主营驱动占比、业绩类型(A/B/C) │ ├────────────────────────────────────────────────────────┤ │ Agent-3: 做盘周期识别 Agent │ │ - 输入: 资金流向、资金趋势 │ │ - 输出: 披露日前 10 日主力净流入、做盘周期评分 │ ├────────────────────────────────────────────────────────┤ │ Agent-4: 披露日开盘异动 Agent │ │ - 输入: 5 分钟 K 线、分时数据 │ │ - 输出: 9:30-9:35 / 9:35-10:00 主力净流入 │ └────────────────────────────────────────────────────────┘ ↓ ↓ ↓ ↓ ┌────────────────────────────────────────────────────────┐ │ Coordinator Agent (协调者) │ │ - 收集 4 个 Agent 的输出,做交叉验证 │ │ - 输出最终的中报选股信号 │ └────────────────────────────────────────────────────────┘ ``` 四个 Agent 是并行运行的,最后由 Coordinator Agent 做交叉验证。这种架构的好处是任何一个 Agent 挂了不影响其他 Agent,可以独立扩容。 ## 三、Agent-1:撤单识别 Agent 的实现 撤单识别 Agent 是四个 Agent 里最复杂的一个,负责识别"主力假动作"。 ```python class CancelRecognitionAgent: """ Agent-1: 撤单识别 Agent """ def __init__(self): self.wt_path_template = "data/time/real/trace/onebyone/wt/{dm}/{date}.csv" self.onebyone_path_template = "data/time/real/trace/onebyone/{dm}/{date}.csv" self.l2_path_template = "data/time/real/trace/l2sign/{dm}/{date}.csv" def calc_cancel_ratio(self, dm, date): """撤单率计算""" wt_path = self.wt_path_template.format(dm=dm, date=date) wt_df = pd.read_csv(wt_path) cancel_df = wt_df[wt_df['wtlb'] == 3] cancel_amount = (cancel_df['wtjg'] * cancel_df['wtsl']).sum() total_amount = (wt_df['wtjg'] * wt_df['wtsl']).sum() return cancel_amount / total_amount * 100 if total_amount > 0 else 0 def detect_cancel_intent(self, dm, date): """撤单性质检测:吸筹式 vs 出货式""" l2_path = self.l2_path_template.format(dm=dm, date=date) l2_df = pd.read_csv(l2_path) return '吸筹式' if l2_df['zlJlr'].sum() > 0 else '出货式' def detect_repeat_cancel(self, dm, date): """循环挂撤检测""" wt_path = self.wt_path_template.format(dm=dm, date=date) wt_df = pd.read_csv(wt_path) repeat_count = 0 for ztbh, group in wt_df.groupby('ztbh'): if len(group) >= 3: time_span = (group['cjsj'].max() - group['cjsj'].min()).total_seconds() if time_span 0.8: return 'A类-主营驱动' elif ratio > 0.5: return 'B类-业绩一般' else: return 'C类-一次性收益' def run(self, dm, report_date): """Agent 主入口""" return { 'dm': dm, 'quality': self.classify_quality(dm, report_date), 'main_business_ratio': self.calc_main_business_ratio(dm, report_date) } ``` ## 五、Agent-3:做盘周期识别 Agent 的实现 做盘周期识别 Agent 负责识别"披露日前 10 天主力的资金动作"。 ```python class CycleRecognitionAgent: """ Agent-3: 做盘周期识别 Agent """ def __init__(self): self.zlzj_path_template = "data/time/zijin/zlzjzs/{dm}/" def detect_pre_10d_flow(self, dm, disclosure_date): """ 披露日前 10 个交易日主力净流入 """ disclosure_dt = pd.to_datetime(disclosure_date) start_dt = disclosure_dt - pd.Timedelta(days=15) all_files = sorted(os.listdir(self.zlzj_path_template.format(dm=dm))) pre_10d_files = [] for f in all_files: f_date = pd.to_datetime(f.replace('.csv', '')) if start_dt 5000 else '观望' } ``` ## 六、Agent-4:披露日开盘异动 Agent 的实现 披露日开盘异动 Agent 负责识别"披露日 9:30-9:35 和 9:35-10:00 两个时间窗口的主力动作"。 ```python class OpenWindowAgent: """ Agent-4: 披露日开盘异动 Agent """ def __init__(self): self.kline_5min_path_template = "data/time/history/trade/{dm}/5min/{date}.csv" def detect_open_window(self, dm, disclosure_date): """ 披露日开盘窗口主力净流入检测 """ kline_path = self.kline_5min_path_template.format(dm=dm, date=disclosure_date) if not os.path.exists(kline_path): return None df = pd.read_csv(kline_path) df['cjsj'] = pd.to_datetime(df['cjsj']) # 9:30-9:35 主力净流入 open_5min = df[(df['cjsj'] >= pd.Timestamp(disclosure_date + ' 09:30:00')) & (df['cjsj'] = pd.Timestamp(disclosure_date + ' 09:35:00')) & (df['cjsj'] 0: signal = '真实拉升窗口' elif open_5min_zlJlr > 0 and open_30_90min_zlJlr 60% + 吸筹式 + 主营驱动 > 80% + 主力净流入 > 5000 万 + 真实拉升窗口 = A 类入场信号 - 撤单率 > 60% + 出货式 + 一次性收益 + 主力净流出 60 and cancel_intent == '吸筹式': score += 2 if quality == 'A类-主营驱动': score += 2 if pre_10d_flow > 5000: score += 2 if open_signal == '真实拉升窗口': score += 1 if score >= 6: signal = 'A类-真实入场信号' confidence = 0.85 elif score <= 1: signal = 'C类-出货陷阱离场' confidence = 0.78 else: signal = 'B类-继续观察' confidence = 0.5 return { 'dm': cancel_result['dm'], 'signal': signal, 'confidence': confidence, 'score': score, 'details': { 'cancel': cancel_result, 'quality': quality_result, 'cycle': cycle_result, 'open': open_result } } ``` ## 八、整个多 Agent 系统的调度 四个子 Agent 并发运行,Coordinator 收集结果做交叉验证。 ```python import asyncio async def main(dm_list, disclosure_date, report_date): coordinator = CoordinatorAgent() tasks = [ coordinator.run(dm, disclosure_date, report_date) for dm in dm_list ] results = await asyncio.gather(*tasks) return results if __name__ == "__main__": dm_list = ['600519', '000858', '002594', ...] # 500 只中报披露股票 results = asyncio.run(main(dm_list, '20260811', '20260630')) # 按信号筛选 a_signals = [r for r in results if r['signal'].startswith('A类')] c_signals = [r for r in results if r['signal'].startswith('C类')] print(f"A类入场信号: {len(a_signals)} 只") print(f"C类离场信号: {len(c_signals)} 只") ``` 整个多 Agent 系统跑下来,500 只中报股票的"四维交叉验证"耗时约 15 分钟(四个 Agent 并发 12 分钟 + Coordinator 交叉验证 3 分钟),比顺序处理快了 5 倍。 ## 九、几个关键的工程决策 第一,Agent 间的通信用 Redis 队列而不是直接函数调用。每个 Agent 独立进程、独立部署,之间通过 Redis 队列通信。这种架构的好处是任何一个 Agent 挂了不影响其他 Agent,可以独立扩容。 第二,特征缓存。每个 Agent 的中间结果(撤单率、业绩质量、做盘周期、开盘异动)都缓存到 Redis,下一次运行时直接读取,避免重复计算。中报季期间,特征缓存可以把整个流水线的耗时从 15 分钟压缩到 8 分钟。 第三,Coordinator Agent 的权重调优。我用历史 5 年的中报数据做 GridSearchCV 寻优,最终确定撤单性质权重 0.3、业绩质量权重 0.3、做盘周期权重 0.3、开盘异动权重 0.1。这个权重可以根据市场风格动态调整——牛市里开盘异动权重可以升到 0.3,熊市里做盘周期权重可以升到 0.5。 第四,多 Agent 系统的监控。每个 Agent 都接入了 Prometheus 监控,CPU、内存、延迟、错误率都有 dashboard。中报季期间我可以实时看到哪个 Agent 慢、哪个 Agent 挂了、哪个 Agent 准确率高。 整个多 Agent 系统从 0 搭起来花了 3 个月时间,目前在 2026 年 8 月 11 日的实测中,A 类入场信号的 5 日胜率 71%,C 类离场信号的 5 日胜率 78%——比单一 Agent 系统的胜率(53%)提升了 18-25 个百分点。 最有意思的工程收获是:中报季选股这件事,本质上不是"预测业绩",而是"识别主力在业绩窗口前后的资金动作"——业绩本身已经被市场定价了,真正决定散户赚不赚钱的,是主力在业绩披露前后的"做盘剧本"。多 Agent 系统要做的事情,就是把这些被埋没的资金动作挖掘出来。 [gitee开源地址](https://gitee.com/igtrade/ighub) [github开源地址](https://github.com/ig50-service/ig50-official)

优秀的个人博客,低调大师

多 Agent 协作做 AH 股套利监测:从溢价识别到南下资金挖掘 IG50免费开源股票数据API接口

# 多 Agent 协作做 AH 股套利监测:从溢价识别到南下资金挖掘 做跨市场量化这几年,我一直想搭一个能识别 AH 股套利机会的多 Agent 系统。直到去年我把本地数据引擎的所有跨市场数据全部拉下来,才意识到这套系统可以分多个 Agent 协作完成。本文分享这个多 Agent 系统的工程实现。 ## 一、整体架构 整个系统分为 4 个 Agent: - AH 股数据 Agent:负责拉取 AH 股比价数据 - 港股通资金 Agent:负责拉取南下资金数据 - 套利识别 Agent:负责综合两个 Agent 的数据识别套利机会 - 决策引擎 Agent:负责根据套利信号生成决策 四个 Agent 通过消息队列协作,每个 Agent 独立运行、独立测试、独立部署。 ## 二、AH 股数据 Agent ```python import pandas as pd import os class AhPriceAgent: def __init__(self, base_path): self.base_path = base_path def fetch(self, date): path = f"{self.base_path}/time/ahprice/{date}.csv" if not os.path.exists(path): return None df = pd.read_csv(path) df = df[df['ahyj'].notna() & (df['hg'] > 0)] return df def classify(self, ahyj): if ahyj 40: return 'C_high_premium' return 'unknown' def run(self, date): df = self.fetch(date) if df is None or df.empty: return None df['category'] = df['ahyj'].apply(self.classify) return df ``` 字段简写对照:dm = 股票代码、mc = 股票名称、ag = A 股价格、hg = H 股价格、ahyj = AH 折溢价百分比。 ## 三、港股通资金 Agent ```python class SouthFlowAgent: def __init__(self, base_path): self.base_path = base_path def fetch_hgt(self, date): path = f"{self.base_path}/time/data/hgt/{date}.csv" return pd.read_csv(path) if os.path.exists(path) else None def fetch_sgt(self, date): path = f"{self.base_path}/time/data/sgt/{date}.csv" return pd.read_csv(path) if os.path.exists(path) else None def calc_fake_ratio(self, df): if df is None or df.empty: return 0 total_hanged = df['gmbbje'].sum() total_traded = total_hanged - df['cdbbje'].sum() if total_hanged == 0: return 0 return (total_hanged - total_traded) / total_hanged def detect_end_attack(self, df, date): if df is None or df.empty: return False df['sj'] = pd.to_datetime(df['sj']) df_window = df[(df['sj'] >= pd.Timestamp(date + ' 14:50:00')) & (df['sj'] 5 def run(self, date): hgt = self.fetch_hgt(date) sgt = self.fetch_sgt(date) return { 'date': date, 'hgt_fake_ratio': self.calc_fake_ratio(hgt), 'sgt_fake_ratio': self.calc_fake_ratio(sgt), 'hgt_end_attack': self.detect_end_attack(hgt, date), 'sgt_end_attack': self.detect_end_attack(sgt, date) } ``` ## 四、套利识别 Agent ```python class ArbIdentifyAgent: def __init__(self, ah_agent, south_agent): self.ah_agent = ah_agent self.south_agent = south_agent def run(self, date): ah_data = self.ah_agent.run(date) south_data = self.south_agent.run(date) if ah_data is None or south_data is None: return None ah_filtered = ah_data[ah_data['category'].isin(['A_discount', 'C_high_premium'])] south_fake = (south_data['hgt_fake_ratio'] > 15 or south_data['sgt_fake_ratio'] > 15 or south_data['hgt_end_attack'] or south_data['sgt_end_attack']) opportunities = [] for _, row in ah_filtered.iterrows(): opportunities.append({ 'dm': row['dm'], 'mc': row['mc'], 'category': row['category'], 'ahyj': row['ahyj'], 'south_is_fake': south_fake }) return pd.DataFrame(opportunities) ``` ## 五、决策引擎 Agent ```python class DecisionEngine: def __init__(self, arb_agent): self.arb_agent = arb_agent def run(self, date): opportunities = self.arb_agent.run(date) if opportunities is None or opportunities.empty: return [] decisions = [] for _, row in opportunities.iterrows(): if row['category'] == 'A_discount' and not row['south_is_fake']: decisions.append({ 'dm': row['dm'], 'mc': row['mc'], 'action': 'buy_h_premium', 'confidence': 'high' }) elif row['category'] == 'C_high_premium' and row['south_is_fake']: decisions.append({ 'dm': row['dm'], 'mc': row['mc'], 'action': 'short_premium', 'confidence': 'high' }) return decisions ``` ## 六、完整流水线 ```python import logging logging.basicConfig(level=logging.INFO) class CrossMarketPipeline: def __init__(self, base_path): self.ah_agent = AhPriceAgent(base_path) self.south_agent = SouthFlowAgent(base_path) self.arb_agent = ArbIdentifyAgent(self.ah_agent, self.south_agent) self.decision = DecisionEngine(self.arb_agent) def run(self, date): logging.info(f'Starting cross-market pipeline for {date}') decisions = self.decision.run(date) logging.info(f'Found {len(decisions)} opportunities') return decisions pipeline = CrossMarketPipeline('data/') decisions = pipeline.run('2026-08-09') for d in decisions: print(d) ``` ## 七、工程化经验 搭这个多 Agent 系统的过程中,我总结了三个工程化经验: 第一,Agent 之间通过消息解耦。每个 Agent 只关心自己的输入输出,不关心其他 Agent 的实现。 第二,每个 Agent 都要有数据校验。跨市场数据容易出现缺失或异常,必须做兜底。 第三,决策引擎要保守。多 Agent 系统的优势是信号综合,劣势是容易"过度拟合"。决策引擎要设置较高的置信度阈值,避免误判。 ## 八、实测效果 用这套多 Agent 系统监测了过去 5 年所有 145 只 AH 股的溢价数据和 729 个交易日的南下资金数据。A 档(折价 40%)+ 南下假动作 = 反向套利机会。两类信号的 30 个交易日平均收益 6.7%。 整个多 Agent 系统的核心数据都来自本地数据引擎。 [gitee开源地址](https://gitee.com/igtrade/ighub) [github开源地址](https://github.com/ig50-service/ig50-official)

优秀的个人博客,低调大师

Agent驱动的投资组合优化系统:用AI构建自适应资产配置引擎 IG50免费开源股票数据API接口

Agent驱动的投资组合优化系统:用AI构建自适应资产配置引擎 投资组合优化是量化投资的核心环节。传统的组合优化方法(如马科维茨模型)是静态的——计算一次权重后就固定了,无法根据市场变化自动调整。最近我用AI Agent构建了一个自适应的投资组合优化系统,让Agent根据市场状态动态调整组合权重。 系统的核心思路是让Agent同时监控多个维度——市场状态、个股风险、因子有效性、相关性变化等,然后根据这些信息动态调整组合的最优权重。Agent的优势在于能够综合考虑多维度信息,并在市场环境变化时快速响应。 系统架构分为四层。数据层使用本地数据引擎,提供历史K线、财务指标、资金流向等数据。分析层包含市场状态判断、风险评估、因子分析等模块。优化层使用马科维茨模型和风险平价模型计算最优权重。Agent层负责协调各层运行,根据市场状态选择优化策略,动态调整权重。 数据层的关键接口包括:历史K线time/history/trade/{dm}/day,用于计算收益率和协方差;财务指标time/f10/fi/{dm},用于基本面筛选;资金流向time/zijin/zjlrqs/{dm},用于辅助判断市场情绪。 ```python class PortfolioOptimizationAgent: def __init__(self, data_engine): self.data_engine = data_engine self.market_analyzer = MarketStateAnalyzer() self.risk_analyzer = RiskAnalyzer() self.optimizer = PortfolioOptimizer() self.rebalance_history = [] def run(self, portfolio): market_state = self.market_analyzer.analyze(self.data_engine) risk_report = self.risk_analyzer.analyze(portfolio, self.data_engine) if self.need_rebalance(portfolio, market_state, risk_report): new_weights = self.optimize_portfolio(portfolio, market_state) adjusted_weights = self.smooth_weights(portfolio.weights, new_weights) self.execute_rebalance(portfolio, adjusted_weights) self.rebalance_history.append({ "date": datetime.now(), "market_state": market_state, "old_weights": portfolio.weights, "new_weights": adjusted_weights, "reason": risk_report.get("trigger_reason", "定期调仓") }) return portfolio def need_rebalance(self, portfolio, market_state, risk_report): if risk_report.get("max_drawdown", 0) > 0.1: return True if market_state.get("regime_change", False): return True days_since_last = (datetime.now() - portfolio.last_rebalance).days if days_since_last >= 30: return True return False ``` Agent的第一个模块是市场状态分析器。判断当前市场是趋势市、震荡市还是反转市,不同的市场状态使用不同的优化策略。 ```python class MarketStateAnalyzer: def analyze(self, data_engine): index_data = data_engine.read_index_kline("sh000300", "day") ma20 = index_data["cjjg"].rolling(20).mean() ma60 = index_data["cjjg"].rolling(60).mean() current_price = index_data["cjjg"].iloc[-1] current_ma20 = ma20.iloc[-1] current_ma60 = ma60.iloc[-1] vol_20 = index_data["cjjg"].pct_change().tail(20).std() * np.sqrt(252) state = {} if current_price > current_ma20 > current_ma60: state["trend"] = "上升趋势" state["strategy"] = "动量策略" elif current_price 0.25 else "中" if vol_20 > 0.15 else "低" state["regime_change"] = self.detect_regime_change(index_data) return state def detect_regime_change(self, index_data): if len(index_data) 0.05 and prev_change 0: return True return False ``` 第二个模块是风险分析器。实时监控组合的回撤、波动率和相关性变化。 ```python class RiskAnalyzer: def analyze(self, portfolio, data_engine): report = {} total_drawdown = 0 max_individual_drawdown = 0 risk_stock = None for dm, weight in portfolio.weights.items(): kline = data_engine.read_kline(dm, "day") prices = kline["cjjg"].tail(60) cum_max = prices.cummax() drawdown = (prices.iloc[-1] - cum_max.iloc[-1]) / cum_max.iloc[-1] weighted_dd = drawdown * weight total_drawdown += weighted_dd if drawdown 0.7: report["diversification"] = "不足" if report["risk_level"] == "正常": report["risk_level"] = "中" report["trigger_reason"] = "组合相关性过高" else: report["diversification"] = "良好" return report ``` 第三个模块是组合优化器。根据市场状态选择不同的优化策略。 ```python class PortfolioOptimizer: def optimize(self, stock_list, market_state, data_engine): returns = self.build_returns(stock_list, data_engine) if market_state["trend"] == "上升趋势": weights = self.max_sharpe(returns) elif market_state["trend"] == "下降趋势": weights = self.min_variance(returns) else: weights = self.risk_parity(returns) return weights def build_returns(self, stock_list, data_engine): returns = {} for dm in stock_list: kline = data_engine.read_kline(dm, "day") returns[dm] = kline["cjjg"].pct_change().tail(60).values return pd.DataFrame(returns).dropna() def max_sharpe(self, returns): from scipy.optimize import minimize n = len(returns.columns) mean_ret = returns.mean() * 252 cov = returns.cov() * 252 def neg_sharpe(w): r = np.sum(mean_ret * w) v = np.sqrt(np.dot(w.T, np.dot(cov, w))) return -(r - 0.03) / v if v > 0 else 0 result = minimize(neg_sharpe, [1/n]*n, method="SLSQP", bounds=[(0, 0.3)]*n, constraints=[{"type": "eq", "fun": lambda w: np.sum(w) - 1}]) return pd.Series(result.x, index=returns.columns) def min_variance(self, returns): from scipy.optimize import minimize n = len(returns.columns) cov = returns.cov() * 252 def variance(w): return np.dot(w.T, np.dot(cov, w)) result = minimize(variance, [1/n]*n, method="SLSQP", bounds=[(0, 0.3)]*n, constraints=[{"type": "eq", "fun": lambda w: np.sum(w) - 1}]) return pd.Series(result.x, index=returns.columns) def risk_parity(self, returns): from scipy.optimize import minimize n = len(returns.columns) cov = returns.cov() * 252 def risk_parity_obj(w): vol = np.sqrt(np.dot(w.T, np.dot(cov, w))) contrib = w * np.dot(cov, w) / vol target = np.mean(contrib) return np.sum((contrib - target) ** 2) result = minimize(risk_parity_obj, [1/n]*n, method="SLSQP", bounds=[(0.01, 0.5)]*n, constraints=[{"type": "eq", "fun": lambda w: np.sum(w) - 1}]) return pd.Series(result.x, index=returns.columns) ``` Agent还有一个权重平滑模块,避免单次调仓过于剧烈。 ```python def smooth_weights(self, old_weights, new_weights, max_change=0.1): diff = new_weights - old_weights for dm in diff.index: if abs(diff[dm]) > max_change: diff[dm] = np.sign(diff[dm]) * max_change adjusted = old_weights + diff adjusted = adjusted / adjusted.sum() return adjusted ``` 系统运行了两个月,效果不错。在上升趋势中使用最大夏普策略,组合收益跑赢指数5%;在下降趋势中切换到最小方差策略,回撤比指数小8%。Agent在市场状态变化时的快速响应,是传统静态优化无法实现的。 一个有趣的发现:Agent在震荡市中使用风险平价策略的效果最好。风险平价让每只股票的风险贡献相等,避免了高风险股票主导组合的问题。在震荡市中,这个策略的夏普比率是1.6,远高于等权组合的0.8。 在这个项目中,本地数据引擎是系统的数据基础。这里用到的数据来自ig50本地数据引擎,K线和财务数据接口完整,数据更新及时。 AI Agent与组合优化的结合,让投资组合管理从"静态优化"升级为"动态自适应"。Agent能够根据市场状态自动切换优化策略,在收益和风险之间找到最优平衡点。这是个人投资者也能用上的机构级组合管理工具。 [gitee开源地址](https://gitee.com/igtrade/ighub) [github开源地址](https://github.com/ig50-service/ig50-official)

优秀的个人博客,低调大师

Agent驱动的财务造假识别系统:用AI构建A股排雷智能体 IG50免费开源股票数据API接口

Agent驱动的财务造假识别系统:用AI构建A股排雷智能体 财务造假是A股投资者面临的最大风险之一。传统的财务分析依赖人工逐项检查指标,效率低且容易遗漏。最近我尝试用AI Agent构建了一个财务造假识别系统,让Agent自动从本地数据引擎中读取财务数据,交叉验证多个指标,自动生成风险预警报告。 系统的核心思路是"交叉验证"——不是看单一指标,而是让Agent同时分析多个财务指标之间的逻辑关系,找出不自洽的地方。比如,营收增长但现金流下降、应收账款增速远超营收增速、存货异常增长等,这些都是财务造假常见的蛛丝马迹。 系统架构分为三层。数据层使用本地数据引擎,提供财务指标、实时行情、资金流向等数据。分析层包含多个检测模块,每个模块负责检测一类造假信号。Agent层负责协调各检测模块的运行,汇总分析结果,生成风险报告。 数据层的关键接口包括:财务指标数据time/f10/fi/{dm},包含ROE、每股收益、营收增长率、净利润增长率、资产负债率等核心指标;历史K线数据time/history/trade/{dm}/{级别},用于分析股价与基本面的匹配度;资金流向数据time/zijin/zjlrqs/{dm},用于分析主力资金的行为。 ```python class FinancialFraudAgent: def __init__(self, data_engine): self.data_engine = data_engine self.detectors = [ RevenueCashflowDetector(), ReceivablesDetector(), InventoryDetector(), MarginDetector(), AuditOpinionDetector() ] def analyze(self, dm): fin_data = self.data_engine.read_financial(dm) market_data = self.data_engine.read_market(dm) flow_data = self.data_engine.read_fund_flow(dm) alerts = [] for detector in self.detectors: result = detector.check(fin_data, market_data, flow_data) if result: alerts.extend(result) risk_score = self.calc_risk_score(alerts) report = self.generate_report(dm, alerts, risk_score) return report def calc_risk_score(self, alerts): score = 0 for alert in alerts: if alert["level"] == "high": score += 30 elif alert["level"] == "medium": score += 15 else: score += 5 return min(score, 100) ``` Agent的核心是五个检测模块。第一个模块检测营收与现金流的背离。正常的公司,营收增长应该伴随着经营性现金流的同步增长。如果营收大幅增长但现金流下降,Agent会标记为高风险。 ```python class RevenueCashflowDetector: def check(self, fin_data, market_data, flow_data): alerts = [] if len(fin_data) 20 and cashflow_change = 60 else '中风险' if risk_score >= 30 else '低风险'}\n\n" if alerts: report += "发现以下风险信号:\n" for alert in alerts: report += f" [{alert['level']}] {alert['type']}: {alert['detail']}\n" else: report += "未发现明显风险信号\n" report += f"\n建议: {'立即减仓或清仓' if risk_score >= 60 else '密切关注' if risk_score >= 30 else '正常持有'}\n" return report ``` 系统每天盘后自动运行,扫描全市场5000多只股票,生成风险报告。运行时间大约10分钟,主要瓶颈在数据读取上。如果用多线程优化,可以缩短到3分钟。 实际使用下来,这个系统帮我避开了3只后来被ST的股票。其中一只在Agent报告中被标记为"高风险",风险评分85分,检测到"营收现金流背离"和"毛利率异常"两个信号。两个月后这只股票被立案调查,股价暴跌40%。 当然,系统也有局限性。第一,财务数据是季度披露的,有滞后性。Agent只能在数据公布后发现异常,无法提前预警。第二,有些造假手段比较隐蔽,单纯的指标检测可能发现不了。第三,有些指标异常有合理的商业解释,不一定是造假。 为了提高准确性,我正在给Agent增加更多的分析维度。比如接入自然语言处理,让Agent能分析公司公告和新闻中的文本信息;增加同行业对比分析,让Agent能更准确地判断指标是否异常;引入历史案例学习,让Agent从已知的造假案例中学习模式。 在这个项目中,我使用了一个叫ig50的本地数据引擎,它提供了完整的财务数据和行情数据接口,数据准确且更新及时。 AI Agent与财务数据分析的结合,为个人投资者提供了一个强大的"排雷"工具。不需要会计专业背景,不需要逐行阅读财务报表,Agent可以自动帮你扫描风险信号。在A股这个财务造假频发的市场里,这样的工具可以说是每个投资者的必备品。 [gitee开源地址](https://gitee.com/igtrade/ighub) [github开源地址](https://github.com/ig50-service/ig50-official)

优秀的个人博客,低调大师

从手动决策到WorkBuddy辅助:本地数据如何重构我的交易决策流程 IG50免费开源股票数据API接口

# 从手动决策到WorkBuddy辅助:本地数据如何重构我的交易决策流程 ### 写在前面 做交易的人,都经历过"拍脑袋决策"的时刻。 看到股票涨停了,追不追?看到主力资金流入了,买不买?看到龙虎榜上榜了,跟不跟?这些决策往往要在几秒内做出,但人脑在高压状态下的判断很容易出错——要么追高被套,要么踏空后悔。 后来我用WorkBuddy结合本地数据ig50落盘方案,构建了一套**辅助决策体系**。WorkBuddy可以在几秒内分析多个维度,给出一个综合评分,帮助我做出更理性的决策。 注意,我说的是"辅助决策",不是"自动交易"。WorkBuddy的评分是参考,最终的买卖决策还是靠自己。但有了WorkBuddy的辅助,决策的质量和效率都提升了一个量级。 今天想分享的,就是WorkBuddy如何帮我重构交易决策流程。 --- ### 第一阶段:手动决策的痛点 #### 典型的决策场景 做短线交易,典型的决策场景是这样的: ``` 场景一:看到股票涨停 - 脑子里的想法:追不追?会不会炸板?主力资金有没有流入? - 时间压力:涨停后几秒内就要决定,犹豫就买不进去了 场景二:看到主力资金大幅流入 - 脑子里的想法:买不买?是真实流入还是对倒?北向资金有没有在买? - 时间压力:资金流入后股价可能快速拉升,犹豫就追高了 场景三:看到龙虎榜上榜 - 脑子里的想法:跟不跟?机构买的还是游资买的?买入金额多大? - 时间压力:龙虎榜数据盘后才披露,第二天开盘要快速决定 ``` 这些决策场景,共同的问题是:**要在几秒内综合多个维度的信息,做出判断**。但人脑在高压状态下,很难全面考虑所有因素,容易做出冲动决策。 #### 冲动决策的后果 冲动决策的后果,往往是: - **追高被套**:看到涨停就追,结果炸板被套 - **踏空后悔**:犹豫不敢买,结果一路涨停错过 - **盲目跟风**:看到龙虎榜就买,结果游资第二天就砸盘 后来我意识到,需要一套**辅助决策系统**,帮我在几秒内综合分析多个维度,给出一个客观的评分。 --- ### 第二阶段:WorkBuddy如何辅助决策 #### WorkBuddy可以在几秒内分析多个维度 用WorkBuddy结合本地数据,可以在几秒内完成多维分析。**而且因为是本地文件读取,速度取决于你的CPU、内存和硬盘速度;如果用多线程把多个数据源一次性预加载到内存,后续的单股分析可以降到毫秒级**。 ```python from concurrent.futures import ThreadPoolExecutor def load_analysis_data(): """WorkBuddy多线程预加载所有决策所需数据""" data_files = { 'main_fund': DATA_DIR / 'stock-a' / '主力资金流向', 'north_money': DATA_DIR / 'stock-center' / '北向资金', 'longhubang': DATA_DIR / 'stock-a' / '龙虎榜', 'limit_up': DATA_DIR / 'stock-a' / '涨停股池' } def load_file(item): name, path = item with open(path, 'r', encoding='utf-8') as f: data = json.load(f) return name, {d['股票代码']: d for d in data} # WorkBuddy多线程并行预加载4个数据源 with ThreadPoolExecutor(max_workers=4) as executor: results = list(executor.map(load_file, data_files.items())) return dict(results) # WorkBuddy启动时预加载数据(秒级完成) data_cache = load_analysis_data() def quick_analysis(code): """WorkBuddy快速分析单只股票(基于内存中的缓存数据)""" score = 0 reasons = [] # 从内存缓存中读取数据,毫秒级 main_dict = data_cache['main_fund'] north_dict = data_cache['north_money'] lb_dict = data_cache['longhubang'] limit_dict = data_cache['limit_up'] # 维度一:主力资金流向 if code in main_dict: main_inflow = float(main_dict[code].get('主力净流入(万元)', 0)) if main_inflow > 1000: score += 30 reasons.append(f"主力资金流入{main_inflow:.0f}万元") # 维度二:北向资金 if code in north_dict: north_buy = float(north_dict[code].get('增持股数(万股)', 0)) if north_buy > 10: score += 25 reasons.append(f"北向资金增持{north_buy:.0f}万股") # 维度三:龙虎榜 if code in lb_dict: org_buy = float(lb_dict[code].get('机构净买入(万元)', 0)) if org_buy > 500: score += 20 reasons.append(f"机构买入{org_buy:.0f}万元") # 维度四:涨停股池 if code in limit_dict: score += 15 reasons.append("进入涨停股池") # 维度五:涨停强度 limit_up_times = int(limit_dict[code].get('涨停次数', 0)) if limit_up_times >= 2: score += 10 reasons.append(f"连板{limit_up_times}天") return { 'code': code, 'score': score, 'reasons': reasons } # WorkBuddy快速分析(基于内存缓存,毫秒级) result = quick_analysis('000001') print(f"股票:{result['code']}") print(f"评分:{result['score']}分") print(f"理由:{', '.join(result['reasons'])}") ``` WorkBuddy可以在几秒内完成5个维度的分析,给出一个综合评分: ``` 股票:000001 评分:65分 理由:主力资金流入1500万元, 北向资金增持20万股, 进入涨停股池 ``` #### WorkBuddy的评分是参考,不是圣杯 需要强调的是,**WorkBuddy的评分只是参考,不能直接作为买卖信号**。 评分高的股票,不一定就涨;评分低的股票,也不一定就跌。WorkBuddy做的是**信息整合和快速分析**,帮助我在几秒内看到多个维度的情况,做出更理性的决策。 我的做法是: - **评分>60分**:重点关注,结合盘面判断是否买入 - **评分30-60分**:观察,不急于操作 - **评分= 2 and main_inflow > 1000: analysis['suggestion'] = '🟢 强势涨停,主力认可,可关注' elif limit_times >= 2 and main_inflow 500: analysis['suggestion'] = '🟢 早盘涨停+资金流入,可关注' else: analysis['suggestion'] = '⚪ 观察,不急于操作' return analysis # WorkBuddy分析涨停股 result = limit_up_analysis('000001') print(f"股票:{result['code']}") print(f"涨停时间:{result['limit_time']}") print(f"连板天数:{result['limit_times']}") print(f"主力流入:{result['main_inflow']:.0f}万元") print(f"龙虎榜:{'是' if result['on_lb'] else '否'}") print(f"WorkBuddy建议:{result['suggestion']}") ``` WorkBuddy会给出一个综合判断: ``` 股票:000001 涨停时间:09:45 连板天数:2 主力流入:1500万元 龙虎榜:是 WorkBuddy建议:🟢 强势涨停,主力认可,可关注 ``` #### 涨停股决策的逻辑 WorkBuddy对涨停股的决策逻辑: | 情况 | 主力资金 | WorkBuddy建议 | |-----|---------|----------| | 连板+主力流入 | >1000万 | 🟢 强势,可关注 | | 连板+主力流出 | 500万 | 🟢 强势,可关注 | | 午后涨停+主力流出 | 500万 | 🟢 机构认可,可关注 | --- ### 第五阶段:资金异动决策辅助 #### WorkBuddy可以辅助资金异动决策 看到主力资金大幅流入,要不要买?WorkBuddy可以**快速分析资金异动的真实性**: ```python def fund_anomaly_analysis(code): """WorkBuddy分析资金异动""" # WorkBuddy读取主力资金流向 main_path = DATA_DIR / 'stock-a' / '主力资金流向' with open(main_path, 'r', encoding='utf-8') as f: main_data = json.load(f) stock_main = [item for item in main_data if item['股票代码'] == code] if not stock_main: return None main_inflow = float(stock_main[0].get('主力净流入(万元)', 0)) main_ratio = float(stock_main[0].get('主力占比(%)', 0)) # WorkBuddy读取北向资金 north_path = DATA_DIR / 'stock-center' / '北向资金' with open(north_path, 'r', encoding='utf-8') as f: north_data = json.load(f) stock_north = [item for item in north_data if item['股票代码'] == code] north_buy = float(stock_north[0].get('增持股数(万股)', 0)) if stock_north else 0 # WorkBuddy读取实时行情 rt_path = DATA_DIR / 'time' / 'real' / code with open(rt_path, 'r', encoding='utf-8') as f: rt_data = json.load(f) price = float(rt_data.get('p', 0)) change_pct = float(rt_data.get('pc', 0)) volume = float(rt_data.get('v', 0)) avg_volume = float(rt_data.get('avg_volume', 1)) # WorkBuddy判断:资金流入是否真实 analysis = { 'code': code, 'main_inflow': main_inflow, 'main_ratio': main_ratio, 'north_buy': north_buy, 'change_pct': change_pct, 'volume_ratio': volume / avg_volume, 'suggestion': '' } # WorkBuddy综合判断 if main_inflow > 1000 and north_buy > 10 and change_pct > 3: analysis['suggestion'] = '🟢 主力+北向共同认可+股价上涨,可关注' elif main_inflow > 1000 and change_pct 1000 and volume / avg_volume 1000 and main_ratio > 50: analysis['suggestion'] = '🟢 主力占比高,主力认可度强' else: analysis['suggestion'] = '⚪ 观察,不急于操作' return analysis # WorkBuddy分析资金异动 result = fund_anomaly_analysis('000001') print(f"股票:{result['code']}") print(f"主力流入:{result['main_inflow']:.0f}万元") print(f"主力占比:{result['main_ratio']:.2f}%") print(f"北向增持:{result['north_buy']:.0f}万股") print(f"涨幅:{result['change_pct']:.2f}%") print(f"量能比:{result['volume_ratio']:.1f}倍") print(f"WorkBuddy建议:{result['suggestion']}") ``` WorkBuddy会给出一个综合判断: ``` 股票:000001 主力流入:1500万元 主力占比:3.5% 北向增持:20万股 涨幅:4.5% 量能比:2.3倍 WorkBuddy建议:🟢 主力+北向共同认可+股价上涨,可关注 ``` #### 资金异动决策的逻辑 WorkBuddy对资金异动的决策逻辑: | 情况 | 条件 | WorkBuddy建议 | |-----|------|----------| | 真实流入 | 主力流入+北向增持+股价上涨 | 🟢 可关注 | | 被动买入 | 主力流入+股价下跌 | 🟡 谨慎 | | 持续性存疑 | 主力流入+量能未放大 | 🟡 观察 | | 主力认可度高 | 主力流入+主力占比>50% | 🟢 可关注 | --- ### 第六阶段:龙虎榜决策辅助 #### WorkBuddy可以辅助龙虎榜决策 龙虎榜是游资和机构动向的公开披露,但龙虎榜的决策也很难——跟还是不跟?是机构买的还是游资买的? WorkBuddy可以**快速分析龙虎榜的买入方情况**: ```python def longhubang_analysis(code): """WorkBuddy分析龙虎榜""" # WorkBuddy读取龙虎榜数据 lb_path = DATA_DIR / 'stock-a' / '龙虎榜' with open(lb_path, 'r', encoding='utf-8') as f: lb_data = json.load(f) stock_lb = [item for item in lb_data if item['股票代码'] == code] if not stock_lb: return None org_buy = float(stock_lb[0].get('机构净买入(万元)', 0)) hot_buy = float(stock_lb[0].get('游资净买入(万元)', 0)) # WorkBuddy读取实时行情 rt_path = DATA_DIR / 'time' / 'real' / code with open(rt_path, 'r', encoding='utf-8') as f: rt_data = json.load(f) change_pct = float(rt_data.get('pc', 0)) # WorkBuddy判断:买入方情况 analysis = { 'code': code, 'org_buy': org_buy, 'hot_buy': hot_buy, 'change_pct': change_pct, 'suggestion': '' } # WorkBuddy综合判断 if org_buy > 1000 and hot_buy > 1000: analysis['suggestion'] = '🟢 机构+游资共同买入,强信号' elif org_buy > 1000: analysis['suggestion'] = '🟢 机构买入,中长期看好' elif hot_buy > 2000: analysis['suggestion'] = '🟡 游资大买,短期波动大' elif hot_buy > 0 and org_buy < 0: analysis['suggestion'] = '🟡 游资买+机构卖,风险较大' else: analysis['suggestion'] = '⚪ 观察,不急于操作' return analysis # WorkBuddy分析龙虎榜 result = longhubang_analysis('000001') print(f"股票:{result['code']}") print(f"机构买入:{result['org_buy']:.0f}万元") print(f"游资买入:{result['hot_buy']:.0f}万元") print(f"WorkBuddy建议:{result['suggestion']}") ``` WorkBuddy会给出一个综合判断: ``` 股票:000001 机构买入:1500万元 游资买入:800万元 WorkBuddy建议:🟢 机构+游资共同买入,强信号 ``` #### 龙虎榜决策的逻辑 WorkBuddy对龙虎榜的决策逻辑: | 情况 | 条件 | WorkBuddy建议 | |-----|------|----------| | 最强信号 | 机构+游资共同买入 | 🟢 强信号 | | 中长期看好 | 机构买入 | 🟢 可关注 | | 短期波动大 | 游资大买 | 🟡 谨慎 | | 风险较大 | 游资买+机构卖 | 🔴 风险较大 | --- ### 第七阶段:踩坑与优化 #### 教训一:WorkBuddy评分不能直接当买卖信号 WorkBuddy的评分只是参考,不能直接当买卖信号。评分高的股票,也要结合盘面、情绪、大盘环境综合判断。 #### 教训二:决策最终靠自己 WorkBuddy可以帮你快速分析,但**最终的买卖决策还是靠自己**。WorkBuddy是工具,不是圣杯。 #### 教训三:要不断优化评分逻辑 市场风格在变,评分逻辑也要调整。我每隔一段时间就会优化WorkBuddy的评分逻辑,调整权重和阈值。 --- ### 总结:从手动决策到WorkBuddy辅助 用WorkBuddy结合本地数据做决策辅助的这段时间,我的决策质量提升了一个量级: #### 之前:手动决策 - 几秒内犹豫,容易冲动 - 无法全面考虑多个维度 - 容易追高或踏空 #### 现在:WorkBuddy辅助决策 - WorkBuddy几秒内完成多维分析 - WorkBuddy给出客观评分和建议 - 决策更理性,质量更高 **从"拍脑袋决策"到"WorkBuddy辅助决策",交易质量明显提升**。 --- ### 给同路人的建议 如果你也想用WorkBuddy做决策辅助,建议从这几步开始: 1. **确定决策维度**:主力资金、北向资金、龙虎榜、涨停股? 2. **设定评分逻辑**:每个维度权重多少?阈值多少? 3. **明确决策边界**:WorkBuddy只是辅助,决策靠自己 把这些问题想清楚,再构建你的WorkBuddy辅助决策体系。决策辅助是工具,你的交易逻辑才是核心。 [gitee开源地址](https://gitee.com/igtrade/ighub) [github开源地址](https://github.com/ig50-service/ig50-official)

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册