fusion.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. """
  2. 生态融合器
  3. 整合四层生态识别结果(宏观/中观/微观/瞬时)为统一的市场生态对象
  4. """
  5. from dataclasses import dataclass, field
  6. from datetime import datetime
  7. from typing import Dict, List, Optional, Any
  8. from enum import Enum
  9. import pandas as pd
  10. from .macro import MacroEcosystem, MacroRegime, MacroEcosystemIdentifier
  11. from .meso import MesoEcosystem, HealthLevel, MesoEcosystemIdentifier
  12. from .micro import MicroEcosystem, MicroState, MicroEcosystemIdentifier
  13. from .instant import InstantEcosystem, InstantEcosystemIdentifier
  14. @dataclass
  15. class UnifiedEcosystem:
  16. """
  17. 统一市场生态对象
  18. 融合四层生态识别结果,提供完整的市场状态描述
  19. """
  20. timestamp: datetime
  21. # 各层生态 (必须参数在前)
  22. macro: MacroEcosystem
  23. meso: MesoEcosystem
  24. micro: MicroEcosystem
  25. # 融合结果
  26. overall_regime: str # 综合生态类型
  27. confidence: float # 整体置信度 (0-1)
  28. trading_bias: str # 交易倾向 "long" / "short" / "neutral"
  29. risk_level: str # 风险等级 "low" / "medium" / "high"
  30. # 建议参数
  31. suggested_position: float # 建议仓位 (0-1)
  32. suggested_agents: List[str] # 建议激活的智能体
  33. # 可选参数 (带默认值的在后)
  34. instant: Optional[InstantEcosystem] = None
  35. warnings: List[str] = field(default_factory=list)
  36. def to_dict(self) -> Dict[str, Any]:
  37. """转换为字典格式"""
  38. return {
  39. "timestamp": self.timestamp.isoformat(),
  40. "overall_regime": self.overall_regime,
  41. "confidence": self.confidence,
  42. "trading_bias": self.trading_bias,
  43. "risk_level": self.risk_level,
  44. "suggested_position": self.suggested_position,
  45. "suggested_agents": self.suggested_agents,
  46. "warnings": self.warnings,
  47. "macro": {
  48. "regime": self.macro.regime.value,
  49. "confidence": self.macro.confidence,
  50. "description": self.macro.description
  51. },
  52. "meso": {
  53. "health_score": self.meso.health_score,
  54. "health_level": self.meso.health_level.value
  55. },
  56. "micro": {
  57. "state": self.micro.state.value,
  58. "toxicity": self.micro.flow_toxicity.value,
  59. "smart_money": self.micro.smart_money.direction if self.micro.smart_money.detected else None
  60. },
  61. "instant": {
  62. "imbalance": self.instant.imbalance_direction.value if self.instant else None,
  63. "block_flow": self.instant.block_trade_flow if self.instant else 0
  64. } if self.instant else None
  65. }
  66. class EcosystemFusion:
  67. """
  68. 生态融合器
  69. 整合四层生态识别结果,生成统一的交易决策建议
  70. """
  71. def __init__(
  72. self,
  73. macro_identifier: Optional[MacroEcosystemIdentifier] = None,
  74. meso_identifier: Optional[MesoEcosystemIdentifier] = None,
  75. micro_identifier: Optional[MicroEcosystemIdentifier] = None,
  76. instant_identifier: Optional[InstantEcosystemIdentifier] = None
  77. ):
  78. self.macro_id = macro_identifier or MacroEcosystemIdentifier()
  79. self.meso_id = meso_identifier or MesoEcosystemIdentifier()
  80. self.micro_id = micro_identifier or MicroEcosystemIdentifier()
  81. self.instant_id = instant_identifier or InstantEcosystemIdentifier()
  82. def fuse(
  83. self,
  84. price_data: pd.DataFrame,
  85. sector_data: Optional[pd.DataFrame] = None,
  86. tick_data: Optional[pd.DataFrame] = None,
  87. order_book_data: Optional[pd.DataFrame] = None,
  88. trade_data: Optional[pd.DataFrame] = None
  89. ) -> UnifiedEcosystem:
  90. """
  91. 融合四层生态识别结果
  92. Args:
  93. price_data: 日线/30分钟价格数据
  94. sector_data: 板块数据(可选)
  95. tick_data: 分钟级tick数据(可选)
  96. order_book_data: 订单簿数据(可选)
  97. trade_data: 成交数据(可选)
  98. Returns:
  99. UnifiedEcosystem: 统一生态对象
  100. """
  101. timestamp = pd.Timestamp.now()
  102. # 1. 宏观生态识别(日度更新)
  103. macro = self.macro_id.identify(price_data, sector_data)
  104. # 2. 中观生态识别(日度更新)
  105. meso = self.meso_id.identify(price_data, order_book_data, trade_data)
  106. # 3. 微观生态识别(30分钟更新)
  107. # 训练HMM(如果未训练)
  108. if not self.micro_id._is_fitted:
  109. self.micro_id.fit(price_data)
  110. micro = self.micro_id.identify(price_data, trade_data, order_book_data)
  111. # 4. 瞬时生态识别(分钟级,可选)
  112. instant = None
  113. if tick_data is not None and not tick_data.empty:
  114. instant = self.instant_id.identify(
  115. tick_data, order_book_data, timestamp
  116. )
  117. # 5. 融合决策
  118. overall_regime = self._determine_overall_regime(macro, meso, micro)
  119. confidence = self._calculate_confidence(macro, meso, micro)
  120. trading_bias = self._determine_trading_bias(macro, micro, instant)
  121. risk_level = self._determine_risk_level(meso, micro, instant)
  122. suggested_position = self._calculate_position(
  123. macro, meso, micro, risk_level
  124. )
  125. suggested_agents = self._recommend_agents(macro, micro)
  126. warnings = self._generate_warnings(macro, meso, micro, instant)
  127. return UnifiedEcosystem(
  128. timestamp=timestamp,
  129. macro=macro,
  130. meso=meso,
  131. micro=micro,
  132. overall_regime=overall_regime,
  133. confidence=confidence,
  134. trading_bias=trading_bias,
  135. risk_level=risk_level,
  136. suggested_position=suggested_position,
  137. suggested_agents=suggested_agents,
  138. instant=instant,
  139. warnings=warnings
  140. )
  141. def _determine_overall_regime(
  142. self,
  143. macro: MacroEcosystem,
  144. meso: MesoEcosystem,
  145. micro: MicroEcosystem
  146. ) -> str:
  147. """确定综合生态类型"""
  148. # 主要基于宏观生态
  149. base_regime = macro.regime.value
  150. # 中观结构健康度修正
  151. if meso.health_level == HealthLevel.LOW:
  152. base_regime += "_fragile"
  153. # 微观状态修正
  154. if micro.state == MicroState.REVERSING:
  155. base_regime += "_reversing"
  156. elif micro.state == MicroState.TRENDING:
  157. base_regime += "_trending"
  158. return base_regime
  159. def _calculate_confidence(
  160. self,
  161. macro: MacroEcosystem,
  162. meso: MesoEcosystem,
  163. micro: MicroEcosystem
  164. ) -> float:
  165. """计算整体置信度"""
  166. # 加权平均各层置信度
  167. macro_conf = macro.confidence
  168. meso_conf = meso.health_score / 100
  169. micro_conf = max(micro.state_probability.values())
  170. confidence = (
  171. macro_conf * 0.4 +
  172. meso_conf * 0.3 +
  173. micro_conf * 0.3
  174. )
  175. return min(1.0, max(0.0, confidence))
  176. def _determine_trading_bias(
  177. self,
  178. macro: MacroEcosystem,
  179. micro: MicroEcosystem,
  180. instant: Optional[InstantEcosystem]
  181. ) -> str:
  182. """确定交易倾向"""
  183. # 基于宏观生态
  184. if macro.regime in [MacroRegime.SPRING, MacroRegime.SUMMER]:
  185. bias = "long"
  186. elif macro.regime == MacroRegime.WINTER:
  187. bias = "short"
  188. else:
  189. bias = "neutral"
  190. # 微观状态修正
  191. if micro.state == MicroState.REVERSING:
  192. # 反转状态,反向操作或观望
  193. bias = "neutral"
  194. # 瞬时信号修正
  195. if instant is not None:
  196. if instant.imbalance_direction.value == "bid_dominant":
  197. bias = "long"
  198. elif instant.imbalance_direction.value == "ask_dominant":
  199. bias = "short"
  200. # 有毒订单流过滤
  201. if micro.flow_toxicity.value in ["high", "medium"]:
  202. bias = "neutral"
  203. return bias
  204. def _determine_risk_level(
  205. self,
  206. meso: MesoEcosystem,
  207. micro: MicroEcosystem,
  208. instant: Optional[InstantEcosystem]
  209. ) -> str:
  210. """确定风险等级"""
  211. risk_score = 0
  212. # 中观结构健康度
  213. if meso.health_level == HealthLevel.LOW:
  214. risk_score += 3
  215. elif meso.health_level == HealthLevel.MEDIUM:
  216. risk_score += 1
  217. # 微观有毒订单流
  218. if micro.flow_toxicity.value == "high":
  219. risk_score += 2
  220. elif micro.flow_toxicity.value == "medium":
  221. risk_score += 1
  222. # 微观状态
  223. if micro.state == MicroState.REVERSING:
  224. risk_score += 1
  225. # 瞬时跳动率
  226. if instant is not None:
  227. if instant.tick_activity.value == "spike":
  228. risk_score += 1
  229. if risk_score >= 4:
  230. return "high"
  231. elif risk_score >= 2:
  232. return "medium"
  233. else:
  234. return "low"
  235. def _calculate_position(
  236. self,
  237. macro: MacroEcosystem,
  238. meso: MesoEcosystem,
  239. micro: MicroEcosystem,
  240. risk_level: str
  241. ) -> float:
  242. """计算建议仓位"""
  243. # 基础仓位(基于宏观生态)
  244. base_position = {
  245. MacroRegime.SPRING: 0.6,
  246. MacroRegime.SUMMER: 1.0,
  247. MacroRegime.AUTUMN: 0.4,
  248. MacroRegime.WINTER: 0.2,
  249. MacroRegime.UNKNOWN: 0.0
  250. }.get(macro.regime, 0.0)
  251. # 中观修正
  252. health_factor = meso.health_score / 100
  253. # 微观修正
  254. if micro.flow_toxicity.value == "high":
  255. micro_factor = 0.3
  256. elif micro.flow_toxicity.value == "medium":
  257. micro_factor = 0.6
  258. else:
  259. micro_factor = 1.0
  260. # 风险修正
  261. risk_factor = {
  262. "low": 1.0,
  263. "medium": 0.7,
  264. "high": 0.4
  265. }.get(risk_level, 0.5)
  266. suggested = base_position * health_factor * micro_factor * risk_factor
  267. return min(1.0, max(0.0, suggested))
  268. def _recommend_agents(
  269. self,
  270. macro: MacroEcosystem,
  271. micro: MicroEcosystem
  272. ) -> List[str]:
  273. """推荐激活的智能体"""
  274. agents = []
  275. # 基于宏观生态推荐
  276. regime_agents = {
  277. MacroRegime.SPRING: ["trend_hunter", "mean_reversion"],
  278. MacroRegime.SUMMER: ["trend_hunter", "momentum_surfer"],
  279. MacroRegime.AUTUMN: ["structure_arbitrage", "momentum_surfer"],
  280. MacroRegime.WINTER: ["mean_reversion", "volatility_seller"],
  281. MacroRegime.UNKNOWN: []
  282. }
  283. agents.extend(regime_agents.get(macro.regime, []))
  284. # 微观状态调整
  285. if micro.state == MicroState.TRENDING:
  286. if "trend_hunter" not in agents:
  287. agents.append("trend_hunter")
  288. elif micro.state == MicroState.RANGING:
  289. if "mean_reversion" not in agents:
  290. agents.append("mean_reversion")
  291. # 主力资金信号
  292. if micro.smart_money.detected:
  293. if micro.smart_money.direction == "accumulate":
  294. if "trend_hunter" not in agents:
  295. agents.append("trend_hunter")
  296. elif micro.smart_money.direction == "distribute":
  297. if "mean_reversion" not in agents:
  298. agents.append("mean_reversion")
  299. return agents
  300. def _generate_warnings(
  301. self,
  302. macro: MacroEcosystem,
  303. meso: MesoEcosystem,
  304. micro: MicroEcosystem,
  305. instant: Optional[InstantEcosystem]
  306. ) -> List[str]:
  307. """生成警告信息"""
  308. warnings = []
  309. # 宏观警告
  310. if macro.regime == MacroRegime.UNKNOWN:
  311. warnings.append("宏观生态不明,建议观望")
  312. # 中观警告
  313. if meso.health_level == HealthLevel.LOW:
  314. warnings.append(f"市场结构健康度低 ({meso.health_score:.1f}),流动性风险")
  315. # 微观警告
  316. warnings.extend(micro.warnings)
  317. # 瞬时警告
  318. if instant is not None:
  319. if instant.tick_activity.value == "spike":
  320. warnings.append("跳动率突变,市场活跃度异常")
  321. if abs(instant.block_trade_flow) > 2000: # 2000万
  322. direction = "流入" if instant.block_trade_flow > 0 else "流出"
  323. warnings.append(f"大单巨额{direction}: {abs(instant.block_trade_flow):.0f}万元")
  324. return warnings