aria-code 4.1.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. agents/__init__.py +32 -0
  2. agents/base.py +190 -0
  3. agents/deep/__init__.py +37 -0
  4. agents/deep/calibration_loop.py +144 -0
  5. agents/deep/critic.py +125 -0
  6. agents/deep/deepen.py +193 -0
  7. agents/deep/models.py +149 -0
  8. agents/deep/pipeline.py +164 -0
  9. agents/deep/quant_fusion.py +192 -0
  10. agents/deep/themes.py +95 -0
  11. agents/deep/tiers.py +106 -0
  12. agents/financial/__init__.py +10 -0
  13. agents/financial/catalyst.py +279 -0
  14. agents/financial/debate.py +145 -0
  15. agents/financial/earnings.py +303 -0
  16. agents/financial/fundamental.py +159 -0
  17. agents/financial/macro.py +99 -0
  18. agents/financial/news.py +207 -0
  19. agents/financial/risk.py +132 -0
  20. agents/financial/sector.py +279 -0
  21. agents/financial/synthesis.py +274 -0
  22. agents/financial/technical.py +258 -0
  23. agents/portfolio_agent.py +333 -0
  24. agents/realty/__init__.py +62 -0
  25. agents/realty/asset_diagnosis.py +150 -0
  26. agents/realty/business_match.py +165 -0
  27. agents/realty/cashflow_verify.py +208 -0
  28. agents/realty/contract_rules.py +209 -0
  29. agents/realty/energy_anomaly.py +188 -0
  30. agents/realty/exit_settlement.py +207 -0
  31. agents/realty/fulfillment_risk.py +205 -0
  32. agents/realty/ops_optimize.py +159 -0
  33. agents/realty/revenue_share.py +214 -0
  34. agents/registry.py +144 -0
  35. agents/sports/__init__.py +0 -0
  36. agents/sports/football_agent.py +169 -0
  37. agents/team.py +289 -0
  38. aliyun_data_client.py +660 -0
  39. apps/README.md +12 -0
  40. apps/__init__.py +2 -0
  41. apps/channels/README.md +15 -0
  42. apps/cli/README.md +13 -0
  43. apps/cli/__init__.py +2 -0
  44. apps/cli/bootstrap.py +99 -0
  45. apps/cli/codegen_paths.py +29 -0
  46. apps/cli/commands/__init__.py +16 -0
  47. apps/cli/commands/analysis_cmds.py +288 -0
  48. apps/cli/commands/backtest_cmds.py +1887 -0
  49. apps/cli/commands/broker_cmds.py +1154 -0
  50. apps/cli/commands/business_workflow_cmds.py +289 -0
  51. apps/cli/commands/catalog.py +84 -0
  52. apps/cli/commands/data_cmds.py +405 -0
  53. apps/cli/commands/diagnostic_cmds.py +179 -0
  54. apps/cli/commands/diagnostic_ops_cmds.py +696 -0
  55. apps/cli/commands/finance_render.py +12 -0
  56. apps/cli/commands/market.py +399 -0
  57. apps/cli/commands/market_cmds.py +1276 -0
  58. apps/cli/commands/market_context.py +425 -0
  59. apps/cli/commands/market_render.py +7 -0
  60. apps/cli/commands/model_cmds.py +1579 -0
  61. apps/cli/commands/ops_cmds.py +668 -0
  62. apps/cli/commands/portfolio_cmds.py +962 -0
  63. apps/cli/commands/report.py +377 -0
  64. apps/cli/commands/scaffold_templates.py +617 -0
  65. apps/cli/commands/session_cmds.py +179 -0
  66. apps/cli/commands/session_ux_cmds.py +280 -0
  67. apps/cli/commands/team.py +588 -0
  68. apps/cli/commands/team_render.py +8 -0
  69. apps/cli/commands/ui_cmds.py +358 -0
  70. apps/cli/commands/workflow_cmds.py +279 -0
  71. apps/cli/commands/workspace_cmds.py +1414 -0
  72. apps/cli/config_paths.py +70 -0
  73. apps/cli/config_store.py +61 -0
  74. apps/cli/deterministic.py +122 -0
  75. apps/cli/direct.py +48 -0
  76. apps/cli/github_app_auth.py +135 -0
  77. apps/cli/handlers/__init__.py +11 -0
  78. apps/cli/handlers/broker_handlers.py +122 -0
  79. apps/cli/handlers/chart_handlers.py +1309 -0
  80. apps/cli/handlers/market_handlers.py +2509 -0
  81. apps/cli/handlers/realty_handlers.py +114 -0
  82. apps/cli/handlers/strategy_advice.py +82 -0
  83. apps/cli/hooks.py +180 -0
  84. apps/cli/i18n.py +284 -0
  85. apps/cli/intent.py +136 -0
  86. apps/cli/intent_router.py +217 -0
  87. apps/cli/lifecycle_hooks.py +48 -0
  88. apps/cli/main.py +29 -0
  89. apps/cli/market_metadata.py +135 -0
  90. apps/cli/market_universe.py +265 -0
  91. apps/cli/message_processing.py +257 -0
  92. apps/cli/plan_mode.py +139 -0
  93. apps/cli/plotly_html.py +15 -0
  94. apps/cli/prediction_feedback.py +202 -0
  95. apps/cli/preflight.py +497 -0
  96. apps/cli/project_aria.py +60 -0
  97. apps/cli/prompts/__init__.py +0 -0
  98. apps/cli/prompts/coding.py +658 -0
  99. apps/cli/prompts/system_prompts.py +531 -0
  100. apps/cli/prompts/ui.py +434 -0
  101. apps/cli/providers/__init__.py +1 -0
  102. apps/cli/providers/base.py +271 -0
  103. apps/cli/providers/chat_routing.py +80 -0
  104. apps/cli/providers/llm/__init__.py +1 -0
  105. apps/cli/providers/llm/ollama_stream.py +1170 -0
  106. apps/cli/providers/llm/sse_stream.py +216 -0
  107. apps/cli/providers/runtime_bridge.py +185 -0
  108. apps/cli/runtime_consumer.py +489 -0
  109. apps/cli/session_export.py +87 -0
  110. apps/cli/session_jsonl.py +207 -0
  111. apps/cli/session_store.py +112 -0
  112. apps/cli/todo_tracker.py +190 -0
  113. apps/cli/tools/__init__.py +40 -0
  114. apps/cli/tools/context.py +46 -0
  115. apps/cli/tools/file_tools.py +112 -0
  116. apps/cli/tools/market_tools.py +549 -0
  117. apps/cli/tools/notebook_tools.py +111 -0
  118. apps/cli/tools/system_tools.py +669 -0
  119. apps/cli/tools/write_tools.py +715 -0
  120. apps/cli/tradingview_bridge.py +434 -0
  121. apps/cli/update_check.py +152 -0
  122. apps/cli/utils/__init__.py +0 -0
  123. apps/cli/utils/market_detect.py +1578 -0
  124. apps/daemon/README.md +14 -0
  125. apps/vscode/README.md +115 -0
  126. apps/vscode/package.json +70 -0
  127. aria_cli.py +11636 -0
  128. aria_code-4.1.3.dist-info/METADATA +952 -0
  129. aria_code-4.1.3.dist-info/RECORD +284 -0
  130. aria_code-4.1.3.dist-info/WHEEL +5 -0
  131. aria_code-4.1.3.dist-info/entry_points.txt +2 -0
  132. aria_code-4.1.3.dist-info/licenses/LICENSE +121 -0
  133. aria_code-4.1.3.dist-info/top_level.txt +50 -0
  134. aria_daemon.py +1295 -0
  135. aria_feishu_bot.py +1359 -0
  136. aria_relay_client.py +182 -0
  137. aria_relay_server.py +405 -0
  138. aria_telegram_bot.py +202 -0
  139. ariarc.py +328 -0
  140. artifacts.py +491 -0
  141. backtest_report.py +472 -0
  142. brokers/__init__.py +72 -0
  143. brokers/base.py +207 -0
  144. brokers/capabilities.py +264 -0
  145. brokers/cn/__init__.py +10 -0
  146. brokers/cn/easytrader_broker.py +193 -0
  147. brokers/cn/futu_broker.py +194 -0
  148. brokers/cn/longbridge_broker.py +190 -0
  149. brokers/cn/tiger_broker.py +196 -0
  150. brokers/cn/xtquant_broker.py +175 -0
  151. brokers/config.py +364 -0
  152. brokers/intl/__init__.py +5 -0
  153. brokers/intl/alpaca_broker.py +183 -0
  154. brokers/intl/ibkr_broker.py +215 -0
  155. brokers/intl/webull_broker.py +156 -0
  156. brokers/paper_broker.py +259 -0
  157. brokers/planning.py +296 -0
  158. brokers/registry.py +181 -0
  159. brokers/trading.py +237 -0
  160. change_store.py +127 -0
  161. command_safety.py +19 -0
  162. computer_use_tools.py +504 -0
  163. dashboard_generator.py +578 -0
  164. data_analysis_tools.py +808 -0
  165. data_cleaner.py +483 -0
  166. data_service.py +481 -0
  167. datasources/__init__.py +23 -0
  168. datasources/base.py +166 -0
  169. datasources/router.py +221 -0
  170. datasources/sources/__init__.py +15 -0
  171. datasources/sources/akshare_source.py +269 -0
  172. datasources/sources/alpha_vantage_source.py +202 -0
  173. datasources/sources/edgar_source.py +218 -0
  174. datasources/sources/finnhub_source.py +197 -0
  175. datasources/sources/fred_source.py +219 -0
  176. datasources/sources/tushare_source.py +141 -0
  177. datasources/sources/web_scraper_source.py +278 -0
  178. datasources/sources/world_bank_source.py +205 -0
  179. datasources/sources/yfinance_source.py +152 -0
  180. demo_player.py +204 -0
  181. doctor.py +508 -0
  182. file_analysis_tools.py +734 -0
  183. finance_formulas.py +389 -0
  184. football_data_client.py +1670 -0
  185. intent_classifier.py +358 -0
  186. local_finance_tools.py +3221 -0
  187. local_llm_provider.py +552 -0
  188. macro_tools.py +368 -0
  189. market_data_client.py +1899 -0
  190. mcp_client.py +506 -0
  191. memory_manager.py +245 -0
  192. model_capability.py +416 -0
  193. notification_tools.py +248 -0
  194. packages/__init__.py +23 -0
  195. packages/aria_agents/__init__.py +5 -0
  196. packages/aria_agents/manifest.py +69 -0
  197. packages/aria_core/__init__.py +34 -0
  198. packages/aria_core/architecture.py +192 -0
  199. packages/aria_core/export.py +124 -0
  200. packages/aria_core/manifest.py +65 -0
  201. packages/aria_infra/__init__.py +15 -0
  202. packages/aria_infra/arthera.py +52 -0
  203. packages/aria_infra/doctor.py +246 -0
  204. packages/aria_infra/product.py +37 -0
  205. packages/aria_mcp/__init__.py +25 -0
  206. packages/aria_mcp/bridge.py +38 -0
  207. packages/aria_mcp/config.py +97 -0
  208. packages/aria_mcp/tools.py +61 -0
  209. packages/aria_sdk/__init__.py +19 -0
  210. packages/aria_sdk/client.py +396 -0
  211. packages/aria_sdk/providers.py +70 -0
  212. packages/aria_sdk/streaming.py +73 -0
  213. packages/aria_sdk/types.py +86 -0
  214. packages/aria_services/__init__.py +55 -0
  215. packages/aria_services/context.py +258 -0
  216. packages/aria_services/data.py +11 -0
  217. packages/aria_services/provider_health.py +189 -0
  218. packages/aria_services/registry.py +213 -0
  219. packages/aria_services/usage.py +138 -0
  220. packages/aria_skills/__init__.py +5 -0
  221. packages/aria_skills/registry.py +59 -0
  222. packages/aria_tools/__init__.py +5 -0
  223. packages/aria_tools/registry.py +128 -0
  224. packages/quant_engine/__init__.py +6 -0
  225. packages/quant_engine/sports/__init__.py +72 -0
  226. packages/quant_engine/sports/calibrator.py +353 -0
  227. packages/quant_engine/sports/dixon_coles.py +234 -0
  228. packages/quant_engine/sports/elo.py +299 -0
  229. packages/quant_engine/sports/form.py +188 -0
  230. packages/quant_engine/sports/h2h.py +195 -0
  231. packages/quant_engine/sports/ml_model.py +354 -0
  232. packages/quant_engine/sports/predictor.py +311 -0
  233. packages/quant_engine/sports/tracker.py +664 -0
  234. packages/quant_engine/stochastic/__init__.py +27 -0
  235. packages/quant_engine/stochastic/gbm_enhanced.py +195 -0
  236. packages/quant_engine/stochastic/ito_calculus.py +477 -0
  237. packages/quant_engine/stochastic/kelly_criterion.py +181 -0
  238. packages/quant_engine/stochastic/monte_carlo_advanced.py +95 -0
  239. packages/quant_engine/stochastic/options_pricing.py +573 -0
  240. packages/quant_engine/stochastic/stochastic_processes.py +90 -0
  241. plan_utils.py +194 -0
  242. plugin_loader.py +328 -0
  243. portfolio_ledger.py +262 -0
  244. privacy/__init__.py +5 -0
  245. privacy/feedback.py +123 -0
  246. project_tools.py +525 -0
  247. providers/__init__.py +30 -0
  248. providers/llm/__init__.py +19 -0
  249. providers/llm/anthropic.py +184 -0
  250. providers/llm/base.py +139 -0
  251. providers/llm/ollama.py +128 -0
  252. providers/llm/openai_compat.py +282 -0
  253. providers/llm/registry.py +358 -0
  254. realty_data_tools.py +659 -0
  255. report_generator.py +1314 -0
  256. runtime/__init__.py +103 -0
  257. runtime/agent_loop.py +1183 -0
  258. runtime/approval.py +51 -0
  259. runtime/events.py +102 -0
  260. runtime/gateway.py +128 -0
  261. runtime/lsp.py +346 -0
  262. runtime/subagent.py +258 -0
  263. runtime/tool_executor.py +104 -0
  264. runtime/tool_policy.py +106 -0
  265. safety/__init__.py +21 -0
  266. safety/permissions.py +275 -0
  267. setup_wizard.py +653 -0
  268. strategy_vault.py +420 -0
  269. ui/__init__.py +100 -0
  270. ui/banner.py +310 -0
  271. ui/completer.py +391 -0
  272. ui/console.py +271 -0
  273. ui/image_render.py +243 -0
  274. ui/input_box.py +376 -0
  275. ui/picker.py +195 -0
  276. ui/render/__init__.py +11 -0
  277. ui/render/finance.py +1480 -0
  278. ui/render/market.py +225 -0
  279. ui/render/output.py +681 -0
  280. ui/render/team.py +346 -0
  281. ui/robot.py +235 -0
  282. workspace/__init__.py +6 -0
  283. workspace/files.py +170 -0
  284. workspace/verify.py +113 -0
@@ -0,0 +1,181 @@
1
+ """
2
+ Kelly Criterion Implementation
3
+ 包含:
4
+ 1. 连续时间凯利公式 (Continuous Time)
5
+ 2. 多资产矩阵形式 (Multi-Asset Matrix Form) — 含协方差收缩
6
+ 3. 带方差不确定性的 Robust 凯利 (Fractional Kelly)
7
+ 4. from_returns() — 直接从历史收益率矩阵构建 Kelly 权重 (LedoitWolf 收缩)
8
+
9
+ 修复 (v2.0):
10
+ - multi_asset_kelly: 默认启用 Tikhonov 正则化防止奇异协方差矩阵
11
+ - from_returns(): 优先使用 LedoitWolf 协方差估计,回退到样本协方差
12
+ """
13
+
14
+ import numpy as np
15
+ import pandas as pd
16
+ from typing import Dict, List, Optional, Union
17
+ from scipy.optimize import minimize
18
+
19
+ # LedoitWolf 协方差收缩(可选)
20
+ try:
21
+ from sklearn.covariance import LedoitWolf as _LedoitWolf
22
+ LEDOIT_WOLF_AVAILABLE = True
23
+ except ImportError:
24
+ LEDOIT_WOLF_AVAILABLE = False
25
+
26
+
27
+ class KellyCriterion:
28
+ """
29
+ 凯利公式服务
30
+ 目标:最大化财富对数增长率
31
+ """
32
+
33
+ @staticmethod
34
+ def continuous_time_kelly(mu: float, r: float, sigma: float) -> float:
35
+ """
36
+ 标准连续时间凯利公式:
37
+ f* = (mu - r) / sigma^2
38
+ """
39
+ if sigma <= 0:
40
+ return 0.0
41
+ return (mu - r) / (sigma ** 2)
42
+
43
+ @staticmethod
44
+ def multi_asset_kelly(
45
+ mu_vec: np.ndarray,
46
+ rf: float,
47
+ cov_matrix: np.ndarray,
48
+ allow_short: bool = False,
49
+ max_leverage: float = 1.0,
50
+ shrinkage: bool = True,
51
+ shrinkage_alpha: Optional[float] = None,
52
+ ) -> np.ndarray:
53
+ """
54
+ 多资产凯利公式 (矩阵形式):
55
+ f* = Σ^(-1) * (μ - rf)
56
+
57
+ Args:
58
+ mu_vec: 期望收益率向量 (n,)
59
+ rf: 无风险收益率
60
+ cov_matrix: 协方差矩阵 (n, n)
61
+ allow_short: 是否允许做空
62
+ max_leverage: 最大总杠杆
63
+ shrinkage: True → Tikhonov 正则化 (cov + alpha*I)
64
+ 有效防止近奇异协方差矩阵带来的极端权重
65
+ shrinkage_alpha: 正则化强度;None → 自动选为 1% of trace/n
66
+ """
67
+ n = len(mu_vec)
68
+ cov = np.array(cov_matrix, dtype=float)
69
+
70
+ if shrinkage:
71
+ if shrinkage_alpha is None:
72
+ # 自动正则化强度:trace 的 1 %
73
+ shrinkage_alpha = max(np.trace(cov) / n * 0.01, 1e-6)
74
+ cov = cov + shrinkage_alpha * np.eye(n)
75
+
76
+ try:
77
+ excess_ret = np.array(mu_vec, dtype=float) - rf
78
+ cov_inv = np.linalg.inv(cov)
79
+ kelly_f = cov_inv @ excess_ret
80
+
81
+ # 约束
82
+ if not allow_short:
83
+ kelly_f = np.maximum(kelly_f, 0.0)
84
+
85
+ total_leverage = float(np.sum(kelly_f))
86
+ if total_leverage > max_leverage:
87
+ kelly_f = kelly_f * (max_leverage / total_leverage)
88
+
89
+ return kelly_f
90
+
91
+ except np.linalg.LinAlgError:
92
+ # 即使加了正则化还是奇异 → 退化为等权
93
+ return np.ones(n) / n
94
+
95
+ @classmethod
96
+ def from_returns(
97
+ cls,
98
+ returns_df: pd.DataFrame,
99
+ rf: float = 0.02,
100
+ allow_short: bool = False,
101
+ max_leverage: float = 1.0,
102
+ fraction: float = 1.0,
103
+ use_ledoit_wolf: bool = True,
104
+ ) -> Dict[str, float]:
105
+ """
106
+ 直接从历史日收益率矩阵计算 Kelly 权重。
107
+
108
+ 协方差估计优先级:
109
+ 1. LedoitWolf 收缩估计(sklearn,若可用)
110
+ 2. 样本协方差(兜底)
111
+
112
+ Args:
113
+ returns_df: 每列为一个资产的日收益率 DataFrame
114
+ rf: 年化无风险收益率(自动转为日化)
115
+ allow_short: 是否允许做空
116
+ max_leverage: 最大杠杆
117
+ fraction: 分段凯利系数(0 < f ≤ 1.0)
118
+ use_ledoit_wolf: 是否优先使用 LedoitWolf 收缩
119
+
120
+ Returns:
121
+ {symbol: weight} 字典
122
+ """
123
+ symbols = list(returns_df.columns)
124
+ R = returns_df.dropna().values # (T, n)
125
+ dt = 1.0 / 252
126
+
127
+ mu_daily = R.mean(axis=0)
128
+ mu_ann = mu_daily / dt # 日化 → 年化
129
+ rf_daily = rf * dt
130
+
131
+ # -- 协方差矩阵 --
132
+ if use_ledoit_wolf and LEDOIT_WOLF_AVAILABLE:
133
+ lw = _LedoitWolf().fit(R)
134
+ cov_daily = lw.covariance_ # (n, n)
135
+ else:
136
+ cov_daily = np.cov(R, rowvar=False) # 样本协方差
137
+
138
+ cov_ann = cov_daily / dt # 日化协方差 → 年化
139
+
140
+ weights = cls.multi_asset_kelly(
141
+ mu_vec = mu_ann,
142
+ rf = rf,
143
+ cov_matrix = cov_ann,
144
+ allow_short = allow_short,
145
+ max_leverage= max_leverage,
146
+ shrinkage = True, # always apply Tikhonov on top
147
+ )
148
+
149
+ # 应用分段凯利
150
+ weights = weights * fraction
151
+
152
+ return dict(zip(symbols, weights.tolist()))
153
+
154
+ @staticmethod
155
+ def robust_log_kelly(
156
+ returns_df: pd.DataFrame,
157
+ rf: float = 0.02,
158
+ fraction: float = 0.5,
159
+ ) -> Dict[str, float]:
160
+ """
161
+ 基于历史分布的非参数对数凯利 (含分段凯利/Fractional Kelly)
162
+ """
163
+ symbols = returns_df.columns
164
+ n = len(symbols)
165
+ hist_returns = returns_df.values
166
+ dt = 1 / 252
167
+
168
+ def obj(w: np.ndarray) -> float:
169
+ port_rets = np.dot(hist_returns, w)
170
+ growth = 1.0 + port_rets + (1.0 - np.sum(w)) * (rf * dt)
171
+ if np.any(growth <= 0):
172
+ return 1e10
173
+ return -float(np.mean(np.log(growth)))
174
+
175
+ cons = [{"type": "ineq", "fun": lambda x: 1.0 - np.sum(x)}]
176
+ bounds = [(0, 1) for _ in range(n)]
177
+ res = minimize(obj, np.ones(n) / n, bounds=bounds, constraints=cons)
178
+
179
+ # 应用分段凯利 (Robust 修正)
180
+ final_weights = res.x * fraction
181
+ return dict(zip(symbols, final_weights.tolist()))
@@ -0,0 +1,95 @@
1
+ """
2
+ Advanced Monte Carlo Engine with Variance Reduction Techniques
3
+ 包含对偶变量、控制变量、拟蒙特卡罗、重要性采样
4
+ """
5
+
6
+ import numpy as np
7
+ import scipy.stats as stats
8
+ from typing import Optional, Callable, Tuple, List, Dict
9
+ from enum import Enum
10
+
11
+ class VarianceReduction(Enum):
12
+ NONE = "none"
13
+ ANTITHETIC = "antithetic"
14
+ CONTROL_VARIATE = "control_variate"
15
+ QUASI_MONTE_CARLO = "quasi_mc"
16
+ IMPORTANCE_SAMPLING = "importance_sampling"
17
+
18
+ class MonteCarloEngine:
19
+ """
20
+ 高级蒙特卡罗模拟引擎
21
+ 支持:
22
+ 1. 路径模拟 (Path Simulation)
23
+ 2. 衍生品定价 (Derivative Pricing)
24
+ 3. 风险度量 (Risk Metrics: VaR, CVaR)
25
+ """
26
+
27
+ @staticmethod
28
+ def simulate_gbm(
29
+ s0: float, mu: float, sigma: float, T: float,
30
+ n_steps: int, n_paths: int,
31
+ method: VarianceReduction = VarianceReduction.NONE
32
+ ) -> np.ndarray:
33
+ """
34
+ GBM 路径模拟 - 带方差缩减选项
35
+ """
36
+ dt = T / n_steps
37
+
38
+ if method == VarianceReduction.ANTITHETIC:
39
+ half_paths = n_paths // 2
40
+ dW = np.random.normal(0, np.sqrt(dt), (half_paths, n_steps))
41
+ dW_full = np.concatenate([dW, -dW], axis=0)
42
+ elif method == VarianceReduction.QUASI_MONTE_CARLO:
43
+ # 使用 Sobol 序列 (拟蒙特卡罗)
44
+ from scipy.stats import qmc
45
+ sampler = qmc.Sobol(d=n_steps, scramble=True)
46
+ u = sampler.random(n=n_paths)
47
+ z = stats.norm.ppf(u)
48
+ dW_full = z * np.sqrt(dt)
49
+ else:
50
+ dW_full = np.random.normal(0, np.sqrt(dt), (n_paths, n_steps))
51
+
52
+ # 路径累加
53
+ log_returns = (mu - 0.5 * sigma**2) * dt + sigma * dW_full
54
+ cumulative_log_returns = np.cumsum(log_returns, axis=1)
55
+ # 加入起始点
56
+ paths = s0 * np.exp(np.hstack([np.zeros((n_paths, 1)), cumulative_log_returns]))
57
+
58
+ return paths
59
+
60
+ @staticmethod
61
+ def price_european_option(
62
+ s0: float, K: float, T: float, r: float, sigma: float,
63
+ option_type: str = "call", n_paths: int = 100000,
64
+ reduction: VarianceReduction = VarianceReduction.ANTITHETIC
65
+ ) -> Dict[str, float]:
66
+ """
67
+ 蒙特卡罗定价欧式期权
68
+ """
69
+ # 使用 1 步模拟即可(对欧式期权,中间路径不影响结果)
70
+ if reduction == VarianceReduction.ANTITHETIC:
71
+ z = np.random.normal(0, 1, n_paths // 2)
72
+ z_full = np.concatenate([z, -z])
73
+ else:
74
+ z_full = np.random.normal(0, 1, n_paths)
75
+
76
+ st = s0 * np.exp((r - 0.5 * sigma**2) * T + sigma * np.sqrt(T) * z_full)
77
+
78
+ if option_type == "call":
79
+ payoff = np.maximum(st - K, 0)
80
+ else:
81
+ payoff = np.maximum(K - st, 0)
82
+
83
+ price = np.exp(-r * T) * np.mean(payoff)
84
+ std_err = np.exp(-r * T) * np.std(payoff) / np.sqrt(n_paths)
85
+
86
+ return {"price": float(price), "standard_error": float(std_err)}
87
+
88
+ @staticmethod
89
+ def calculate_var_cvar(returns: np.ndarray, confidence: float = 0.95) -> Tuple[float, float]:
90
+ """
91
+ 计算历史/模拟收益率的 VaR 和 CVaR
92
+ """
93
+ var = np.percentile(returns, (1 - confidence) * 100)
94
+ cvar = returns[returns <= var].mean()
95
+ return float(var), float(cvar)