@insiderfinance/totalfinance 0.1.0

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 (2495) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +339 -0
  3. package/STABILITY.md +23 -0
  4. package/modules/backtest/dist/artifacts.d.ts +23 -0
  5. package/modules/backtest/dist/artifacts.d.ts.map +1 -0
  6. package/modules/backtest/dist/artifacts.js +22 -0
  7. package/modules/backtest/dist/artifacts.js.map +1 -0
  8. package/modules/backtest/dist/broker.d.ts +265 -0
  9. package/modules/backtest/dist/broker.d.ts.map +1 -0
  10. package/modules/backtest/dist/broker.js +1228 -0
  11. package/modules/backtest/dist/broker.js.map +1 -0
  12. package/modules/backtest/dist/costs.d.ts +67 -0
  13. package/modules/backtest/dist/costs.d.ts.map +1 -0
  14. package/modules/backtest/dist/costs.js +171 -0
  15. package/modules/backtest/dist/costs.js.map +1 -0
  16. package/modules/backtest/dist/cross-sectional/engine.d.ts +21 -0
  17. package/modules/backtest/dist/cross-sectional/engine.d.ts.map +1 -0
  18. package/modules/backtest/dist/cross-sectional/engine.js +1399 -0
  19. package/modules/backtest/dist/cross-sectional/engine.js.map +1 -0
  20. package/modules/backtest/dist/cross-sectional/folds.d.ts +134 -0
  21. package/modules/backtest/dist/cross-sectional/folds.d.ts.map +1 -0
  22. package/modules/backtest/dist/cross-sectional/folds.js +375 -0
  23. package/modules/backtest/dist/cross-sectional/folds.js.map +1 -0
  24. package/modules/backtest/dist/cross-sectional/grid.d.ts +142 -0
  25. package/modules/backtest/dist/cross-sectional/grid.d.ts.map +1 -0
  26. package/modules/backtest/dist/cross-sectional/grid.js +394 -0
  27. package/modules/backtest/dist/cross-sectional/grid.js.map +1 -0
  28. package/modules/backtest/dist/cross-sectional/index.d.ts +18 -0
  29. package/modules/backtest/dist/cross-sectional/index.d.ts.map +1 -0
  30. package/modules/backtest/dist/cross-sectional/index.js +15 -0
  31. package/modules/backtest/dist/cross-sectional/index.js.map +1 -0
  32. package/modules/backtest/dist/cross-sectional/types.d.ts +331 -0
  33. package/modules/backtest/dist/cross-sectional/types.d.ts.map +1 -0
  34. package/modules/backtest/dist/cross-sectional/types.js +12 -0
  35. package/modules/backtest/dist/cross-sectional/types.js.map +1 -0
  36. package/modules/backtest/dist/cross-sectional/validate.d.ts +22 -0
  37. package/modules/backtest/dist/cross-sectional/validate.d.ts.map +1 -0
  38. package/modules/backtest/dist/cross-sectional/validate.js +489 -0
  39. package/modules/backtest/dist/cross-sectional/validate.js.map +1 -0
  40. package/modules/backtest/dist/diagnostics.d.ts +16 -0
  41. package/modules/backtest/dist/diagnostics.d.ts.map +1 -0
  42. package/modules/backtest/dist/diagnostics.js +63 -0
  43. package/modules/backtest/dist/diagnostics.js.map +1 -0
  44. package/modules/backtest/dist/environment/bench.d.ts +34 -0
  45. package/modules/backtest/dist/environment/bench.d.ts.map +1 -0
  46. package/modules/backtest/dist/environment/bench.js +724 -0
  47. package/modules/backtest/dist/environment/bench.js.map +1 -0
  48. package/modules/backtest/dist/environment/environment.d.ts +5 -0
  49. package/modules/backtest/dist/environment/environment.d.ts.map +1 -0
  50. package/modules/backtest/dist/environment/environment.js +618 -0
  51. package/modules/backtest/dist/environment/environment.js.map +1 -0
  52. package/modules/backtest/dist/environment/episode.d.ts +4 -0
  53. package/modules/backtest/dist/environment/episode.d.ts.map +1 -0
  54. package/modules/backtest/dist/environment/episode.js +121 -0
  55. package/modules/backtest/dist/environment/episode.js.map +1 -0
  56. package/modules/backtest/dist/environment/episodes.d.ts +14 -0
  57. package/modules/backtest/dist/environment/episodes.d.ts.map +1 -0
  58. package/modules/backtest/dist/environment/episodes.js +644 -0
  59. package/modules/backtest/dist/environment/episodes.js.map +1 -0
  60. package/modules/backtest/dist/environment/features.d.ts +31 -0
  61. package/modules/backtest/dist/environment/features.d.ts.map +1 -0
  62. package/modules/backtest/dist/environment/features.js +157 -0
  63. package/modules/backtest/dist/environment/features.js.map +1 -0
  64. package/modules/backtest/dist/environment/index.d.ts +14 -0
  65. package/modules/backtest/dist/environment/index.d.ts.map +1 -0
  66. package/modules/backtest/dist/environment/index.js +12 -0
  67. package/modules/backtest/dist/environment/index.js.map +1 -0
  68. package/modules/backtest/dist/environment/limits.d.ts +63 -0
  69. package/modules/backtest/dist/environment/limits.d.ts.map +1 -0
  70. package/modules/backtest/dist/environment/limits.js +253 -0
  71. package/modules/backtest/dist/environment/limits.js.map +1 -0
  72. package/modules/backtest/dist/environment/reward.d.ts +5 -0
  73. package/modules/backtest/dist/environment/reward.d.ts.map +1 -0
  74. package/modules/backtest/dist/environment/reward.js +80 -0
  75. package/modules/backtest/dist/environment/reward.js.map +1 -0
  76. package/modules/backtest/dist/environment/types.d.ts +540 -0
  77. package/modules/backtest/dist/environment/types.d.ts.map +1 -0
  78. package/modules/backtest/dist/environment/types.js +2 -0
  79. package/modules/backtest/dist/environment/types.js.map +1 -0
  80. package/modules/backtest/dist/environment/validate.d.ts +23 -0
  81. package/modules/backtest/dist/environment/validate.d.ts.map +1 -0
  82. package/modules/backtest/dist/environment/validate.js +264 -0
  83. package/modules/backtest/dist/environment/validate.js.map +1 -0
  84. package/modules/backtest/dist/event-driven.d.ts +111 -0
  85. package/modules/backtest/dist/event-driven.d.ts.map +1 -0
  86. package/modules/backtest/dist/event-driven.js +325 -0
  87. package/modules/backtest/dist/event-driven.js.map +1 -0
  88. package/modules/backtest/dist/execution/conformance.d.ts +33 -0
  89. package/modules/backtest/dist/execution/conformance.d.ts.map +1 -0
  90. package/modules/backtest/dist/execution/conformance.js +269 -0
  91. package/modules/backtest/dist/execution/conformance.js.map +1 -0
  92. package/modules/backtest/dist/execution/fill-models.d.ts +35 -0
  93. package/modules/backtest/dist/execution/fill-models.d.ts.map +1 -0
  94. package/modules/backtest/dist/execution/fill-models.js +375 -0
  95. package/modules/backtest/dist/execution/fill-models.js.map +1 -0
  96. package/modules/backtest/dist/execution/fill-order.d.ts +55 -0
  97. package/modules/backtest/dist/execution/fill-order.d.ts.map +1 -0
  98. package/modules/backtest/dist/execution/fill-order.js +156 -0
  99. package/modules/backtest/dist/execution/fill-order.js.map +1 -0
  100. package/modules/backtest/dist/execution/index.d.ts +33 -0
  101. package/modules/backtest/dist/execution/index.d.ts.map +1 -0
  102. package/modules/backtest/dist/execution/index.js +27 -0
  103. package/modules/backtest/dist/execution/index.js.map +1 -0
  104. package/modules/backtest/dist/execution/intrabar.d.ts +46 -0
  105. package/modules/backtest/dist/execution/intrabar.d.ts.map +1 -0
  106. package/modules/backtest/dist/execution/intrabar.js +130 -0
  107. package/modules/backtest/dist/execution/intrabar.js.map +1 -0
  108. package/modules/backtest/dist/execution/normalized.d.ts +56 -0
  109. package/modules/backtest/dist/execution/normalized.d.ts.map +1 -0
  110. package/modules/backtest/dist/execution/normalized.js +154 -0
  111. package/modules/backtest/dist/execution/normalized.js.map +1 -0
  112. package/modules/backtest/dist/execution/policy.d.ts +84 -0
  113. package/modules/backtest/dist/execution/policy.d.ts.map +1 -0
  114. package/modules/backtest/dist/execution/policy.js +341 -0
  115. package/modules/backtest/dist/execution/policy.js.map +1 -0
  116. package/modules/backtest/dist/execution/types.d.ts +217 -0
  117. package/modules/backtest/dist/execution/types.d.ts.map +1 -0
  118. package/modules/backtest/dist/execution/types.js +8 -0
  119. package/modules/backtest/dist/execution/types.js.map +1 -0
  120. package/modules/backtest/dist/execution/validate.d.ts +35 -0
  121. package/modules/backtest/dist/execution/validate.d.ts.map +1 -0
  122. package/modules/backtest/dist/execution/validate.js +666 -0
  123. package/modules/backtest/dist/execution/validate.js.map +1 -0
  124. package/modules/backtest/dist/generated/validation-specs.d.ts +12 -0
  125. package/modules/backtest/dist/generated/validation-specs.d.ts.map +1 -0
  126. package/modules/backtest/dist/generated/validation-specs.js +1129 -0
  127. package/modules/backtest/dist/generated/validation-specs.js.map +1 -0
  128. package/modules/backtest/dist/index.d.ts +33 -0
  129. package/modules/backtest/dist/index.d.ts.map +1 -0
  130. package/modules/backtest/dist/index.js +28 -0
  131. package/modules/backtest/dist/index.js.map +1 -0
  132. package/modules/backtest/dist/options/chain.d.ts +68 -0
  133. package/modules/backtest/dist/options/chain.d.ts.map +1 -0
  134. package/modules/backtest/dist/options/chain.js +303 -0
  135. package/modules/backtest/dist/options/chain.js.map +1 -0
  136. package/modules/backtest/dist/options/engine.d.ts +28 -0
  137. package/modules/backtest/dist/options/engine.d.ts.map +1 -0
  138. package/modules/backtest/dist/options/engine.js +1859 -0
  139. package/modules/backtest/dist/options/engine.js.map +1 -0
  140. package/modules/backtest/dist/options/index.d.ts +23 -0
  141. package/modules/backtest/dist/options/index.d.ts.map +1 -0
  142. package/modules/backtest/dist/options/index.js +21 -0
  143. package/modules/backtest/dist/options/index.js.map +1 -0
  144. package/modules/backtest/dist/options/tearsheet.d.ts +77 -0
  145. package/modules/backtest/dist/options/tearsheet.d.ts.map +1 -0
  146. package/modules/backtest/dist/options/tearsheet.js +205 -0
  147. package/modules/backtest/dist/options/tearsheet.js.map +1 -0
  148. package/modules/backtest/dist/options/types.d.ts +571 -0
  149. package/modules/backtest/dist/options/types.d.ts.map +1 -0
  150. package/modules/backtest/dist/options/types.js +19 -0
  151. package/modules/backtest/dist/options/types.js.map +1 -0
  152. package/modules/backtest/dist/paper/index.d.ts +13 -0
  153. package/modules/backtest/dist/paper/index.d.ts.map +1 -0
  154. package/modules/backtest/dist/paper/index.js +12 -0
  155. package/modules/backtest/dist/paper/index.js.map +1 -0
  156. package/modules/backtest/dist/paper/paper.d.ts +8 -0
  157. package/modules/backtest/dist/paper/paper.d.ts.map +1 -0
  158. package/modules/backtest/dist/paper/paper.js +950 -0
  159. package/modules/backtest/dist/paper/paper.js.map +1 -0
  160. package/modules/backtest/dist/paper/types.d.ts +190 -0
  161. package/modules/backtest/dist/paper/types.d.ts.map +1 -0
  162. package/modules/backtest/dist/paper/types.js +3 -0
  163. package/modules/backtest/dist/paper/types.js.map +1 -0
  164. package/modules/backtest/dist/paper/validate.d.ts +9 -0
  165. package/modules/backtest/dist/paper/validate.d.ts.map +1 -0
  166. package/modules/backtest/dist/paper/validate.js +112 -0
  167. package/modules/backtest/dist/paper/validate.js.map +1 -0
  168. package/modules/backtest/dist/portfolio/adapters.d.ts +37 -0
  169. package/modules/backtest/dist/portfolio/adapters.d.ts.map +1 -0
  170. package/modules/backtest/dist/portfolio/adapters.js +555 -0
  171. package/modules/backtest/dist/portfolio/adapters.js.map +1 -0
  172. package/modules/backtest/dist/portfolio/engine.d.ts +35 -0
  173. package/modules/backtest/dist/portfolio/engine.d.ts.map +1 -0
  174. package/modules/backtest/dist/portfolio/engine.js +1300 -0
  175. package/modules/backtest/dist/portfolio/engine.js.map +1 -0
  176. package/modules/backtest/dist/portfolio/index.d.ts +12 -0
  177. package/modules/backtest/dist/portfolio/index.d.ts.map +1 -0
  178. package/modules/backtest/dist/portfolio/index.js +11 -0
  179. package/modules/backtest/dist/portfolio/index.js.map +1 -0
  180. package/modules/backtest/dist/portfolio/types.d.ts +418 -0
  181. package/modules/backtest/dist/portfolio/types.d.ts.map +1 -0
  182. package/modules/backtest/dist/portfolio/types.js +8 -0
  183. package/modules/backtest/dist/portfolio/types.js.map +1 -0
  184. package/modules/backtest/dist/portfolio/validate.d.ts +26 -0
  185. package/modules/backtest/dist/portfolio/validate.d.ts.map +1 -0
  186. package/modules/backtest/dist/portfolio/validate.js +556 -0
  187. package/modules/backtest/dist/portfolio/validate.js.map +1 -0
  188. package/modules/backtest/dist/run-artifacts.d.ts +425 -0
  189. package/modules/backtest/dist/run-artifacts.d.ts.map +1 -0
  190. package/modules/backtest/dist/run-artifacts.js +1843 -0
  191. package/modules/backtest/dist/run-artifacts.js.map +1 -0
  192. package/modules/backtest/dist/signals.d.ts +110 -0
  193. package/modules/backtest/dist/signals.d.ts.map +1 -0
  194. package/modules/backtest/dist/signals.js +207 -0
  195. package/modules/backtest/dist/signals.js.map +1 -0
  196. package/modules/backtest/dist/tearsheet.d.ts +126 -0
  197. package/modules/backtest/dist/tearsheet.d.ts.map +1 -0
  198. package/modules/backtest/dist/tearsheet.js +266 -0
  199. package/modules/backtest/dist/tearsheet.js.map +1 -0
  200. package/modules/backtest/dist/types.d.ts +175 -0
  201. package/modules/backtest/dist/types.d.ts.map +1 -0
  202. package/modules/backtest/dist/types.js +29 -0
  203. package/modules/backtest/dist/types.js.map +1 -0
  204. package/modules/backtest/dist/validate.d.ts +13 -0
  205. package/modules/backtest/dist/validate.d.ts.map +1 -0
  206. package/modules/backtest/dist/validate.js +37 -0
  207. package/modules/backtest/dist/validate.js.map +1 -0
  208. package/modules/backtest/dist/vectorized.d.ts +53 -0
  209. package/modules/backtest/dist/vectorized.d.ts.map +1 -0
  210. package/modules/backtest/dist/vectorized.js +383 -0
  211. package/modules/backtest/dist/vectorized.js.map +1 -0
  212. package/modules/backtest/dist/walk-forward.d.ts +57 -0
  213. package/modules/backtest/dist/walk-forward.d.ts.map +1 -0
  214. package/modules/backtest/dist/walk-forward.js +125 -0
  215. package/modules/backtest/dist/walk-forward.js.map +1 -0
  216. package/modules/backtest/etc/backtest.api.md +139 -0
  217. package/modules/backtest/src/artifacts.ts +54 -0
  218. package/modules/backtest/src/broker.ts +1529 -0
  219. package/modules/backtest/src/costs.ts +225 -0
  220. package/modules/backtest/src/cross-sectional/engine.ts +1608 -0
  221. package/modules/backtest/src/cross-sectional/folds.ts +718 -0
  222. package/modules/backtest/src/cross-sectional/grid.ts +646 -0
  223. package/modules/backtest/src/cross-sectional/index.ts +76 -0
  224. package/modules/backtest/src/cross-sectional/types.ts +363 -0
  225. package/modules/backtest/src/cross-sectional/validate.ts +906 -0
  226. package/modules/backtest/src/diagnostics.ts +66 -0
  227. package/modules/backtest/src/environment/bench.ts +1022 -0
  228. package/modules/backtest/src/environment/environment.ts +766 -0
  229. package/modules/backtest/src/environment/episode.ts +146 -0
  230. package/modules/backtest/src/environment/episodes.ts +786 -0
  231. package/modules/backtest/src/environment/features.ts +184 -0
  232. package/modules/backtest/src/environment/index.ts +79 -0
  233. package/modules/backtest/src/environment/limits.ts +383 -0
  234. package/modules/backtest/src/environment/reward.ts +98 -0
  235. package/modules/backtest/src/environment/types.ts +595 -0
  236. package/modules/backtest/src/environment/validate.ts +415 -0
  237. package/modules/backtest/src/event-driven.ts +528 -0
  238. package/modules/backtest/src/execution/conformance.ts +346 -0
  239. package/modules/backtest/src/execution/fill-models.ts +410 -0
  240. package/modules/backtest/src/execution/fill-order.ts +261 -0
  241. package/modules/backtest/src/execution/index.ts +91 -0
  242. package/modules/backtest/src/execution/intrabar.ts +185 -0
  243. package/modules/backtest/src/execution/normalized.ts +216 -0
  244. package/modules/backtest/src/execution/policy.ts +447 -0
  245. package/modules/backtest/src/execution/types.ts +239 -0
  246. package/modules/backtest/src/execution/validate.ts +889 -0
  247. package/modules/backtest/src/generated/validation-specs.ts +1132 -0
  248. package/modules/backtest/src/index.ts +157 -0
  249. package/modules/backtest/src/options/chain.ts +410 -0
  250. package/modules/backtest/src/options/engine.ts +2240 -0
  251. package/modules/backtest/src/options/index.ts +68 -0
  252. package/modules/backtest/src/options/tearsheet.ts +327 -0
  253. package/modules/backtest/src/options/types.ts +573 -0
  254. package/modules/backtest/src/paper/index.ts +27 -0
  255. package/modules/backtest/src/paper/paper.ts +1288 -0
  256. package/modules/backtest/src/paper/types.ts +221 -0
  257. package/modules/backtest/src/paper/validate.ts +168 -0
  258. package/modules/backtest/src/portfolio/adapters.ts +651 -0
  259. package/modules/backtest/src/portfolio/engine.ts +1518 -0
  260. package/modules/backtest/src/portfolio/index.ts +64 -0
  261. package/modules/backtest/src/portfolio/types.ts +456 -0
  262. package/modules/backtest/src/portfolio/validate.ts +861 -0
  263. package/modules/backtest/src/run-artifacts.ts +2873 -0
  264. package/modules/backtest/src/signals.ts +267 -0
  265. package/modules/backtest/src/tearsheet.ts +425 -0
  266. package/modules/backtest/src/types.ts +200 -0
  267. package/modules/backtest/src/validate.ts +43 -0
  268. package/modules/backtest/src/vectorized.ts +541 -0
  269. package/modules/backtest/src/walk-forward.ts +215 -0
  270. package/modules/calendars/dist/cboe.d.ts +15 -0
  271. package/modules/calendars/dist/cboe.d.ts.map +1 -0
  272. package/modules/calendars/dist/cboe.js +16 -0
  273. package/modules/calendars/dist/cboe.js.map +1 -0
  274. package/modules/calendars/dist/crypto.d.ts +15 -0
  275. package/modules/calendars/dist/crypto.d.ts.map +1 -0
  276. package/modules/calendars/dist/crypto.js +16 -0
  277. package/modules/calendars/dist/crypto.js.map +1 -0
  278. package/modules/calendars/dist/expirations.d.ts +35 -0
  279. package/modules/calendars/dist/expirations.d.ts.map +1 -0
  280. package/modules/calendars/dist/expirations.js +158 -0
  281. package/modules/calendars/dist/expirations.js.map +1 -0
  282. package/modules/calendars/dist/index.d.ts +16 -0
  283. package/modules/calendars/dist/index.d.ts.map +1 -0
  284. package/modules/calendars/dist/index.js +13 -0
  285. package/modules/calendars/dist/index.js.map +1 -0
  286. package/modules/calendars/dist/nyse.d.ts +11 -0
  287. package/modules/calendars/dist/nyse.d.ts.map +1 -0
  288. package/modules/calendars/dist/nyse.js +12 -0
  289. package/modules/calendars/dist/nyse.js.map +1 -0
  290. package/modules/calendars/dist/trading-calendar.d.ts +32 -0
  291. package/modules/calendars/dist/trading-calendar.d.ts.map +1 -0
  292. package/modules/calendars/dist/trading-calendar.js +67 -0
  293. package/modules/calendars/dist/trading-calendar.js.map +1 -0
  294. package/modules/calendars/dist/us-market.d.ts +29 -0
  295. package/modules/calendars/dist/us-market.d.ts.map +1 -0
  296. package/modules/calendars/dist/us-market.js +72 -0
  297. package/modules/calendars/dist/us-market.js.map +1 -0
  298. package/modules/calendars/etc/calendars.api.md +22 -0
  299. package/modules/calendars/src/cboe.ts +17 -0
  300. package/modules/calendars/src/crypto.ts +17 -0
  301. package/modules/calendars/src/expirations.ts +200 -0
  302. package/modules/calendars/src/index.ts +23 -0
  303. package/modules/calendars/src/nyse.ts +13 -0
  304. package/modules/calendars/src/trading-calendar.ts +85 -0
  305. package/modules/calendars/src/us-market.ts +86 -0
  306. package/modules/cli/dist/bin.d.ts +9 -0
  307. package/modules/cli/dist/bin.d.ts.map +1 -0
  308. package/modules/cli/dist/bin.js +458 -0
  309. package/modules/cli/dist/bin.js.map +1 -0
  310. package/modules/cli/dist/commands.d.ts +7 -0
  311. package/modules/cli/dist/commands.d.ts.map +1 -0
  312. package/modules/cli/dist/commands.js +17 -0
  313. package/modules/cli/dist/commands.js.map +1 -0
  314. package/modules/cli/dist/exit-codes.d.ts +20 -0
  315. package/modules/cli/dist/exit-codes.d.ts.map +1 -0
  316. package/modules/cli/dist/exit-codes.js +19 -0
  317. package/modules/cli/dist/exit-codes.js.map +1 -0
  318. package/modules/cli/dist/index.d.ts +13 -0
  319. package/modules/cli/dist/index.d.ts.map +1 -0
  320. package/modules/cli/dist/index.js +10 -0
  321. package/modules/cli/dist/index.js.map +1 -0
  322. package/modules/cli/etc/cli.api.md +25 -0
  323. package/modules/cli/src/bin.ts +530 -0
  324. package/modules/cli/src/commands.ts +19 -0
  325. package/modules/cli/src/exit-codes.ts +21 -0
  326. package/modules/cli/src/index.ts +29 -0
  327. package/modules/commodities/dist/forwards.d.ts +274 -0
  328. package/modules/commodities/dist/forwards.d.ts.map +1 -0
  329. package/modules/commodities/dist/forwards.js +359 -0
  330. package/modules/commodities/dist/forwards.js.map +1 -0
  331. package/modules/commodities/dist/index.d.ts +10 -0
  332. package/modules/commodities/dist/index.d.ts.map +1 -0
  333. package/modules/commodities/dist/index.js +10 -0
  334. package/modules/commodities/dist/index.js.map +1 -0
  335. package/modules/commodities/dist/internal.d.ts +6 -0
  336. package/modules/commodities/dist/internal.d.ts.map +1 -0
  337. package/modules/commodities/dist/internal.js +6 -0
  338. package/modules/commodities/dist/internal.js.map +1 -0
  339. package/modules/commodities/dist/term-structure.d.ts +327 -0
  340. package/modules/commodities/dist/term-structure.d.ts.map +1 -0
  341. package/modules/commodities/dist/term-structure.js +416 -0
  342. package/modules/commodities/dist/term-structure.js.map +1 -0
  343. package/modules/commodities/etc/commodities.api.md +53 -0
  344. package/modules/commodities/src/forwards.ts +791 -0
  345. package/modules/commodities/src/index.ts +10 -0
  346. package/modules/commodities/src/internal.ts +6 -0
  347. package/modules/commodities/src/term-structure.ts +828 -0
  348. package/modules/core/dist/artifacts/analysis-artifact.d.ts +140 -0
  349. package/modules/core/dist/artifacts/analysis-artifact.d.ts.map +1 -0
  350. package/modules/core/dist/artifacts/analysis-artifact.js +356 -0
  351. package/modules/core/dist/artifacts/analysis-artifact.js.map +1 -0
  352. package/modules/core/dist/artifacts/calculation-comparison.d.ts +125 -0
  353. package/modules/core/dist/artifacts/calculation-comparison.d.ts.map +1 -0
  354. package/modules/core/dist/artifacts/calculation-comparison.js +444 -0
  355. package/modules/core/dist/artifacts/calculation-comparison.js.map +1 -0
  356. package/modules/core/dist/artifacts/canonical-scan.d.ts +58 -0
  357. package/modules/core/dist/artifacts/canonical-scan.d.ts.map +1 -0
  358. package/modules/core/dist/artifacts/canonical-scan.js +250 -0
  359. package/modules/core/dist/artifacts/canonical-scan.js.map +1 -0
  360. package/modules/core/dist/artifacts/comparison.d.ts +179 -0
  361. package/modules/core/dist/artifacts/comparison.d.ts.map +1 -0
  362. package/modules/core/dist/artifacts/comparison.js +383 -0
  363. package/modules/core/dist/artifacts/comparison.js.map +1 -0
  364. package/modules/core/dist/artifacts/content-hash.d.ts +38 -0
  365. package/modules/core/dist/artifacts/content-hash.d.ts.map +1 -0
  366. package/modules/core/dist/artifacts/content-hash.js +170 -0
  367. package/modules/core/dist/artifacts/content-hash.js.map +1 -0
  368. package/modules/core/dist/artifacts/deep-freeze.d.ts +8 -0
  369. package/modules/core/dist/artifacts/deep-freeze.d.ts.map +1 -0
  370. package/modules/core/dist/artifacts/deep-freeze.js +16 -0
  371. package/modules/core/dist/artifacts/deep-freeze.js.map +1 -0
  372. package/modules/core/dist/artifacts/fitted-model-kit.d.ts +123 -0
  373. package/modules/core/dist/artifacts/fitted-model-kit.d.ts.map +1 -0
  374. package/modules/core/dist/artifacts/fitted-model-kit.js +281 -0
  375. package/modules/core/dist/artifacts/fitted-model-kit.js.map +1 -0
  376. package/modules/core/dist/artifacts/fitted-model-summary.d.ts +73 -0
  377. package/modules/core/dist/artifacts/fitted-model-summary.d.ts.map +1 -0
  378. package/modules/core/dist/artifacts/fitted-model-summary.js +254 -0
  379. package/modules/core/dist/artifacts/fitted-model-summary.js.map +1 -0
  380. package/modules/core/dist/artifacts/index.d.ts +52 -0
  381. package/modules/core/dist/artifacts/index.d.ts.map +1 -0
  382. package/modules/core/dist/artifacts/index.js +47 -0
  383. package/modules/core/dist/artifacts/index.js.map +1 -0
  384. package/modules/core/dist/artifacts/market-snapshot.d.ts +189 -0
  385. package/modules/core/dist/artifacts/market-snapshot.d.ts.map +1 -0
  386. package/modules/core/dist/artifacts/market-snapshot.js +517 -0
  387. package/modules/core/dist/artifacts/market-snapshot.js.map +1 -0
  388. package/modules/core/dist/artifacts/migration.d.ts +60 -0
  389. package/modules/core/dist/artifacts/migration.d.ts.map +1 -0
  390. package/modules/core/dist/artifacts/migration.js +106 -0
  391. package/modules/core/dist/artifacts/migration.js.map +1 -0
  392. package/modules/core/dist/artifacts/numeric-comparison.d.ts +12 -0
  393. package/modules/core/dist/artifacts/numeric-comparison.d.ts.map +1 -0
  394. package/modules/core/dist/artifacts/numeric-comparison.js +53 -0
  395. package/modules/core/dist/artifacts/numeric-comparison.js.map +1 -0
  396. package/modules/core/dist/artifacts/scenario-set.d.ts +97 -0
  397. package/modules/core/dist/artifacts/scenario-set.d.ts.map +1 -0
  398. package/modules/core/dist/artifacts/scenario-set.js +249 -0
  399. package/modules/core/dist/artifacts/scenario-set.js.map +1 -0
  400. package/modules/core/dist/artifacts/table-handle.d.ts +96 -0
  401. package/modules/core/dist/artifacts/table-handle.d.ts.map +1 -0
  402. package/modules/core/dist/artifacts/table-handle.js +253 -0
  403. package/modules/core/dist/artifacts/table-handle.js.map +1 -0
  404. package/modules/core/dist/assumptions.d.ts +52 -0
  405. package/modules/core/dist/assumptions.d.ts.map +1 -0
  406. package/modules/core/dist/assumptions.js +13 -0
  407. package/modules/core/dist/assumptions.js.map +1 -0
  408. package/modules/core/dist/calendar.d.ts +98 -0
  409. package/modules/core/dist/calendar.d.ts.map +1 -0
  410. package/modules/core/dist/calendar.js +301 -0
  411. package/modules/core/dist/calendar.js.map +1 -0
  412. package/modules/core/dist/canonical-json.d.ts +63 -0
  413. package/modules/core/dist/canonical-json.d.ts.map +1 -0
  414. package/modules/core/dist/canonical-json.js +241 -0
  415. package/modules/core/dist/canonical-json.js.map +1 -0
  416. package/modules/core/dist/computed.d.ts +31 -0
  417. package/modules/core/dist/computed.d.ts.map +1 -0
  418. package/modules/core/dist/computed.js +40 -0
  419. package/modules/core/dist/computed.js.map +1 -0
  420. package/modules/core/dist/contracts.d.ts +59 -0
  421. package/modules/core/dist/contracts.d.ts.map +1 -0
  422. package/modules/core/dist/contracts.js +9 -0
  423. package/modules/core/dist/contracts.js.map +1 -0
  424. package/modules/core/dist/dates.d.ts +31 -0
  425. package/modules/core/dist/dates.d.ts.map +1 -0
  426. package/modules/core/dist/dates.js +126 -0
  427. package/modules/core/dist/dates.js.map +1 -0
  428. package/modules/core/dist/diagnostics.d.ts +278 -0
  429. package/modules/core/dist/diagnostics.d.ts.map +1 -0
  430. package/modules/core/dist/diagnostics.js +287 -0
  431. package/modules/core/dist/diagnostics.js.map +1 -0
  432. package/modules/core/dist/errors.d.ts +324 -0
  433. package/modules/core/dist/errors.d.ts.map +1 -0
  434. package/modules/core/dist/errors.js +363 -0
  435. package/modules/core/dist/errors.js.map +1 -0
  436. package/modules/core/dist/facade.d.ts +97 -0
  437. package/modules/core/dist/facade.d.ts.map +1 -0
  438. package/modules/core/dist/facade.js +354 -0
  439. package/modules/core/dist/facade.js.map +1 -0
  440. package/modules/core/dist/index.d.ts +45 -0
  441. package/modules/core/dist/index.d.ts.map +1 -0
  442. package/modules/core/dist/index.js +23 -0
  443. package/modules/core/dist/index.js.map +1 -0
  444. package/modules/core/dist/invariants.d.ts +112 -0
  445. package/modules/core/dist/invariants.d.ts.map +1 -0
  446. package/modules/core/dist/invariants.js +240 -0
  447. package/modules/core/dist/invariants.js.map +1 -0
  448. package/modules/core/dist/market-data.d.ts +219 -0
  449. package/modules/core/dist/market-data.d.ts.map +1 -0
  450. package/modules/core/dist/market-data.js +183 -0
  451. package/modules/core/dist/market-data.js.map +1 -0
  452. package/modules/core/dist/numeric.d.ts +46 -0
  453. package/modules/core/dist/numeric.d.ts.map +1 -0
  454. package/modules/core/dist/numeric.js +145 -0
  455. package/modules/core/dist/numeric.js.map +1 -0
  456. package/modules/core/dist/orders.d.ts +28 -0
  457. package/modules/core/dist/orders.d.ts.map +1 -0
  458. package/modules/core/dist/orders.js +49 -0
  459. package/modules/core/dist/orders.js.map +1 -0
  460. package/modules/core/dist/pricing.d.ts +418 -0
  461. package/modules/core/dist/pricing.d.ts.map +1 -0
  462. package/modules/core/dist/pricing.js +987 -0
  463. package/modules/core/dist/pricing.js.map +1 -0
  464. package/modules/core/dist/provenance.d.ts +25 -0
  465. package/modules/core/dist/provenance.d.ts.map +1 -0
  466. package/modules/core/dist/provenance.js +75 -0
  467. package/modules/core/dist/provenance.js.map +1 -0
  468. package/modules/core/dist/schema/index.d.ts +14 -0
  469. package/modules/core/dist/schema/index.d.ts.map +1 -0
  470. package/modules/core/dist/schema/index.js +12 -0
  471. package/modules/core/dist/schema/index.js.map +1 -0
  472. package/modules/core/dist/schema/json-schema-guard.d.ts +21 -0
  473. package/modules/core/dist/schema/json-schema-guard.d.ts.map +1 -0
  474. package/modules/core/dist/schema/json-schema-guard.js +114 -0
  475. package/modules/core/dist/schema/json-schema-guard.js.map +1 -0
  476. package/modules/core/dist/schema/json-schema.d.ts +33 -0
  477. package/modules/core/dist/schema/json-schema.d.ts.map +1 -0
  478. package/modules/core/dist/schema/json-schema.js +3 -0
  479. package/modules/core/dist/schema/json-schema.js.map +1 -0
  480. package/modules/core/dist/schema/payloads.d.ts +429 -0
  481. package/modules/core/dist/schema/payloads.d.ts.map +1 -0
  482. package/modules/core/dist/schema/payloads.js +323 -0
  483. package/modules/core/dist/schema/payloads.js.map +1 -0
  484. package/modules/core/dist/schema/schema.d.ts +282 -0
  485. package/modules/core/dist/schema/schema.d.ts.map +1 -0
  486. package/modules/core/dist/schema/schema.js +780 -0
  487. package/modules/core/dist/schema/schema.js.map +1 -0
  488. package/modules/core/dist/schema/standard.d.ts +32 -0
  489. package/modules/core/dist/schema/standard.d.ts.map +1 -0
  490. package/modules/core/dist/schema/standard.js +8 -0
  491. package/modules/core/dist/schema/standard.js.map +1 -0
  492. package/modules/core/dist/symbology.d.ts +30 -0
  493. package/modules/core/dist/symbology.d.ts.map +1 -0
  494. package/modules/core/dist/symbology.js +126 -0
  495. package/modules/core/dist/symbology.js.map +1 -0
  496. package/modules/core/dist/time.d.ts +122 -0
  497. package/modules/core/dist/time.d.ts.map +1 -0
  498. package/modules/core/dist/time.js +349 -0
  499. package/modules/core/dist/time.js.map +1 -0
  500. package/modules/core/dist/validation-codes.d.ts +24 -0
  501. package/modules/core/dist/validation-codes.d.ts.map +1 -0
  502. package/modules/core/dist/validation-codes.js +24 -0
  503. package/modules/core/dist/validation-codes.js.map +1 -0
  504. package/modules/core/dist/validation.d.ts +117 -0
  505. package/modules/core/dist/validation.d.ts.map +1 -0
  506. package/modules/core/dist/validation.js +415 -0
  507. package/modules/core/dist/validation.js.map +1 -0
  508. package/modules/core/etc/core.api.md +157 -0
  509. package/modules/core/src/artifacts/analysis-artifact.ts +515 -0
  510. package/modules/core/src/artifacts/calculation-comparison.ts +641 -0
  511. package/modules/core/src/artifacts/canonical-scan.ts +358 -0
  512. package/modules/core/src/artifacts/comparison.ts +586 -0
  513. package/modules/core/src/artifacts/content-hash.ts +183 -0
  514. package/modules/core/src/artifacts/deep-freeze.ts +15 -0
  515. package/modules/core/src/artifacts/fitted-model-kit.ts +402 -0
  516. package/modules/core/src/artifacts/fitted-model-summary.ts +478 -0
  517. package/modules/core/src/artifacts/index.ts +155 -0
  518. package/modules/core/src/artifacts/market-snapshot.ts +787 -0
  519. package/modules/core/src/artifacts/migration.ts +195 -0
  520. package/modules/core/src/artifacts/numeric-comparison.ts +71 -0
  521. package/modules/core/src/artifacts/scenario-set.ts +383 -0
  522. package/modules/core/src/artifacts/table-handle.ts +329 -0
  523. package/modules/core/src/assumptions.ts +62 -0
  524. package/modules/core/src/calendar.ts +407 -0
  525. package/modules/core/src/canonical-json.ts +289 -0
  526. package/modules/core/src/computed.ts +55 -0
  527. package/modules/core/src/contracts.ts +63 -0
  528. package/modules/core/src/dates.ts +163 -0
  529. package/modules/core/src/diagnostics.ts +397 -0
  530. package/modules/core/src/errors.ts +404 -0
  531. package/modules/core/src/facade.ts +436 -0
  532. package/modules/core/src/index.ts +185 -0
  533. package/modules/core/src/invariants.ts +339 -0
  534. package/modules/core/src/market-data.ts +481 -0
  535. package/modules/core/src/numeric.ts +205 -0
  536. package/modules/core/src/orders.ts +71 -0
  537. package/modules/core/src/pricing.ts +1647 -0
  538. package/modules/core/src/provenance.ts +121 -0
  539. package/modules/core/src/schema/index.ts +61 -0
  540. package/modules/core/src/schema/json-schema-guard.ts +172 -0
  541. package/modules/core/src/schema/json-schema.ts +52 -0
  542. package/modules/core/src/schema/payloads.ts +364 -0
  543. package/modules/core/src/schema/schema.ts +986 -0
  544. package/modules/core/src/schema/standard.ts +40 -0
  545. package/modules/core/src/symbology.ts +170 -0
  546. package/modules/core/src/time.ts +458 -0
  547. package/modules/core/src/validation-codes.ts +23 -0
  548. package/modules/core/src/validation.ts +607 -0
  549. package/modules/crypto/dist/carry.d.ts +176 -0
  550. package/modules/crypto/dist/carry.d.ts.map +1 -0
  551. package/modules/crypto/dist/carry.js +349 -0
  552. package/modules/crypto/dist/carry.js.map +1 -0
  553. package/modules/crypto/dist/curve.d.ts +69 -0
  554. package/modules/crypto/dist/curve.d.ts.map +1 -0
  555. package/modules/crypto/dist/curve.js +180 -0
  556. package/modules/crypto/dist/curve.js.map +1 -0
  557. package/modules/crypto/dist/index.d.ts +20 -0
  558. package/modules/crypto/dist/index.d.ts.map +1 -0
  559. package/modules/crypto/dist/index.js +16 -0
  560. package/modules/crypto/dist/index.js.map +1 -0
  561. package/modules/crypto/dist/inverse.d.ts +61 -0
  562. package/modules/crypto/dist/inverse.d.ts.map +1 -0
  563. package/modules/crypto/dist/inverse.js +89 -0
  564. package/modules/crypto/dist/inverse.js.map +1 -0
  565. package/modules/crypto/dist/liquidation.d.ts +67 -0
  566. package/modules/crypto/dist/liquidation.d.ts.map +1 -0
  567. package/modules/crypto/dist/liquidation.js +103 -0
  568. package/modules/crypto/dist/liquidation.js.map +1 -0
  569. package/modules/crypto/etc/crypto.api.md +45 -0
  570. package/modules/crypto/src/carry.ts +656 -0
  571. package/modules/crypto/src/curve.ts +273 -0
  572. package/modules/crypto/src/index.ts +62 -0
  573. package/modules/crypto/src/inverse.ts +172 -0
  574. package/modules/crypto/src/liquidation.ts +174 -0
  575. package/modules/fixed-income/dist/artifacts.d.ts +24 -0
  576. package/modules/fixed-income/dist/artifacts.d.ts.map +1 -0
  577. package/modules/fixed-income/dist/artifacts.js +21 -0
  578. package/modules/fixed-income/dist/artifacts.js.map +1 -0
  579. package/modules/fixed-income/dist/bonds.d.ts +298 -0
  580. package/modules/fixed-income/dist/bonds.d.ts.map +1 -0
  581. package/modules/fixed-income/dist/bonds.js +951 -0
  582. package/modules/fixed-income/dist/bonds.js.map +1 -0
  583. package/modules/fixed-income/dist/conventions.d.ts +77 -0
  584. package/modules/fixed-income/dist/conventions.d.ts.map +1 -0
  585. package/modules/fixed-income/dist/conventions.js +266 -0
  586. package/modules/fixed-income/dist/conventions.js.map +1 -0
  587. package/modules/fixed-income/dist/convertible.d.ts +76 -0
  588. package/modules/fixed-income/dist/convertible.d.ts.map +1 -0
  589. package/modules/fixed-income/dist/convertible.js +182 -0
  590. package/modules/fixed-income/dist/convertible.js.map +1 -0
  591. package/modules/fixed-income/dist/credit.d.ts +227 -0
  592. package/modules/fixed-income/dist/credit.d.ts.map +1 -0
  593. package/modules/fixed-income/dist/credit.js +653 -0
  594. package/modules/fixed-income/dist/credit.js.map +1 -0
  595. package/modules/fixed-income/dist/cross-currency.d.ts +82 -0
  596. package/modules/fixed-income/dist/cross-currency.d.ts.map +1 -0
  597. package/modules/fixed-income/dist/cross-currency.js +93 -0
  598. package/modules/fixed-income/dist/cross-currency.js.map +1 -0
  599. package/modules/fixed-income/dist/curve-data.d.ts +70 -0
  600. package/modules/fixed-income/dist/curve-data.d.ts.map +1 -0
  601. package/modules/fixed-income/dist/curve-data.js +254 -0
  602. package/modules/fixed-income/dist/curve-data.js.map +1 -0
  603. package/modules/fixed-income/dist/curve-mappers.d.ts +57 -0
  604. package/modules/fixed-income/dist/curve-mappers.d.ts.map +1 -0
  605. package/modules/fixed-income/dist/curve-mappers.js +131 -0
  606. package/modules/fixed-income/dist/curve-mappers.js.map +1 -0
  607. package/modules/fixed-income/dist/curve-state.d.ts +47 -0
  608. package/modules/fixed-income/dist/curve-state.d.ts.map +1 -0
  609. package/modules/fixed-income/dist/curve-state.js +33 -0
  610. package/modules/fixed-income/dist/curve-state.js.map +1 -0
  611. package/modules/fixed-income/dist/curves.d.ts +198 -0
  612. package/modules/fixed-income/dist/curves.d.ts.map +1 -0
  613. package/modules/fixed-income/dist/curves.js +803 -0
  614. package/modules/fixed-income/dist/curves.js.map +1 -0
  615. package/modules/fixed-income/dist/fitted-model-artifacts.d.ts +277 -0
  616. package/modules/fixed-income/dist/fitted-model-artifacts.d.ts.map +1 -0
  617. package/modules/fixed-income/dist/fitted-model-artifacts.js +839 -0
  618. package/modules/fixed-income/dist/fitted-model-artifacts.js.map +1 -0
  619. package/modules/fixed-income/dist/fitted-model-families.d.ts +170 -0
  620. package/modules/fixed-income/dist/fitted-model-families.d.ts.map +1 -0
  621. package/modules/fixed-income/dist/fitted-model-families.js +461 -0
  622. package/modules/fixed-income/dist/fitted-model-families.js.map +1 -0
  623. package/modules/fixed-income/dist/futures.d.ts +264 -0
  624. package/modules/fixed-income/dist/futures.d.ts.map +1 -0
  625. package/modules/fixed-income/dist/futures.js +630 -0
  626. package/modules/fixed-income/dist/futures.js.map +1 -0
  627. package/modules/fixed-income/dist/generated/validation-specs.d.ts +12 -0
  628. package/modules/fixed-income/dist/generated/validation-specs.d.ts.map +1 -0
  629. package/modules/fixed-income/dist/generated/validation-specs.js +556 -0
  630. package/modules/fixed-income/dist/generated/validation-specs.js.map +1 -0
  631. package/modules/fixed-income/dist/index.d.ts +36 -0
  632. package/modules/fixed-income/dist/index.d.ts.map +1 -0
  633. package/modules/fixed-income/dist/index.js +37 -0
  634. package/modules/fixed-income/dist/index.js.map +1 -0
  635. package/modules/fixed-income/dist/inflation.d.ts +174 -0
  636. package/modules/fixed-income/dist/inflation.d.ts.map +1 -0
  637. package/modules/fixed-income/dist/inflation.js +335 -0
  638. package/modules/fixed-income/dist/inflation.js.map +1 -0
  639. package/modules/fixed-income/dist/lattice.d.ts +156 -0
  640. package/modules/fixed-income/dist/lattice.d.ts.map +1 -0
  641. package/modules/fixed-income/dist/lattice.js +433 -0
  642. package/modules/fixed-income/dist/lattice.js.map +1 -0
  643. package/modules/fixed-income/dist/models.d.ts +187 -0
  644. package/modules/fixed-income/dist/models.d.ts.map +1 -0
  645. package/modules/fixed-income/dist/models.js +580 -0
  646. package/modules/fixed-income/dist/models.js.map +1 -0
  647. package/modules/fixed-income/dist/pricer.d.ts +48 -0
  648. package/modules/fixed-income/dist/pricer.d.ts.map +1 -0
  649. package/modules/fixed-income/dist/pricer.js +445 -0
  650. package/modules/fixed-income/dist/pricer.js.map +1 -0
  651. package/modules/fixed-income/dist/rates.d.ts +305 -0
  652. package/modules/fixed-income/dist/rates.d.ts.map +1 -0
  653. package/modules/fixed-income/dist/rates.js +686 -0
  654. package/modules/fixed-income/dist/rates.js.map +1 -0
  655. package/modules/fixed-income/dist/validate.d.ts +28 -0
  656. package/modules/fixed-income/dist/validate.d.ts.map +1 -0
  657. package/modules/fixed-income/dist/validate.js +123 -0
  658. package/modules/fixed-income/dist/validate.js.map +1 -0
  659. package/modules/fixed-income/dist/xva.d.ts +88 -0
  660. package/modules/fixed-income/dist/xva.d.ts.map +1 -0
  661. package/modules/fixed-income/dist/xva.js +316 -0
  662. package/modules/fixed-income/dist/xva.js.map +1 -0
  663. package/modules/fixed-income/etc/fixed-income.api.md +195 -0
  664. package/modules/fixed-income/src/artifacts.ts +60 -0
  665. package/modules/fixed-income/src/bonds.ts +1514 -0
  666. package/modules/fixed-income/src/conventions.ts +387 -0
  667. package/modules/fixed-income/src/convertible.ts +286 -0
  668. package/modules/fixed-income/src/credit.ts +1065 -0
  669. package/modules/fixed-income/src/cross-currency.ts +176 -0
  670. package/modules/fixed-income/src/curve-data.ts +381 -0
  671. package/modules/fixed-income/src/curve-mappers.ts +170 -0
  672. package/modules/fixed-income/src/curve-state.ts +70 -0
  673. package/modules/fixed-income/src/curves.ts +1169 -0
  674. package/modules/fixed-income/src/fitted-model-artifacts.ts +1414 -0
  675. package/modules/fixed-income/src/fitted-model-families.ts +834 -0
  676. package/modules/fixed-income/src/futures.ts +1018 -0
  677. package/modules/fixed-income/src/generated/validation-specs.ts +559 -0
  678. package/modules/fixed-income/src/index.ts +241 -0
  679. package/modules/fixed-income/src/inflation.ts +554 -0
  680. package/modules/fixed-income/src/lattice.ts +675 -0
  681. package/modules/fixed-income/src/models.ts +897 -0
  682. package/modules/fixed-income/src/pricer.ts +624 -0
  683. package/modules/fixed-income/src/rates.ts +1086 -0
  684. package/modules/fixed-income/src/validate.ts +169 -0
  685. package/modules/fixed-income/src/xva.ts +466 -0
  686. package/modules/foreign-exchange/dist/exposure.d.ts +140 -0
  687. package/modules/foreign-exchange/dist/exposure.d.ts.map +1 -0
  688. package/modules/foreign-exchange/dist/exposure.js +253 -0
  689. package/modules/foreign-exchange/dist/exposure.js.map +1 -0
  690. package/modules/foreign-exchange/dist/forwards.d.ts +159 -0
  691. package/modules/foreign-exchange/dist/forwards.d.ts.map +1 -0
  692. package/modules/foreign-exchange/dist/forwards.js +310 -0
  693. package/modules/foreign-exchange/dist/forwards.js.map +1 -0
  694. package/modules/foreign-exchange/dist/index.d.ts +11 -0
  695. package/modules/foreign-exchange/dist/index.d.ts.map +1 -0
  696. package/modules/foreign-exchange/dist/index.js +11 -0
  697. package/modules/foreign-exchange/dist/index.js.map +1 -0
  698. package/modules/foreign-exchange/dist/internal.d.ts +6 -0
  699. package/modules/foreign-exchange/dist/internal.d.ts.map +1 -0
  700. package/modules/foreign-exchange/dist/internal.js +6 -0
  701. package/modules/foreign-exchange/dist/internal.js.map +1 -0
  702. package/modules/foreign-exchange/dist/spot.d.ts +150 -0
  703. package/modules/foreign-exchange/dist/spot.d.ts.map +1 -0
  704. package/modules/foreign-exchange/dist/spot.js +289 -0
  705. package/modules/foreign-exchange/dist/spot.js.map +1 -0
  706. package/modules/foreign-exchange/etc/foreign-exchange.api.md +52 -0
  707. package/modules/foreign-exchange/src/exposure.ts +485 -0
  708. package/modules/foreign-exchange/src/forwards.ts +595 -0
  709. package/modules/foreign-exchange/src/index.ts +11 -0
  710. package/modules/foreign-exchange/src/internal.ts +6 -0
  711. package/modules/foreign-exchange/src/spot.ts +530 -0
  712. package/modules/fundamentals/dist/analyze.d.ts +90 -0
  713. package/modules/fundamentals/dist/analyze.d.ts.map +1 -0
  714. package/modules/fundamentals/dist/analyze.js +293 -0
  715. package/modules/fundamentals/dist/analyze.js.map +1 -0
  716. package/modules/fundamentals/dist/index.d.ts +17 -0
  717. package/modules/fundamentals/dist/index.d.ts.map +1 -0
  718. package/modules/fundamentals/dist/index.js +15 -0
  719. package/modules/fundamentals/dist/index.js.map +1 -0
  720. package/modules/fundamentals/dist/periods.d.ts +47 -0
  721. package/modules/fundamentals/dist/periods.d.ts.map +1 -0
  722. package/modules/fundamentals/dist/periods.js +106 -0
  723. package/modules/fundamentals/dist/periods.js.map +1 -0
  724. package/modules/fundamentals/dist/ratio-heads.d.ts +47 -0
  725. package/modules/fundamentals/dist/ratio-heads.d.ts.map +1 -0
  726. package/modules/fundamentals/dist/ratio-heads.js +766 -0
  727. package/modules/fundamentals/dist/ratio-heads.js.map +1 -0
  728. package/modules/fundamentals/dist/ratio-internals.d.ts +187 -0
  729. package/modules/fundamentals/dist/ratio-internals.d.ts.map +1 -0
  730. package/modules/fundamentals/dist/ratio-internals.js +299 -0
  731. package/modules/fundamentals/dist/ratio-internals.js.map +1 -0
  732. package/modules/fundamentals/dist/ratios.d.ts +9 -0
  733. package/modules/fundamentals/dist/ratios.d.ts.map +1 -0
  734. package/modules/fundamentals/dist/ratios.js +8 -0
  735. package/modules/fundamentals/dist/ratios.js.map +1 -0
  736. package/modules/fundamentals/dist/score-heads.d.ts +130 -0
  737. package/modules/fundamentals/dist/score-heads.d.ts.map +1 -0
  738. package/modules/fundamentals/dist/score-heads.js +364 -0
  739. package/modules/fundamentals/dist/score-heads.js.map +1 -0
  740. package/modules/fundamentals/dist/scores.d.ts +6 -0
  741. package/modules/fundamentals/dist/scores.d.ts.map +1 -0
  742. package/modules/fundamentals/dist/scores.js +6 -0
  743. package/modules/fundamentals/dist/scores.js.map +1 -0
  744. package/modules/fundamentals/dist/statement-contracts.d.ts +170 -0
  745. package/modules/fundamentals/dist/statement-contracts.d.ts.map +1 -0
  746. package/modules/fundamentals/dist/statement-contracts.js +207 -0
  747. package/modules/fundamentals/dist/statement-contracts.js.map +1 -0
  748. package/modules/fundamentals/dist/statement-utilities.d.ts +190 -0
  749. package/modules/fundamentals/dist/statement-utilities.d.ts.map +1 -0
  750. package/modules/fundamentals/dist/statement-utilities.js +501 -0
  751. package/modules/fundamentals/dist/statement-utilities.js.map +1 -0
  752. package/modules/fundamentals/dist/statements.d.ts +8 -0
  753. package/modules/fundamentals/dist/statements.d.ts.map +1 -0
  754. package/modules/fundamentals/dist/statements.js +7 -0
  755. package/modules/fundamentals/dist/statements.js.map +1 -0
  756. package/modules/fundamentals/etc/fundamentals.api.md +110 -0
  757. package/modules/fundamentals/src/analyze.ts +401 -0
  758. package/modules/fundamentals/src/index.ts +24 -0
  759. package/modules/fundamentals/src/periods.ts +197 -0
  760. package/modules/fundamentals/src/ratio-heads.ts +945 -0
  761. package/modules/fundamentals/src/ratio-internals.ts +562 -0
  762. package/modules/fundamentals/src/ratios.ts +23 -0
  763. package/modules/fundamentals/src/score-heads.ts +651 -0
  764. package/modules/fundamentals/src/scores.ts +6 -0
  765. package/modules/fundamentals/src/statement-contracts.ts +393 -0
  766. package/modules/fundamentals/src/statement-utilities.ts +833 -0
  767. package/modules/fundamentals/src/statements.ts +22 -0
  768. package/modules/http/dist/bin.d.ts +7 -0
  769. package/modules/http/dist/bin.d.ts.map +1 -0
  770. package/modules/http/dist/bin.js +167 -0
  771. package/modules/http/dist/bin.js.map +1 -0
  772. package/modules/http/dist/index.d.ts +10 -0
  773. package/modules/http/dist/index.d.ts.map +1 -0
  774. package/modules/http/dist/index.js +8 -0
  775. package/modules/http/dist/index.js.map +1 -0
  776. package/modules/http/dist/openapi.d.ts +38 -0
  777. package/modules/http/dist/openapi.d.ts.map +1 -0
  778. package/modules/http/dist/openapi.js +431 -0
  779. package/modules/http/dist/openapi.js.map +1 -0
  780. package/modules/http/dist/security.d.ts +21 -0
  781. package/modules/http/dist/security.d.ts.map +1 -0
  782. package/modules/http/dist/security.js +116 -0
  783. package/modules/http/dist/security.js.map +1 -0
  784. package/modules/http/dist/server.d.ts +63 -0
  785. package/modules/http/dist/server.d.ts.map +1 -0
  786. package/modules/http/dist/server.js +544 -0
  787. package/modules/http/dist/server.js.map +1 -0
  788. package/modules/http/etc/http.api.md +15 -0
  789. package/modules/http/etc/openapi.json +51958 -0
  790. package/modules/http/src/bin.ts +190 -0
  791. package/modules/http/src/index.ts +10 -0
  792. package/modules/http/src/openapi.ts +488 -0
  793. package/modules/http/src/security.ts +158 -0
  794. package/modules/http/src/server.ts +941 -0
  795. package/modules/math/dist/bivariate.d.ts +17 -0
  796. package/modules/math/dist/bivariate.d.ts.map +1 -0
  797. package/modules/math/dist/bivariate.js +123 -0
  798. package/modules/math/dist/bivariate.js.map +1 -0
  799. package/modules/math/dist/distributions.d.ts +66 -0
  800. package/modules/math/dist/distributions.d.ts.map +1 -0
  801. package/modules/math/dist/distributions.js +465 -0
  802. package/modules/math/dist/distributions.js.map +1 -0
  803. package/modules/math/dist/filters.d.ts +96 -0
  804. package/modules/math/dist/filters.d.ts.map +1 -0
  805. package/modules/math/dist/filters.js +347 -0
  806. package/modules/math/dist/filters.js.map +1 -0
  807. package/modules/math/dist/index.d.ts +34 -0
  808. package/modules/math/dist/index.d.ts.map +1 -0
  809. package/modules/math/dist/index.js +23 -0
  810. package/modules/math/dist/index.js.map +1 -0
  811. package/modules/math/dist/integration.d.ts +58 -0
  812. package/modules/math/dist/integration.d.ts.map +1 -0
  813. package/modules/math/dist/integration.js +176 -0
  814. package/modules/math/dist/integration.js.map +1 -0
  815. package/modules/math/dist/interpolation.d.ts +57 -0
  816. package/modules/math/dist/interpolation.d.ts.map +1 -0
  817. package/modules/math/dist/interpolation.js +464 -0
  818. package/modules/math/dist/interpolation.js.map +1 -0
  819. package/modules/math/dist/linalg.d.ts +251 -0
  820. package/modules/math/dist/linalg.d.ts.map +1 -0
  821. package/modules/math/dist/linalg.js +1503 -0
  822. package/modules/math/dist/linalg.js.map +1 -0
  823. package/modules/math/dist/lowdiscrepancy.d.ts +21 -0
  824. package/modules/math/dist/lowdiscrepancy.d.ts.map +1 -0
  825. package/modules/math/dist/lowdiscrepancy.js +200 -0
  826. package/modules/math/dist/lowdiscrepancy.js.map +1 -0
  827. package/modules/math/dist/montecarlo.d.ts +58 -0
  828. package/modules/math/dist/montecarlo.d.ts.map +1 -0
  829. package/modules/math/dist/montecarlo.js +248 -0
  830. package/modules/math/dist/montecarlo.js.map +1 -0
  831. package/modules/math/dist/normal.d.ts +40 -0
  832. package/modules/math/dist/normal.d.ts.map +1 -0
  833. package/modules/math/dist/normal.js +157 -0
  834. package/modules/math/dist/normal.js.map +1 -0
  835. package/modules/math/dist/optimize.d.ts +83 -0
  836. package/modules/math/dist/optimize.d.ts.map +1 -0
  837. package/modules/math/dist/optimize.js +784 -0
  838. package/modules/math/dist/optimize.js.map +1 -0
  839. package/modules/math/dist/random.d.ts +76 -0
  840. package/modules/math/dist/random.d.ts.map +1 -0
  841. package/modules/math/dist/random.js +261 -0
  842. package/modules/math/dist/random.js.map +1 -0
  843. package/modules/math/dist/regression.d.ts +58 -0
  844. package/modules/math/dist/regression.d.ts.map +1 -0
  845. package/modules/math/dist/regression.js +283 -0
  846. package/modules/math/dist/regression.js.map +1 -0
  847. package/modules/math/dist/resource-validation.d.ts +18 -0
  848. package/modules/math/dist/resource-validation.d.ts.map +1 -0
  849. package/modules/math/dist/resource-validation.js +60 -0
  850. package/modules/math/dist/resource-validation.js.map +1 -0
  851. package/modules/math/dist/sobol-data.d.ts +36 -0
  852. package/modules/math/dist/sobol-data.d.ts.map +1 -0
  853. package/modules/math/dist/sobol-data.js +172 -0
  854. package/modules/math/dist/sobol-data.js.map +1 -0
  855. package/modules/math/dist/solvers.d.ts +90 -0
  856. package/modules/math/dist/solvers.d.ts.map +1 -0
  857. package/modules/math/dist/solvers.js +663 -0
  858. package/modules/math/dist/solvers.js.map +1 -0
  859. package/modules/math/dist/statistics-internal.d.ts +73 -0
  860. package/modules/math/dist/statistics-internal.d.ts.map +1 -0
  861. package/modules/math/dist/statistics-internal.js +217 -0
  862. package/modules/math/dist/statistics-internal.js.map +1 -0
  863. package/modules/math/dist/statistics.d.ts +113 -0
  864. package/modules/math/dist/statistics.d.ts.map +1 -0
  865. package/modules/math/dist/statistics.js +545 -0
  866. package/modules/math/dist/statistics.js.map +1 -0
  867. package/modules/math/dist/timeseries.d.ts +131 -0
  868. package/modules/math/dist/timeseries.d.ts.map +1 -0
  869. package/modules/math/dist/timeseries.js +502 -0
  870. package/modules/math/dist/timeseries.js.map +1 -0
  871. package/modules/math/etc/math.api.md +178 -0
  872. package/modules/math/src/bivariate.ts +124 -0
  873. package/modules/math/src/distributions.ts +481 -0
  874. package/modules/math/src/filters.ts +452 -0
  875. package/modules/math/src/index.ts +223 -0
  876. package/modules/math/src/integration.ts +259 -0
  877. package/modules/math/src/interpolation.ts +588 -0
  878. package/modules/math/src/linalg.ts +1892 -0
  879. package/modules/math/src/lowdiscrepancy.ts +241 -0
  880. package/modules/math/src/montecarlo.ts +326 -0
  881. package/modules/math/src/normal.ts +161 -0
  882. package/modules/math/src/optimize.ts +943 -0
  883. package/modules/math/src/random.ts +372 -0
  884. package/modules/math/src/regression.ts +340 -0
  885. package/modules/math/src/resource-validation.ts +79 -0
  886. package/modules/math/src/sobol-data.ts +187 -0
  887. package/modules/math/src/solvers.ts +859 -0
  888. package/modules/math/src/statistics-internal.ts +256 -0
  889. package/modules/math/src/statistics.ts +636 -0
  890. package/modules/math/src/timeseries.ts +611 -0
  891. package/modules/options/dist/american-iv.d.ts +116 -0
  892. package/modules/options/dist/american-iv.d.ts.map +1 -0
  893. package/modules/options/dist/american-iv.js +385 -0
  894. package/modules/options/dist/american-iv.js.map +1 -0
  895. package/modules/options/dist/arbitrage.d.ts +42 -0
  896. package/modules/options/dist/arbitrage.d.ts.map +1 -0
  897. package/modules/options/dist/arbitrage.js +79 -0
  898. package/modules/options/dist/arbitrage.js.map +1 -0
  899. package/modules/options/dist/bachelier.d.ts +68 -0
  900. package/modules/options/dist/bachelier.d.ts.map +1 -0
  901. package/modules/options/dist/bachelier.js +348 -0
  902. package/modules/options/dist/bachelier.js.map +1 -0
  903. package/modules/options/dist/batch.d.ts +82 -0
  904. package/modules/options/dist/batch.d.ts.map +1 -0
  905. package/modules/options/dist/batch.js +346 -0
  906. package/modules/options/dist/batch.js.map +1 -0
  907. package/modules/options/dist/black-scholes.d.ts +42 -0
  908. package/modules/options/dist/black-scholes.d.ts.map +1 -0
  909. package/modules/options/dist/black-scholes.js +334 -0
  910. package/modules/options/dist/black-scholes.js.map +1 -0
  911. package/modules/options/dist/black76.d.ts +77 -0
  912. package/modules/options/dist/black76.d.ts.map +1 -0
  913. package/modules/options/dist/black76.js +400 -0
  914. package/modules/options/dist/black76.js.map +1 -0
  915. package/modules/options/dist/bsm.d.ts +120 -0
  916. package/modules/options/dist/bsm.d.ts.map +1 -0
  917. package/modules/options/dist/bsm.js +414 -0
  918. package/modules/options/dist/bsm.js.map +1 -0
  919. package/modules/options/dist/chain-greeks.d.ts +69 -0
  920. package/modules/options/dist/chain-greeks.d.ts.map +1 -0
  921. package/modules/options/dist/chain-greeks.js +154 -0
  922. package/modules/options/dist/chain-greeks.js.map +1 -0
  923. package/modules/options/dist/chain-health.d.ts +254 -0
  924. package/modules/options/dist/chain-health.d.ts.map +1 -0
  925. package/modules/options/dist/chain-health.js +746 -0
  926. package/modules/options/dist/chain-health.js.map +1 -0
  927. package/modules/options/dist/contract.d.ts +73 -0
  928. package/modules/options/dist/contract.d.ts.map +1 -0
  929. package/modules/options/dist/contract.js +226 -0
  930. package/modules/options/dist/contract.js.map +1 -0
  931. package/modules/options/dist/dividend-term-structure.d.ts +76 -0
  932. package/modules/options/dist/dividend-term-structure.d.ts.map +1 -0
  933. package/modules/options/dist/dividend-term-structure.js +180 -0
  934. package/modules/options/dist/dividend-term-structure.js.map +1 -0
  935. package/modules/options/dist/dividends.d.ts +34 -0
  936. package/modules/options/dist/dividends.d.ts.map +1 -0
  937. package/modules/options/dist/dividends.js +51 -0
  938. package/modules/options/dist/dividends.js.map +1 -0
  939. package/modules/options/dist/engine-bsm.d.ts +22 -0
  940. package/modules/options/dist/engine-bsm.d.ts.map +1 -0
  941. package/modules/options/dist/engine-bsm.js +236 -0
  942. package/modules/options/dist/engine-bsm.js.map +1 -0
  943. package/modules/options/dist/engines/american-approx.d.ts +29 -0
  944. package/modules/options/dist/engines/american-approx.d.ts.map +1 -0
  945. package/modules/options/dist/engines/american-approx.js +483 -0
  946. package/modules/options/dist/engines/american-approx.js.map +1 -0
  947. package/modules/options/dist/engines/bounds.d.ts +49 -0
  948. package/modules/options/dist/engines/bounds.d.ts.map +1 -0
  949. package/modules/options/dist/engines/bounds.js +58 -0
  950. package/modules/options/dist/engines/bounds.js.map +1 -0
  951. package/modules/options/dist/engines/engine-factory.d.ts +92 -0
  952. package/modules/options/dist/engines/engine-factory.d.ts.map +1 -0
  953. package/modules/options/dist/engines/engine-factory.js +372 -0
  954. package/modules/options/dist/engines/engine-factory.js.map +1 -0
  955. package/modules/options/dist/engines/fd-greeks.d.ts +84 -0
  956. package/modules/options/dist/engines/fd-greeks.d.ts.map +1 -0
  957. package/modules/options/dist/engines/fd-greeks.js +343 -0
  958. package/modules/options/dist/engines/fd-greeks.js.map +1 -0
  959. package/modules/options/dist/engines/fdm.d.ts +78 -0
  960. package/modules/options/dist/engines/fdm.d.ts.map +1 -0
  961. package/modules/options/dist/engines/fdm.js +218 -0
  962. package/modules/options/dist/engines/fdm.js.map +1 -0
  963. package/modules/options/dist/engines/scalar-pricing.d.ts +24 -0
  964. package/modules/options/dist/engines/scalar-pricing.d.ts.map +1 -0
  965. package/modules/options/dist/engines/scalar-pricing.js +2 -0
  966. package/modules/options/dist/engines/scalar-pricing.js.map +1 -0
  967. package/modules/options/dist/engines/tree.d.ts +78 -0
  968. package/modules/options/dist/engines/tree.d.ts.map +1 -0
  969. package/modules/options/dist/engines/tree.js +247 -0
  970. package/modules/options/dist/engines/tree.js.map +1 -0
  971. package/modules/options/dist/engines.d.ts +272 -0
  972. package/modules/options/dist/engines.d.ts.map +1 -0
  973. package/modules/options/dist/engines.js +1309 -0
  974. package/modules/options/dist/engines.js.map +1 -0
  975. package/modules/options/dist/equity-lattice.d.ts +58 -0
  976. package/modules/options/dist/equity-lattice.d.ts.map +1 -0
  977. package/modules/options/dist/equity-lattice.js +139 -0
  978. package/modules/options/dist/equity-lattice.js.map +1 -0
  979. package/modules/options/dist/exercise.d.ts +80 -0
  980. package/modules/options/dist/exercise.d.ts.map +1 -0
  981. package/modules/options/dist/exercise.js +266 -0
  982. package/modules/options/dist/exercise.js.map +1 -0
  983. package/modules/options/dist/exotics.d.ts +640 -0
  984. package/modules/options/dist/exotics.d.ts.map +1 -0
  985. package/modules/options/dist/exotics.js +2880 -0
  986. package/modules/options/dist/exotics.js.map +1 -0
  987. package/modules/options/dist/facade-util.d.ts +51 -0
  988. package/modules/options/dist/facade-util.d.ts.map +1 -0
  989. package/modules/options/dist/facade-util.js +93 -0
  990. package/modules/options/dist/facade-util.js.map +1 -0
  991. package/modules/options/dist/generated/validation-specs.d.ts +12 -0
  992. package/modules/options/dist/generated/validation-specs.d.ts.map +1 -0
  993. package/modules/options/dist/generated/validation-specs.js +2616 -0
  994. package/modules/options/dist/generated/validation-specs.js.map +1 -0
  995. package/modules/options/dist/heston.d.ts +160 -0
  996. package/modules/options/dist/heston.d.ts.map +1 -0
  997. package/modules/options/dist/heston.js +983 -0
  998. package/modules/options/dist/heston.js.map +1 -0
  999. package/modules/options/dist/index.d.ts +65 -0
  1000. package/modules/options/dist/index.d.ts.map +1 -0
  1001. package/modules/options/dist/index.js +58 -0
  1002. package/modules/options/dist/index.js.map +1 -0
  1003. package/modules/options/dist/iv.d.ts +85 -0
  1004. package/modules/options/dist/iv.d.ts.map +1 -0
  1005. package/modules/options/dist/iv.js +424 -0
  1006. package/modules/options/dist/iv.js.map +1 -0
  1007. package/modules/options/dist/lattice.d.ts +7 -0
  1008. package/modules/options/dist/lattice.d.ts.map +1 -0
  1009. package/modules/options/dist/lattice.js +7 -0
  1010. package/modules/options/dist/lattice.js.map +1 -0
  1011. package/modules/options/dist/local-volatility.d.ts +128 -0
  1012. package/modules/options/dist/local-volatility.d.ts.map +1 -0
  1013. package/modules/options/dist/local-volatility.js +333 -0
  1014. package/modules/options/dist/local-volatility.js.map +1 -0
  1015. package/modules/options/dist/market.d.ts +19 -0
  1016. package/modules/options/dist/market.d.ts.map +1 -0
  1017. package/modules/options/dist/market.js +58 -0
  1018. package/modules/options/dist/market.js.map +1 -0
  1019. package/modules/options/dist/mc/complex.d.ts +23 -0
  1020. package/modules/options/dist/mc/complex.d.ts.map +1 -0
  1021. package/modules/options/dist/mc/complex.js +42 -0
  1022. package/modules/options/dist/mc/complex.js.map +1 -0
  1023. package/modules/options/dist/mc/core.d.ts +151 -0
  1024. package/modules/options/dist/mc/core.d.ts.map +1 -0
  1025. package/modules/options/dist/mc/core.js +319 -0
  1026. package/modules/options/dist/mc/core.js.map +1 -0
  1027. package/modules/options/dist/monte-carlo.d.ts +66 -0
  1028. package/modules/options/dist/monte-carlo.d.ts.map +1 -0
  1029. package/modules/options/dist/monte-carlo.js +388 -0
  1030. package/modules/options/dist/monte-carlo.js.map +1 -0
  1031. package/modules/options/dist/parity.d.ts +191 -0
  1032. package/modules/options/dist/parity.d.ts.map +1 -0
  1033. package/modules/options/dist/parity.js +566 -0
  1034. package/modules/options/dist/parity.js.map +1 -0
  1035. package/modules/options/dist/payoff-kernel.d.ts +33 -0
  1036. package/modules/options/dist/payoff-kernel.d.ts.map +1 -0
  1037. package/modules/options/dist/payoff-kernel.js +27 -0
  1038. package/modules/options/dist/payoff-kernel.js.map +1 -0
  1039. package/modules/options/dist/payoff.d.ts +34 -0
  1040. package/modules/options/dist/payoff.d.ts.map +1 -0
  1041. package/modules/options/dist/payoff.js +60 -0
  1042. package/modules/options/dist/payoff.js.map +1 -0
  1043. package/modules/options/dist/pricer.d.ts +44 -0
  1044. package/modules/options/dist/pricer.d.ts.map +1 -0
  1045. package/modules/options/dist/pricer.js +179 -0
  1046. package/modules/options/dist/pricer.js.map +1 -0
  1047. package/modules/options/dist/pro.d.ts +82 -0
  1048. package/modules/options/dist/pro.d.ts.map +1 -0
  1049. package/modules/options/dist/pro.js +177 -0
  1050. package/modules/options/dist/pro.js.map +1 -0
  1051. package/modules/options/dist/quote.d.ts +18 -0
  1052. package/modules/options/dist/quote.d.ts.map +1 -0
  1053. package/modules/options/dist/quote.js +26 -0
  1054. package/modules/options/dist/quote.js.map +1 -0
  1055. package/modules/options/dist/resource-validation-internal.d.ts +8 -0
  1056. package/modules/options/dist/resource-validation-internal.d.ts.map +1 -0
  1057. package/modules/options/dist/resource-validation-internal.js +23 -0
  1058. package/modules/options/dist/resource-validation-internal.js.map +1 -0
  1059. package/modules/options/dist/sabr.d.ts +153 -0
  1060. package/modules/options/dist/sabr.d.ts.map +1 -0
  1061. package/modules/options/dist/sabr.js +515 -0
  1062. package/modules/options/dist/sabr.js.map +1 -0
  1063. package/modules/options/dist/schema.d.ts +120 -0
  1064. package/modules/options/dist/schema.d.ts.map +1 -0
  1065. package/modules/options/dist/schema.js +62 -0
  1066. package/modules/options/dist/schema.js.map +1 -0
  1067. package/modules/options/dist/time.d.ts +44 -0
  1068. package/modules/options/dist/time.d.ts.map +1 -0
  1069. package/modules/options/dist/time.js +76 -0
  1070. package/modules/options/dist/time.js.map +1 -0
  1071. package/modules/options/dist/types.d.ts +115 -0
  1072. package/modules/options/dist/types.d.ts.map +1 -0
  1073. package/modules/options/dist/types.js +3 -0
  1074. package/modules/options/dist/types.js.map +1 -0
  1075. package/modules/options/etc/options.api.md +230 -0
  1076. package/modules/options/src/american-iv.ts +547 -0
  1077. package/modules/options/src/arbitrage.ts +134 -0
  1078. package/modules/options/src/bachelier.ts +515 -0
  1079. package/modules/options/src/batch.ts +496 -0
  1080. package/modules/options/src/black-scholes.ts +501 -0
  1081. package/modules/options/src/black76.ts +573 -0
  1082. package/modules/options/src/bsm.ts +575 -0
  1083. package/modules/options/src/chain-greeks.ts +242 -0
  1084. package/modules/options/src/chain-health.ts +1083 -0
  1085. package/modules/options/src/contract.ts +329 -0
  1086. package/modules/options/src/dividend-term-structure.ts +303 -0
  1087. package/modules/options/src/dividends.ts +75 -0
  1088. package/modules/options/src/engine-bsm.ts +306 -0
  1089. package/modules/options/src/engines/american-approx.ts +669 -0
  1090. package/modules/options/src/engines/bounds.ts +106 -0
  1091. package/modules/options/src/engines/engine-factory.ts +502 -0
  1092. package/modules/options/src/engines/fd-greeks.ts +426 -0
  1093. package/modules/options/src/engines/fdm.ts +302 -0
  1094. package/modules/options/src/engines/scalar-pricing.ts +27 -0
  1095. package/modules/options/src/engines/tree.ts +350 -0
  1096. package/modules/options/src/engines.ts +1845 -0
  1097. package/modules/options/src/equity-lattice.ts +224 -0
  1098. package/modules/options/src/exercise.ts +422 -0
  1099. package/modules/options/src/exotics.ts +3966 -0
  1100. package/modules/options/src/facade-util.ts +137 -0
  1101. package/modules/options/src/generated/validation-specs.ts +2621 -0
  1102. package/modules/options/src/heston.ts +1348 -0
  1103. package/modules/options/src/index.ts +325 -0
  1104. package/modules/options/src/iv.ts +591 -0
  1105. package/modules/options/src/lattice.ts +6 -0
  1106. package/modules/options/src/local-volatility.ts +493 -0
  1107. package/modules/options/src/market.ts +74 -0
  1108. package/modules/options/src/mc/complex.ts +55 -0
  1109. package/modules/options/src/mc/core.ts +538 -0
  1110. package/modules/options/src/monte-carlo.ts +567 -0
  1111. package/modules/options/src/parity.ts +928 -0
  1112. package/modules/options/src/payoff-kernel.ts +39 -0
  1113. package/modules/options/src/payoff.ts +81 -0
  1114. package/modules/options/src/pricer.ts +217 -0
  1115. package/modules/options/src/pro.ts +272 -0
  1116. package/modules/options/src/quote.ts +34 -0
  1117. package/modules/options/src/resource-validation-internal.ts +31 -0
  1118. package/modules/options/src/sabr.ts +716 -0
  1119. package/modules/options/src/schema.ts +73 -0
  1120. package/modules/options/src/time.ts +104 -0
  1121. package/modules/options/src/types.ts +124 -0
  1122. package/modules/performance/dist/activity.d.ts +24 -0
  1123. package/modules/performance/dist/activity.d.ts.map +1 -0
  1124. package/modules/performance/dist/activity.js +137 -0
  1125. package/modules/performance/dist/activity.js.map +1 -0
  1126. package/modules/performance/dist/analyze.d.ts +85 -0
  1127. package/modules/performance/dist/analyze.d.ts.map +1 -0
  1128. package/modules/performance/dist/analyze.js +203 -0
  1129. package/modules/performance/dist/analyze.js.map +1 -0
  1130. package/modules/performance/dist/annualization-internal.d.ts +21 -0
  1131. package/modules/performance/dist/annualization-internal.d.ts.map +1 -0
  1132. package/modules/performance/dist/annualization-internal.js +34 -0
  1133. package/modules/performance/dist/annualization-internal.js.map +1 -0
  1134. package/modules/performance/dist/drawdown.d.ts +34 -0
  1135. package/modules/performance/dist/drawdown.d.ts.map +1 -0
  1136. package/modules/performance/dist/drawdown.js +99 -0
  1137. package/modules/performance/dist/drawdown.js.map +1 -0
  1138. package/modules/performance/dist/flow-aware.d.ts +388 -0
  1139. package/modules/performance/dist/flow-aware.d.ts.map +1 -0
  1140. package/modules/performance/dist/flow-aware.js +888 -0
  1141. package/modules/performance/dist/flow-aware.js.map +1 -0
  1142. package/modules/performance/dist/index.d.ts +26 -0
  1143. package/modules/performance/dist/index.d.ts.map +1 -0
  1144. package/modules/performance/dist/index.js +25 -0
  1145. package/modules/performance/dist/index.js.map +1 -0
  1146. package/modules/performance/dist/metrics.d.ts +13 -0
  1147. package/modules/performance/dist/metrics.d.ts.map +1 -0
  1148. package/modules/performance/dist/metrics.js +87 -0
  1149. package/modules/performance/dist/metrics.js.map +1 -0
  1150. package/modules/performance/dist/ratios.d.ts +55 -0
  1151. package/modules/performance/dist/ratios.d.ts.map +1 -0
  1152. package/modules/performance/dist/ratios.js +168 -0
  1153. package/modules/performance/dist/ratios.js.map +1 -0
  1154. package/modules/performance/dist/relative.d.ts +33 -0
  1155. package/modules/performance/dist/relative.d.ts.map +1 -0
  1156. package/modules/performance/dist/relative.js +150 -0
  1157. package/modules/performance/dist/relative.js.map +1 -0
  1158. package/modules/performance/dist/returns.d.ts +18 -0
  1159. package/modules/performance/dist/returns.d.ts.map +1 -0
  1160. package/modules/performance/dist/returns.js +70 -0
  1161. package/modules/performance/dist/returns.js.map +1 -0
  1162. package/modules/performance/dist/rolling.d.ts +36 -0
  1163. package/modules/performance/dist/rolling.d.ts.map +1 -0
  1164. package/modules/performance/dist/rolling.js +102 -0
  1165. package/modules/performance/dist/rolling.js.map +1 -0
  1166. package/modules/performance/dist/sector-performance-internal.d.ts +61 -0
  1167. package/modules/performance/dist/sector-performance-internal.d.ts.map +1 -0
  1168. package/modules/performance/dist/sector-performance-internal.js +216 -0
  1169. package/modules/performance/dist/sector-performance-internal.js.map +1 -0
  1170. package/modules/performance/dist/sector-performance.d.ts +288 -0
  1171. package/modules/performance/dist/sector-performance.d.ts.map +1 -0
  1172. package/modules/performance/dist/sector-performance.js +690 -0
  1173. package/modules/performance/dist/sector-performance.js.map +1 -0
  1174. package/modules/performance/dist/sharpe.d.ts +74 -0
  1175. package/modules/performance/dist/sharpe.d.ts.map +1 -0
  1176. package/modules/performance/dist/sharpe.js +157 -0
  1177. package/modules/performance/dist/sharpe.js.map +1 -0
  1178. package/modules/performance/etc/performance.api.md +109 -0
  1179. package/modules/performance/src/activity.ts +182 -0
  1180. package/modules/performance/src/analyze.ts +305 -0
  1181. package/modules/performance/src/annualization-internal.ts +43 -0
  1182. package/modules/performance/src/drawdown.ts +132 -0
  1183. package/modules/performance/src/flow-aware.ts +1518 -0
  1184. package/modules/performance/src/index.ts +89 -0
  1185. package/modules/performance/src/metrics.ts +150 -0
  1186. package/modules/performance/src/ratios.ts +243 -0
  1187. package/modules/performance/src/relative.ts +278 -0
  1188. package/modules/performance/src/returns.ts +80 -0
  1189. package/modules/performance/src/rolling.ts +155 -0
  1190. package/modules/performance/src/sector-performance-internal.ts +293 -0
  1191. package/modules/performance/src/sector-performance.ts +1263 -0
  1192. package/modules/performance/src/sharpe.ts +256 -0
  1193. package/modules/portfolio/dist/allocation.d.ts +227 -0
  1194. package/modules/portfolio/dist/allocation.d.ts.map +1 -0
  1195. package/modules/portfolio/dist/allocation.js +545 -0
  1196. package/modules/portfolio/dist/allocation.js.map +1 -0
  1197. package/modules/portfolio/dist/events.d.ts +502 -0
  1198. package/modules/portfolio/dist/events.d.ts.map +1 -0
  1199. package/modules/portfolio/dist/events.js +1061 -0
  1200. package/modules/portfolio/dist/events.js.map +1 -0
  1201. package/modules/portfolio/dist/index.d.ts +47 -0
  1202. package/modules/portfolio/dist/index.d.ts.map +1 -0
  1203. package/modules/portfolio/dist/index.js +34 -0
  1204. package/modules/portfolio/dist/index.js.map +1 -0
  1205. package/modules/portfolio/dist/internal.d.ts +101 -0
  1206. package/modules/portfolio/dist/internal.d.ts.map +1 -0
  1207. package/modules/portfolio/dist/internal.js +356 -0
  1208. package/modules/portfolio/dist/internal.js.map +1 -0
  1209. package/modules/portfolio/dist/ledger.d.ts +129 -0
  1210. package/modules/portfolio/dist/ledger.d.ts.map +1 -0
  1211. package/modules/portfolio/dist/ledger.js +271 -0
  1212. package/modules/portfolio/dist/ledger.js.map +1 -0
  1213. package/modules/portfolio/dist/lifecycle-corporate.d.ts +49 -0
  1214. package/modules/portfolio/dist/lifecycle-corporate.d.ts.map +1 -0
  1215. package/modules/portfolio/dist/lifecycle-corporate.js +462 -0
  1216. package/modules/portfolio/dist/lifecycle-corporate.js.map +1 -0
  1217. package/modules/portfolio/dist/lifecycle-derivatives.d.ts +59 -0
  1218. package/modules/portfolio/dist/lifecycle-derivatives.d.ts.map +1 -0
  1219. package/modules/portfolio/dist/lifecycle-derivatives.js +422 -0
  1220. package/modules/portfolio/dist/lifecycle-derivatives.js.map +1 -0
  1221. package/modules/portfolio/dist/marks.d.ts +44 -0
  1222. package/modules/portfolio/dist/marks.d.ts.map +1 -0
  1223. package/modules/portfolio/dist/marks.js +81 -0
  1224. package/modules/portfolio/dist/marks.js.map +1 -0
  1225. package/modules/portfolio/dist/monitor.d.ts +222 -0
  1226. package/modules/portfolio/dist/monitor.d.ts.map +1 -0
  1227. package/modules/portfolio/dist/monitor.js +1806 -0
  1228. package/modules/portfolio/dist/monitor.js.map +1 -0
  1229. package/modules/portfolio/dist/performance.d.ts +78 -0
  1230. package/modules/portfolio/dist/performance.d.ts.map +1 -0
  1231. package/modules/portfolio/dist/performance.js +146 -0
  1232. package/modules/portfolio/dist/performance.js.map +1 -0
  1233. package/modules/portfolio/dist/pnl.d.ts +154 -0
  1234. package/modules/portfolio/dist/pnl.d.ts.map +1 -0
  1235. package/modules/portfolio/dist/pnl.js +548 -0
  1236. package/modules/portfolio/dist/pnl.js.map +1 -0
  1237. package/modules/portfolio/dist/policy-grammar.d.ts +358 -0
  1238. package/modules/portfolio/dist/policy-grammar.d.ts.map +1 -0
  1239. package/modules/portfolio/dist/policy-grammar.js +1198 -0
  1240. package/modules/portfolio/dist/policy-grammar.js.map +1 -0
  1241. package/modules/portfolio/dist/policy.d.ts +24 -0
  1242. package/modules/portfolio/dist/policy.d.ts.map +1 -0
  1243. package/modules/portfolio/dist/policy.js +20 -0
  1244. package/modules/portfolio/dist/policy.js.map +1 -0
  1245. package/modules/portfolio/dist/rebalance.d.ts +281 -0
  1246. package/modules/portfolio/dist/rebalance.d.ts.map +1 -0
  1247. package/modules/portfolio/dist/rebalance.js +1236 -0
  1248. package/modules/portfolio/dist/rebalance.js.map +1 -0
  1249. package/modules/portfolio/dist/reconciliation.d.ts +150 -0
  1250. package/modules/portfolio/dist/reconciliation.d.ts.map +1 -0
  1251. package/modules/portfolio/dist/reconciliation.js +392 -0
  1252. package/modules/portfolio/dist/reconciliation.js.map +1 -0
  1253. package/modules/portfolio/dist/reducer-kernel.d.ts +92 -0
  1254. package/modules/portfolio/dist/reducer-kernel.d.ts.map +1 -0
  1255. package/modules/portfolio/dist/reducer-kernel.js +320 -0
  1256. package/modules/portfolio/dist/reducer-kernel.js.map +1 -0
  1257. package/modules/portfolio/dist/snapshot.d.ts +128 -0
  1258. package/modules/portfolio/dist/snapshot.d.ts.map +1 -0
  1259. package/modules/portfolio/dist/snapshot.js +205 -0
  1260. package/modules/portfolio/dist/snapshot.js.map +1 -0
  1261. package/modules/portfolio/dist/state.d.ts +196 -0
  1262. package/modules/portfolio/dist/state.d.ts.map +1 -0
  1263. package/modules/portfolio/dist/state.js +1093 -0
  1264. package/modules/portfolio/dist/state.js.map +1 -0
  1265. package/modules/portfolio/dist/timeline.d.ts +107 -0
  1266. package/modules/portfolio/dist/timeline.d.ts.map +1 -0
  1267. package/modules/portfolio/dist/timeline.js +220 -0
  1268. package/modules/portfolio/dist/timeline.js.map +1 -0
  1269. package/modules/portfolio/dist/trade/grant.d.ts +21 -0
  1270. package/modules/portfolio/dist/trade/grant.d.ts.map +1 -0
  1271. package/modules/portfolio/dist/trade/grant.js +411 -0
  1272. package/modules/portfolio/dist/trade/grant.js.map +1 -0
  1273. package/modules/portfolio/dist/trade/index.d.ts +20 -0
  1274. package/modules/portfolio/dist/trade/index.d.ts.map +1 -0
  1275. package/modules/portfolio/dist/trade/index.js +17 -0
  1276. package/modules/portfolio/dist/trade/index.js.map +1 -0
  1277. package/modules/portfolio/dist/trade/journal.d.ts +23 -0
  1278. package/modules/portfolio/dist/trade/journal.d.ts.map +1 -0
  1279. package/modules/portfolio/dist/trade/journal.js +352 -0
  1280. package/modules/portfolio/dist/trade/journal.js.map +1 -0
  1281. package/modules/portfolio/dist/trade/plan.d.ts +25 -0
  1282. package/modules/portfolio/dist/trade/plan.d.ts.map +1 -0
  1283. package/modules/portfolio/dist/trade/plan.js +285 -0
  1284. package/modules/portfolio/dist/trade/plan.js.map +1 -0
  1285. package/modules/portfolio/dist/trade/policy.d.ts +5 -0
  1286. package/modules/portfolio/dist/trade/policy.d.ts.map +1 -0
  1287. package/modules/portfolio/dist/trade/policy.js +133 -0
  1288. package/modules/portfolio/dist/trade/policy.js.map +1 -0
  1289. package/modules/portfolio/dist/trade/preflight.d.ts +3 -0
  1290. package/modules/portfolio/dist/trade/preflight.d.ts.map +1 -0
  1291. package/modules/portfolio/dist/trade/preflight.js +381 -0
  1292. package/modules/portfolio/dist/trade/preflight.js.map +1 -0
  1293. package/modules/portfolio/dist/trade/reconcile.d.ts +8 -0
  1294. package/modules/portfolio/dist/trade/reconcile.d.ts.map +1 -0
  1295. package/modules/portfolio/dist/trade/reconcile.js +240 -0
  1296. package/modules/portfolio/dist/trade/reconcile.js.map +1 -0
  1297. package/modules/portfolio/dist/trade/types.d.ts +559 -0
  1298. package/modules/portfolio/dist/trade/types.d.ts.map +1 -0
  1299. package/modules/portfolio/dist/trade/types.js +36 -0
  1300. package/modules/portfolio/dist/trade/types.js.map +1 -0
  1301. package/modules/portfolio/dist/trade/validate.d.ts +36 -0
  1302. package/modules/portfolio/dist/trade/validate.d.ts.map +1 -0
  1303. package/modules/portfolio/dist/trade/validate.js +776 -0
  1304. package/modules/portfolio/dist/trade/validate.js.map +1 -0
  1305. package/modules/portfolio/etc/portfolio.api.md +236 -0
  1306. package/modules/portfolio/src/allocation.ts +844 -0
  1307. package/modules/portfolio/src/events.ts +1968 -0
  1308. package/modules/portfolio/src/index.ts +295 -0
  1309. package/modules/portfolio/src/internal.ts +523 -0
  1310. package/modules/portfolio/src/ledger.ts +420 -0
  1311. package/modules/portfolio/src/lifecycle-corporate.ts +888 -0
  1312. package/modules/portfolio/src/lifecycle-derivatives.ts +735 -0
  1313. package/modules/portfolio/src/marks.ts +140 -0
  1314. package/modules/portfolio/src/monitor.ts +2421 -0
  1315. package/modules/portfolio/src/performance.ts +237 -0
  1316. package/modules/portfolio/src/pnl.ts +840 -0
  1317. package/modules/portfolio/src/policy-grammar.ts +1891 -0
  1318. package/modules/portfolio/src/policy.ts +119 -0
  1319. package/modules/portfolio/src/rebalance.ts +1742 -0
  1320. package/modules/portfolio/src/reconciliation.ts +621 -0
  1321. package/modules/portfolio/src/reducer-kernel.ts +512 -0
  1322. package/modules/portfolio/src/snapshot.ts +372 -0
  1323. package/modules/portfolio/src/state.ts +1776 -0
  1324. package/modules/portfolio/src/timeline.ts +359 -0
  1325. package/modules/portfolio/src/trade/grant.ts +514 -0
  1326. package/modules/portfolio/src/trade/index.ts +96 -0
  1327. package/modules/portfolio/src/trade/journal.ts +432 -0
  1328. package/modules/portfolio/src/trade/plan.ts +424 -0
  1329. package/modules/portfolio/src/trade/policy.ts +153 -0
  1330. package/modules/portfolio/src/trade/preflight.ts +605 -0
  1331. package/modules/portfolio/src/trade/reconcile.ts +276 -0
  1332. package/modules/portfolio/src/trade/types.ts +637 -0
  1333. package/modules/portfolio/src/trade/validate.ts +1213 -0
  1334. package/modules/research/dist/artifacts.d.ts +25 -0
  1335. package/modules/research/dist/artifacts.d.ts.map +1 -0
  1336. package/modules/research/dist/artifacts.js +22 -0
  1337. package/modules/research/dist/artifacts.js.map +1 -0
  1338. package/modules/research/dist/events.d.ts +238 -0
  1339. package/modules/research/dist/events.d.ts.map +1 -0
  1340. package/modules/research/dist/events.js +844 -0
  1341. package/modules/research/dist/events.js.map +1 -0
  1342. package/modules/research/dist/factors.d.ts +330 -0
  1343. package/modules/research/dist/factors.d.ts.map +1 -0
  1344. package/modules/research/dist/factors.js +891 -0
  1345. package/modules/research/dist/factors.js.map +1 -0
  1346. package/modules/research/dist/index.d.ts +11 -0
  1347. package/modules/research/dist/index.d.ts.map +1 -0
  1348. package/modules/research/dist/index.js +13 -0
  1349. package/modules/research/dist/index.js.map +1 -0
  1350. package/modules/research/dist/observations.d.ts +77 -0
  1351. package/modules/research/dist/observations.d.ts.map +1 -0
  1352. package/modules/research/dist/observations.js +201 -0
  1353. package/modules/research/dist/observations.js.map +1 -0
  1354. package/modules/research/dist/point-in-time.d.ts +17 -0
  1355. package/modules/research/dist/point-in-time.d.ts.map +1 -0
  1356. package/modules/research/dist/point-in-time.js +34 -0
  1357. package/modules/research/dist/point-in-time.js.map +1 -0
  1358. package/modules/research/dist/research-hygiene.d.ts +126 -0
  1359. package/modules/research/dist/research-hygiene.d.ts.map +1 -0
  1360. package/modules/research/dist/research-hygiene.js +290 -0
  1361. package/modules/research/dist/research-hygiene.js.map +1 -0
  1362. package/modules/research/dist/research-run-artifacts.d.ts +315 -0
  1363. package/modules/research/dist/research-run-artifacts.d.ts.map +1 -0
  1364. package/modules/research/dist/research-run-artifacts.js +766 -0
  1365. package/modules/research/dist/research-run-artifacts.js.map +1 -0
  1366. package/modules/research/dist/research-run-kinds.d.ts +135 -0
  1367. package/modules/research/dist/research-run-kinds.d.ts.map +1 -0
  1368. package/modules/research/dist/research-run-kinds.js +470 -0
  1369. package/modules/research/dist/research-run-kinds.js.map +1 -0
  1370. package/modules/research/dist/screening.d.ts +215 -0
  1371. package/modules/research/dist/screening.d.ts.map +1 -0
  1372. package/modules/research/dist/screening.js +616 -0
  1373. package/modules/research/dist/screening.js.map +1 -0
  1374. package/modules/research/dist/universe.d.ts +131 -0
  1375. package/modules/research/dist/universe.d.ts.map +1 -0
  1376. package/modules/research/dist/universe.js +294 -0
  1377. package/modules/research/dist/universe.js.map +1 -0
  1378. package/modules/research/etc/research.api.md +109 -0
  1379. package/modules/research/src/artifacts.ts +68 -0
  1380. package/modules/research/src/events.ts +1358 -0
  1381. package/modules/research/src/factors.ts +1322 -0
  1382. package/modules/research/src/index.ts +28 -0
  1383. package/modules/research/src/observations.ts +360 -0
  1384. package/modules/research/src/point-in-time.ts +44 -0
  1385. package/modules/research/src/research-hygiene.ts +544 -0
  1386. package/modules/research/src/research-run-artifacts.ts +1464 -0
  1387. package/modules/research/src/research-run-kinds.ts +723 -0
  1388. package/modules/research/src/screening.ts +957 -0
  1389. package/modules/research/src/universe.ts +494 -0
  1390. package/modules/risk/dist/attribution.d.ts +166 -0
  1391. package/modules/risk/dist/attribution.d.ts.map +1 -0
  1392. package/modules/risk/dist/attribution.js +278 -0
  1393. package/modules/risk/dist/attribution.js.map +1 -0
  1394. package/modules/risk/dist/book-var.d.ts +113 -0
  1395. package/modules/risk/dist/book-var.d.ts.map +1 -0
  1396. package/modules/risk/dist/book-var.js +487 -0
  1397. package/modules/risk/dist/book-var.js.map +1 -0
  1398. package/modules/risk/dist/book.d.ts +95 -0
  1399. package/modules/risk/dist/book.d.ts.map +1 -0
  1400. package/modules/risk/dist/book.js +201 -0
  1401. package/modules/risk/dist/book.js.map +1 -0
  1402. package/modules/risk/dist/covariance.d.ts +96 -0
  1403. package/modules/risk/dist/covariance.d.ts.map +1 -0
  1404. package/modules/risk/dist/covariance.js +183 -0
  1405. package/modules/risk/dist/covariance.js.map +1 -0
  1406. package/modules/risk/dist/evt.d.ts +188 -0
  1407. package/modules/risk/dist/evt.d.ts.map +1 -0
  1408. package/modules/risk/dist/evt.js +625 -0
  1409. package/modules/risk/dist/evt.js.map +1 -0
  1410. package/modules/risk/dist/expected-returns.d.ts +139 -0
  1411. package/modules/risk/dist/expected-returns.d.ts.map +1 -0
  1412. package/modules/risk/dist/expected-returns.js +350 -0
  1413. package/modules/risk/dist/expected-returns.js.map +1 -0
  1414. package/modules/risk/dist/factor.d.ts +66 -0
  1415. package/modules/risk/dist/factor.d.ts.map +1 -0
  1416. package/modules/risk/dist/factor.js +133 -0
  1417. package/modules/risk/dist/factor.js.map +1 -0
  1418. package/modules/risk/dist/frontier.d.ts +158 -0
  1419. package/modules/risk/dist/frontier.d.ts.map +1 -0
  1420. package/modules/risk/dist/frontier.js +1183 -0
  1421. package/modules/risk/dist/frontier.js.map +1 -0
  1422. package/modules/risk/dist/index.d.ts +47 -0
  1423. package/modules/risk/dist/index.d.ts.map +1 -0
  1424. package/modules/risk/dist/index.js +43 -0
  1425. package/modules/risk/dist/index.js.map +1 -0
  1426. package/modules/risk/dist/input-description.d.ts +3 -0
  1427. package/modules/risk/dist/input-description.d.ts.map +1 -0
  1428. package/modules/risk/dist/input-description.js +24 -0
  1429. package/modules/risk/dist/input-description.js.map +1 -0
  1430. package/modules/risk/dist/kelly.d.ts +217 -0
  1431. package/modules/risk/dist/kelly.d.ts.map +1 -0
  1432. package/modules/risk/dist/kelly.js +731 -0
  1433. package/modules/risk/dist/kelly.js.map +1 -0
  1434. package/modules/risk/dist/linalg.d.ts +27 -0
  1435. package/modules/risk/dist/linalg.d.ts.map +1 -0
  1436. package/modules/risk/dist/linalg.js +89 -0
  1437. package/modules/risk/dist/linalg.js.map +1 -0
  1438. package/modules/risk/dist/numeric-vector.d.ts +9 -0
  1439. package/modules/risk/dist/numeric-vector.d.ts.map +1 -0
  1440. package/modules/risk/dist/numeric-vector.js +112 -0
  1441. package/modules/risk/dist/numeric-vector.js.map +1 -0
  1442. package/modules/risk/dist/optimize.d.ts +231 -0
  1443. package/modules/risk/dist/optimize.d.ts.map +1 -0
  1444. package/modules/risk/dist/optimize.js +1258 -0
  1445. package/modules/risk/dist/optimize.js.map +1 -0
  1446. package/modules/risk/dist/optimizer-validation.d.ts +26 -0
  1447. package/modules/risk/dist/optimizer-validation.d.ts.map +1 -0
  1448. package/modules/risk/dist/optimizer-validation.js +306 -0
  1449. package/modules/risk/dist/optimizer-validation.js.map +1 -0
  1450. package/modules/risk/dist/options-internal.d.ts +18 -0
  1451. package/modules/risk/dist/options-internal.d.ts.map +1 -0
  1452. package/modules/risk/dist/options-internal.js +49 -0
  1453. package/modules/risk/dist/options-internal.js.map +1 -0
  1454. package/modules/risk/dist/pnl-explain.d.ts +169 -0
  1455. package/modules/risk/dist/pnl-explain.d.ts.map +1 -0
  1456. package/modules/risk/dist/pnl-explain.js +327 -0
  1457. package/modules/risk/dist/pnl-explain.js.map +1 -0
  1458. package/modules/risk/dist/portfolio.d.ts +322 -0
  1459. package/modules/risk/dist/portfolio.d.ts.map +1 -0
  1460. package/modules/risk/dist/portfolio.js +547 -0
  1461. package/modules/risk/dist/portfolio.js.map +1 -0
  1462. package/modules/risk/dist/research-protocol.d.ts +74 -0
  1463. package/modules/risk/dist/research-protocol.d.ts.map +1 -0
  1464. package/modules/risk/dist/research-protocol.js +193 -0
  1465. package/modules/risk/dist/research-protocol.js.map +1 -0
  1466. package/modules/risk/dist/research.d.ts +255 -0
  1467. package/modules/risk/dist/research.d.ts.map +1 -0
  1468. package/modules/risk/dist/research.js +752 -0
  1469. package/modules/risk/dist/research.js.map +1 -0
  1470. package/modules/risk/dist/scenario.d.ts +279 -0
  1471. package/modules/risk/dist/scenario.d.ts.map +1 -0
  1472. package/modules/risk/dist/scenario.js +458 -0
  1473. package/modules/risk/dist/scenario.js.map +1 -0
  1474. package/modules/risk/dist/sizing.d.ts +14 -0
  1475. package/modules/risk/dist/sizing.d.ts.map +1 -0
  1476. package/modules/risk/dist/sizing.js +12 -0
  1477. package/modules/risk/dist/sizing.js.map +1 -0
  1478. package/modules/risk/dist/strategy-shape.d.ts +84 -0
  1479. package/modules/risk/dist/strategy-shape.d.ts.map +1 -0
  1480. package/modules/risk/dist/strategy-shape.js +17 -0
  1481. package/modules/risk/dist/strategy-shape.js.map +1 -0
  1482. package/modules/risk/dist/value-at-risk.d.ts +240 -0
  1483. package/modules/risk/dist/value-at-risk.d.ts.map +1 -0
  1484. package/modules/risk/dist/value-at-risk.js +743 -0
  1485. package/modules/risk/dist/value-at-risk.js.map +1 -0
  1486. package/modules/risk/etc/risk.api.md +228 -0
  1487. package/modules/risk/src/attribution.ts +480 -0
  1488. package/modules/risk/src/book-var.ts +717 -0
  1489. package/modules/risk/src/book.ts +327 -0
  1490. package/modules/risk/src/covariance.ts +293 -0
  1491. package/modules/risk/src/evt.ts +899 -0
  1492. package/modules/risk/src/expected-returns.ts +572 -0
  1493. package/modules/risk/src/factor.ts +199 -0
  1494. package/modules/risk/src/frontier.ts +1570 -0
  1495. package/modules/risk/src/index.ts +281 -0
  1496. package/modules/risk/src/input-description.ts +15 -0
  1497. package/modules/risk/src/kelly.ts +1119 -0
  1498. package/modules/risk/src/linalg.ts +100 -0
  1499. package/modules/risk/src/numeric-vector.ts +153 -0
  1500. package/modules/risk/src/optimize.ts +1769 -0
  1501. package/modules/risk/src/optimizer-validation.ts +467 -0
  1502. package/modules/risk/src/options-internal.ts +73 -0
  1503. package/modules/risk/src/pnl-explain.ts +544 -0
  1504. package/modules/risk/src/portfolio.ts +911 -0
  1505. package/modules/risk/src/research-protocol.ts +277 -0
  1506. package/modules/risk/src/research.ts +1076 -0
  1507. package/modules/risk/src/scenario.ts +728 -0
  1508. package/modules/risk/src/sizing.ts +15 -0
  1509. package/modules/risk/src/strategy-shape.ts +90 -0
  1510. package/modules/risk/src/value-at-risk.ts +1102 -0
  1511. package/modules/scenarios/dist/aggregates.d.ts +27 -0
  1512. package/modules/scenarios/dist/aggregates.d.ts.map +1 -0
  1513. package/modules/scenarios/dist/aggregates.js +262 -0
  1514. package/modules/scenarios/dist/aggregates.js.map +1 -0
  1515. package/modules/scenarios/dist/fx.d.ts +69 -0
  1516. package/modules/scenarios/dist/fx.d.ts.map +1 -0
  1517. package/modules/scenarios/dist/fx.js +349 -0
  1518. package/modules/scenarios/dist/fx.js.map +1 -0
  1519. package/modules/scenarios/dist/index.d.ts +6 -0
  1520. package/modules/scenarios/dist/index.d.ts.map +1 -0
  1521. package/modules/scenarios/dist/index.js +6 -0
  1522. package/modules/scenarios/dist/index.js.map +1 -0
  1523. package/modules/scenarios/dist/internal/behaviors.d.ts +28 -0
  1524. package/modules/scenarios/dist/internal/behaviors.d.ts.map +1 -0
  1525. package/modules/scenarios/dist/internal/behaviors.js +169 -0
  1526. package/modules/scenarios/dist/internal/behaviors.js.map +1 -0
  1527. package/modules/scenarios/dist/internal/data.d.ts +35 -0
  1528. package/modules/scenarios/dist/internal/data.d.ts.map +1 -0
  1529. package/modules/scenarios/dist/internal/data.js +194 -0
  1530. package/modules/scenarios/dist/internal/data.js.map +1 -0
  1531. package/modules/scenarios/dist/internal/failures.d.ts +18 -0
  1532. package/modules/scenarios/dist/internal/failures.d.ts.map +1 -0
  1533. package/modules/scenarios/dist/internal/failures.js +184 -0
  1534. package/modules/scenarios/dist/internal/failures.js.map +1 -0
  1535. package/modules/scenarios/dist/internal/results.d.ts +18 -0
  1536. package/modules/scenarios/dist/internal/results.d.ts.map +1 -0
  1537. package/modules/scenarios/dist/internal/results.js +100 -0
  1538. package/modules/scenarios/dist/internal/results.js.map +1 -0
  1539. package/modules/scenarios/dist/market-resolution.d.ts +32 -0
  1540. package/modules/scenarios/dist/market-resolution.d.ts.map +1 -0
  1541. package/modules/scenarios/dist/market-resolution.js +296 -0
  1542. package/modules/scenarios/dist/market-resolution.js.map +1 -0
  1543. package/modules/scenarios/dist/portfolio.d.ts +11 -0
  1544. package/modules/scenarios/dist/portfolio.d.ts.map +1 -0
  1545. package/modules/scenarios/dist/portfolio.js +419 -0
  1546. package/modules/scenarios/dist/portfolio.js.map +1 -0
  1547. package/modules/scenarios/dist/run.d.ts +4 -0
  1548. package/modules/scenarios/dist/run.d.ts.map +1 -0
  1549. package/modules/scenarios/dist/run.js +933 -0
  1550. package/modules/scenarios/dist/run.js.map +1 -0
  1551. package/modules/scenarios/dist/spot-pricer.d.ts +21 -0
  1552. package/modules/scenarios/dist/spot-pricer.d.ts.map +1 -0
  1553. package/modules/scenarios/dist/spot-pricer.js +97 -0
  1554. package/modules/scenarios/dist/spot-pricer.js.map +1 -0
  1555. package/modules/scenarios/dist/targets.d.ts +18 -0
  1556. package/modules/scenarios/dist/targets.d.ts.map +1 -0
  1557. package/modules/scenarios/dist/targets.js +507 -0
  1558. package/modules/scenarios/dist/targets.js.map +1 -0
  1559. package/modules/scenarios/dist/taylor.d.ts +23 -0
  1560. package/modules/scenarios/dist/taylor.d.ts.map +1 -0
  1561. package/modules/scenarios/dist/taylor.js +209 -0
  1562. package/modules/scenarios/dist/taylor.js.map +1 -0
  1563. package/modules/scenarios/dist/transform.d.ts +31 -0
  1564. package/modules/scenarios/dist/transform.d.ts.map +1 -0
  1565. package/modules/scenarios/dist/transform.js +318 -0
  1566. package/modules/scenarios/dist/transform.js.map +1 -0
  1567. package/modules/scenarios/dist/types.d.ts +591 -0
  1568. package/modules/scenarios/dist/types.d.ts.map +1 -0
  1569. package/modules/scenarios/dist/types.js +2 -0
  1570. package/modules/scenarios/dist/types.js.map +1 -0
  1571. package/modules/scenarios/dist/work.d.ts +85 -0
  1572. package/modules/scenarios/dist/work.d.ts.map +1 -0
  1573. package/modules/scenarios/dist/work.js +629 -0
  1574. package/modules/scenarios/dist/work.js.map +1 -0
  1575. package/modules/scenarios/etc/scenarios.api.md +76 -0
  1576. package/modules/scenarios/src/aggregates.ts +429 -0
  1577. package/modules/scenarios/src/fx.ts +563 -0
  1578. package/modules/scenarios/src/index.ts +5 -0
  1579. package/modules/scenarios/src/internal/behaviors.ts +249 -0
  1580. package/modules/scenarios/src/internal/data.ts +258 -0
  1581. package/modules/scenarios/src/internal/failures.ts +219 -0
  1582. package/modules/scenarios/src/internal/results.ts +131 -0
  1583. package/modules/scenarios/src/market-resolution.ts +436 -0
  1584. package/modules/scenarios/src/portfolio.ts +639 -0
  1585. package/modules/scenarios/src/run.ts +1417 -0
  1586. package/modules/scenarios/src/spot-pricer.ts +129 -0
  1587. package/modules/scenarios/src/targets.ts +729 -0
  1588. package/modules/scenarios/src/taylor.ts +287 -0
  1589. package/modules/scenarios/src/transform.ts +468 -0
  1590. package/modules/scenarios/src/types.ts +713 -0
  1591. package/modules/scenarios/src/work.ts +1055 -0
  1592. package/modules/strategy/dist/auto-range.d.ts +14 -0
  1593. package/modules/strategy/dist/auto-range.d.ts.map +1 -0
  1594. package/modules/strategy/dist/auto-range.js +19 -0
  1595. package/modules/strategy/dist/auto-range.js.map +1 -0
  1596. package/modules/strategy/dist/builders.d.ts +75 -0
  1597. package/modules/strategy/dist/builders.d.ts.map +1 -0
  1598. package/modules/strategy/dist/builders.js +112 -0
  1599. package/modules/strategy/dist/builders.js.map +1 -0
  1600. package/modules/strategy/dist/calendars.d.ts +70 -0
  1601. package/modules/strategy/dist/calendars.d.ts.map +1 -0
  1602. package/modules/strategy/dist/calendars.js +149 -0
  1603. package/modules/strategy/dist/calendars.js.map +1 -0
  1604. package/modules/strategy/dist/classify.d.ts +77 -0
  1605. package/modules/strategy/dist/classify.d.ts.map +1 -0
  1606. package/modules/strategy/dist/classify.js +144 -0
  1607. package/modules/strategy/dist/classify.js.map +1 -0
  1608. package/modules/strategy/dist/explain.d.ts +77 -0
  1609. package/modules/strategy/dist/explain.d.ts.map +1 -0
  1610. package/modules/strategy/dist/explain.js +300 -0
  1611. package/modules/strategy/dist/explain.js.map +1 -0
  1612. package/modules/strategy/dist/from-chain.d.ts +88 -0
  1613. package/modules/strategy/dist/from-chain.d.ts.map +1 -0
  1614. package/modules/strategy/dist/from-chain.js +457 -0
  1615. package/modules/strategy/dist/from-chain.js.map +1 -0
  1616. package/modules/strategy/dist/index.d.ts +102 -0
  1617. package/modules/strategy/dist/index.d.ts.map +1 -0
  1618. package/modules/strategy/dist/index.js +41 -0
  1619. package/modules/strategy/dist/index.js.map +1 -0
  1620. package/modules/strategy/dist/legs.d.ts +47 -0
  1621. package/modules/strategy/dist/legs.d.ts.map +1 -0
  1622. package/modules/strategy/dist/legs.js +87 -0
  1623. package/modules/strategy/dist/legs.js.map +1 -0
  1624. package/modules/strategy/dist/manifest.d.ts +116 -0
  1625. package/modules/strategy/dist/manifest.d.ts.map +1 -0
  1626. package/modules/strategy/dist/manifest.js +376 -0
  1627. package/modules/strategy/dist/manifest.js.map +1 -0
  1628. package/modules/strategy/dist/optimizer.d.ts +184 -0
  1629. package/modules/strategy/dist/optimizer.d.ts.map +1 -0
  1630. package/modules/strategy/dist/optimizer.js +404 -0
  1631. package/modules/strategy/dist/optimizer.js.map +1 -0
  1632. package/modules/strategy/dist/position.d.ts +181 -0
  1633. package/modules/strategy/dist/position.d.ts.map +1 -0
  1634. package/modules/strategy/dist/position.js +1693 -0
  1635. package/modules/strategy/dist/position.js.map +1 -0
  1636. package/modules/strategy/dist/probability.d.ts +192 -0
  1637. package/modules/strategy/dist/probability.d.ts.map +1 -0
  1638. package/modules/strategy/dist/probability.js +106 -0
  1639. package/modules/strategy/dist/probability.js.map +1 -0
  1640. package/modules/strategy/dist/scanner.d.ts +147 -0
  1641. package/modules/strategy/dist/scanner.d.ts.map +1 -0
  1642. package/modules/strategy/dist/scanner.js +438 -0
  1643. package/modules/strategy/dist/scanner.js.map +1 -0
  1644. package/modules/strategy/dist/strategies.d.ts +187 -0
  1645. package/modules/strategy/dist/strategies.d.ts.map +1 -0
  1646. package/modules/strategy/dist/strategies.js +541 -0
  1647. package/modules/strategy/dist/strategies.js.map +1 -0
  1648. package/modules/strategy/dist/svg.d.ts +35 -0
  1649. package/modules/strategy/dist/svg.d.ts.map +1 -0
  1650. package/modules/strategy/dist/svg.js +298 -0
  1651. package/modules/strategy/dist/svg.js.map +1 -0
  1652. package/modules/strategy/dist/thesis-distribution.d.ts +79 -0
  1653. package/modules/strategy/dist/thesis-distribution.d.ts.map +1 -0
  1654. package/modules/strategy/dist/thesis-distribution.js +125 -0
  1655. package/modules/strategy/dist/thesis-distribution.js.map +1 -0
  1656. package/modules/strategy/dist/types.d.ts +370 -0
  1657. package/modules/strategy/dist/types.d.ts.map +1 -0
  1658. package/modules/strategy/dist/types.js +8 -0
  1659. package/modules/strategy/dist/types.js.map +1 -0
  1660. package/modules/strategy/dist/validate.d.ts +63 -0
  1661. package/modules/strategy/dist/validate.d.ts.map +1 -0
  1662. package/modules/strategy/dist/validate.js +146 -0
  1663. package/modules/strategy/dist/validate.js.map +1 -0
  1664. package/modules/strategy/etc/strategy.api.md +174 -0
  1665. package/modules/strategy/src/auto-range.ts +21 -0
  1666. package/modules/strategy/src/builders.ts +221 -0
  1667. package/modules/strategy/src/calendars.ts +245 -0
  1668. package/modules/strategy/src/classify.ts +215 -0
  1669. package/modules/strategy/src/explain.ts +471 -0
  1670. package/modules/strategy/src/from-chain.ts +643 -0
  1671. package/modules/strategy/src/index.ts +212 -0
  1672. package/modules/strategy/src/legs.ts +140 -0
  1673. package/modules/strategy/src/manifest.ts +756 -0
  1674. package/modules/strategy/src/optimizer.ts +679 -0
  1675. package/modules/strategy/src/position.ts +2084 -0
  1676. package/modules/strategy/src/probability.ts +301 -0
  1677. package/modules/strategy/src/scanner.ts +711 -0
  1678. package/modules/strategy/src/strategies.ts +1018 -0
  1679. package/modules/strategy/src/svg.ts +415 -0
  1680. package/modules/strategy/src/thesis-distribution.ts +188 -0
  1681. package/modules/strategy/src/types.ts +380 -0
  1682. package/modules/strategy/src/validate.ts +207 -0
  1683. package/modules/structure/OPTION-FLOW-DRIFT.md +126 -0
  1684. package/modules/structure/dist/exposure.d.ts +350 -0
  1685. package/modules/structure/dist/exposure.d.ts.map +1 -0
  1686. package/modules/structure/dist/exposure.js +917 -0
  1687. package/modules/structure/dist/exposure.js.map +1 -0
  1688. package/modules/structure/dist/flow.d.ts +247 -0
  1689. package/modules/structure/dist/flow.d.ts.map +1 -0
  1690. package/modules/structure/dist/flow.js +643 -0
  1691. package/modules/structure/dist/flow.js.map +1 -0
  1692. package/modules/structure/dist/index.d.ts +20 -0
  1693. package/modules/structure/dist/index.d.ts.map +1 -0
  1694. package/modules/structure/dist/index.js +16 -0
  1695. package/modules/structure/dist/index.js.map +1 -0
  1696. package/modules/structure/dist/market-day.d.ts +29 -0
  1697. package/modules/structure/dist/market-day.d.ts.map +1 -0
  1698. package/modules/structure/dist/market-day.js +43 -0
  1699. package/modules/structure/dist/market-day.js.map +1 -0
  1700. package/modules/structure/dist/option-flow-drift.d.ts +184 -0
  1701. package/modules/structure/dist/option-flow-drift.d.ts.map +1 -0
  1702. package/modules/structure/dist/option-flow-drift.js +475 -0
  1703. package/modules/structure/dist/option-flow-drift.js.map +1 -0
  1704. package/modules/structure/dist/supplied-exposure.d.ts +191 -0
  1705. package/modules/structure/dist/supplied-exposure.d.ts.map +1 -0
  1706. package/modules/structure/dist/supplied-exposure.js +421 -0
  1707. package/modules/structure/dist/supplied-exposure.js.map +1 -0
  1708. package/modules/structure/etc/structure.api.md +72 -0
  1709. package/modules/structure/src/exposure.ts +1330 -0
  1710. package/modules/structure/src/flow.ts +955 -0
  1711. package/modules/structure/src/index.ts +83 -0
  1712. package/modules/structure/src/market-day.ts +47 -0
  1713. package/modules/structure/src/option-flow-drift.ts +726 -0
  1714. package/modules/structure/src/supplied-exposure.ts +671 -0
  1715. package/modules/technical-analysis/dist/aliases.d.ts +42 -0
  1716. package/modules/technical-analysis/dist/aliases.d.ts.map +1 -0
  1717. package/modules/technical-analysis/dist/aliases.js +413 -0
  1718. package/modules/technical-analysis/dist/aliases.js.map +1 -0
  1719. package/modules/technical-analysis/dist/bands.d.ts +31 -0
  1720. package/modules/technical-analysis/dist/bands.d.ts.map +1 -0
  1721. package/modules/technical-analysis/dist/bands.js +79 -0
  1722. package/modules/technical-analysis/dist/bands.js.map +1 -0
  1723. package/modules/technical-analysis/dist/bars.d.ts +113 -0
  1724. package/modules/technical-analysis/dist/bars.d.ts.map +1 -0
  1725. package/modules/technical-analysis/dist/bars.js +374 -0
  1726. package/modules/technical-analysis/dist/bars.js.map +1 -0
  1727. package/modules/technical-analysis/dist/builtin-metadata.d.ts +1817 -0
  1728. package/modules/technical-analysis/dist/builtin-metadata.d.ts.map +1 -0
  1729. package/modules/technical-analysis/dist/builtin-metadata.js +1399 -0
  1730. package/modules/technical-analysis/dist/builtin-metadata.js.map +1 -0
  1731. package/modules/technical-analysis/dist/candle-aliases.d.ts +56 -0
  1732. package/modules/technical-analysis/dist/candle-aliases.d.ts.map +1 -0
  1733. package/modules/technical-analysis/dist/candle-aliases.js +246 -0
  1734. package/modules/technical-analysis/dist/candle-aliases.js.map +1 -0
  1735. package/modules/technical-analysis/dist/candle-talib.d.ts +114 -0
  1736. package/modules/technical-analysis/dist/candle-talib.d.ts.map +1 -0
  1737. package/modules/technical-analysis/dist/candle-talib.js +185 -0
  1738. package/modules/technical-analysis/dist/candle-talib.js.map +1 -0
  1739. package/modules/technical-analysis/dist/candlesticks.d.ts +103 -0
  1740. package/modules/technical-analysis/dist/candlesticks.d.ts.map +1 -0
  1741. package/modules/technical-analysis/dist/candlesticks.js +1009 -0
  1742. package/modules/technical-analysis/dist/candlesticks.js.map +1 -0
  1743. package/modules/technical-analysis/dist/chart-types.d.ts +205 -0
  1744. package/modules/technical-analysis/dist/chart-types.d.ts.map +1 -0
  1745. package/modules/technical-analysis/dist/chart-types.js +633 -0
  1746. package/modules/technical-analysis/dist/chart-types.js.map +1 -0
  1747. package/modules/technical-analysis/dist/columns.d.ts +24 -0
  1748. package/modules/technical-analysis/dist/columns.d.ts.map +1 -0
  1749. package/modules/technical-analysis/dist/columns.js +71 -0
  1750. package/modules/technical-analysis/dist/columns.js.map +1 -0
  1751. package/modules/technical-analysis/dist/cycle.d.ts +174 -0
  1752. package/modules/technical-analysis/dist/cycle.d.ts.map +1 -0
  1753. package/modules/technical-analysis/dist/cycle.js +489 -0
  1754. package/modules/technical-analysis/dist/cycle.js.map +1 -0
  1755. package/modules/technical-analysis/dist/discover.d.ts +100 -0
  1756. package/modules/technical-analysis/dist/discover.d.ts.map +1 -0
  1757. package/modules/technical-analysis/dist/discover.js +273 -0
  1758. package/modules/technical-analysis/dist/discover.js.map +1 -0
  1759. package/modules/technical-analysis/dist/divergence.d.ts +82 -0
  1760. package/modules/technical-analysis/dist/divergence.d.ts.map +1 -0
  1761. package/modules/technical-analysis/dist/divergence.js +269 -0
  1762. package/modules/technical-analysis/dist/divergence.js.map +1 -0
  1763. package/modules/technical-analysis/dist/features-ext.d.ts +162 -0
  1764. package/modules/technical-analysis/dist/features-ext.d.ts.map +1 -0
  1765. package/modules/technical-analysis/dist/features-ext.js +633 -0
  1766. package/modules/technical-analysis/dist/features-ext.js.map +1 -0
  1767. package/modules/technical-analysis/dist/features.d.ts +10 -0
  1768. package/modules/technical-analysis/dist/features.d.ts.map +1 -0
  1769. package/modules/technical-analysis/dist/features.js +10 -0
  1770. package/modules/technical-analysis/dist/features.js.map +1 -0
  1771. package/modules/technical-analysis/dist/framework.d.ts +353 -0
  1772. package/modules/technical-analysis/dist/framework.d.ts.map +1 -0
  1773. package/modules/technical-analysis/dist/framework.js +999 -0
  1774. package/modules/technical-analysis/dist/framework.js.map +1 -0
  1775. package/modules/technical-analysis/dist/fuzzy.d.ts +33 -0
  1776. package/modules/technical-analysis/dist/fuzzy.d.ts.map +1 -0
  1777. package/modules/technical-analysis/dist/fuzzy.js +80 -0
  1778. package/modules/technical-analysis/dist/fuzzy.js.map +1 -0
  1779. package/modules/technical-analysis/dist/generated/validation-specs.d.ts +12 -0
  1780. package/modules/technical-analysis/dist/generated/validation-specs.d.ts.map +1 -0
  1781. package/modules/technical-analysis/dist/generated/validation-specs.js +1052 -0
  1782. package/modules/technical-analysis/dist/generated/validation-specs.js.map +1 -0
  1783. package/modules/technical-analysis/dist/index.d.ts +132 -0
  1784. package/modules/technical-analysis/dist/index.d.ts.map +1 -0
  1785. package/modules/technical-analysis/dist/index.js +100 -0
  1786. package/modules/technical-analysis/dist/index.js.map +1 -0
  1787. package/modules/technical-analysis/dist/indicator-metadata.d.ts +21 -0
  1788. package/modules/technical-analysis/dist/indicator-metadata.d.ts.map +1 -0
  1789. package/modules/technical-analysis/dist/indicator-metadata.js +23 -0
  1790. package/modules/technical-analysis/dist/indicator-metadata.js.map +1 -0
  1791. package/modules/technical-analysis/dist/limits.d.ts +19 -0
  1792. package/modules/technical-analysis/dist/limits.d.ts.map +1 -0
  1793. package/modules/technical-analysis/dist/limits.js +19 -0
  1794. package/modules/technical-analysis/dist/limits.js.map +1 -0
  1795. package/modules/technical-analysis/dist/macd.d.ts +29 -0
  1796. package/modules/technical-analysis/dist/macd.d.ts.map +1 -0
  1797. package/modules/technical-analysis/dist/macd.js +61 -0
  1798. package/modules/technical-analysis/dist/macd.js.map +1 -0
  1799. package/modules/technical-analysis/dist/math.d.ts +69 -0
  1800. package/modules/technical-analysis/dist/math.d.ts.map +1 -0
  1801. package/modules/technical-analysis/dist/math.js +124 -0
  1802. package/modules/technical-analysis/dist/math.js.map +1 -0
  1803. package/modules/technical-analysis/dist/microstructure.d.ts +252 -0
  1804. package/modules/technical-analysis/dist/microstructure.d.ts.map +1 -0
  1805. package/modules/technical-analysis/dist/microstructure.js +552 -0
  1806. package/modules/technical-analysis/dist/microstructure.js.map +1 -0
  1807. package/modules/technical-analysis/dist/momentum-ext.d.ts +619 -0
  1808. package/modules/technical-analysis/dist/momentum-ext.d.ts.map +1 -0
  1809. package/modules/technical-analysis/dist/momentum-ext.js +1772 -0
  1810. package/modules/technical-analysis/dist/momentum-ext.js.map +1 -0
  1811. package/modules/technical-analysis/dist/momentum.d.ts +15 -0
  1812. package/modules/technical-analysis/dist/momentum.d.ts.map +1 -0
  1813. package/modules/technical-analysis/dist/momentum.js +14 -0
  1814. package/modules/technical-analysis/dist/momentum.js.map +1 -0
  1815. package/modules/technical-analysis/dist/moving-averages.d.ts +344 -0
  1816. package/modules/technical-analysis/dist/moving-averages.d.ts.map +1 -0
  1817. package/modules/technical-analysis/dist/moving-averages.js +1279 -0
  1818. package/modules/technical-analysis/dist/moving-averages.js.map +1 -0
  1819. package/modules/technical-analysis/dist/nan-policy.d.ts +42 -0
  1820. package/modules/technical-analysis/dist/nan-policy.d.ts.map +1 -0
  1821. package/modules/technical-analysis/dist/nan-policy.js +60 -0
  1822. package/modules/technical-analysis/dist/nan-policy.js.map +1 -0
  1823. package/modules/technical-analysis/dist/oscillators.d.ts +377 -0
  1824. package/modules/technical-analysis/dist/oscillators.d.ts.map +1 -0
  1825. package/modules/technical-analysis/dist/oscillators.js +1225 -0
  1826. package/modules/technical-analysis/dist/oscillators.js.map +1 -0
  1827. package/modules/technical-analysis/dist/output-meta.d.ts +71 -0
  1828. package/modules/technical-analysis/dist/output-meta.d.ts.map +1 -0
  1829. package/modules/technical-analysis/dist/output-meta.js +399 -0
  1830. package/modules/technical-analysis/dist/output-meta.js.map +1 -0
  1831. package/modules/technical-analysis/dist/overlap-ext.d.ts +206 -0
  1832. package/modules/technical-analysis/dist/overlap-ext.d.ts.map +1 -0
  1833. package/modules/technical-analysis/dist/overlap-ext.js +550 -0
  1834. package/modules/technical-analysis/dist/overlap-ext.js.map +1 -0
  1835. package/modules/technical-analysis/dist/overlap.d.ts +11 -0
  1836. package/modules/technical-analysis/dist/overlap.d.ts.map +1 -0
  1837. package/modules/technical-analysis/dist/overlap.js +10 -0
  1838. package/modules/technical-analysis/dist/overlap.js.map +1 -0
  1839. package/modules/technical-analysis/dist/performance-ext.d.ts +21 -0
  1840. package/modules/technical-analysis/dist/performance-ext.d.ts.map +1 -0
  1841. package/modules/technical-analysis/dist/performance-ext.js +31 -0
  1842. package/modules/technical-analysis/dist/performance-ext.js.map +1 -0
  1843. package/modules/technical-analysis/dist/pipeline.d.ts +105 -0
  1844. package/modules/technical-analysis/dist/pipeline.d.ts.map +1 -0
  1845. package/modules/technical-analysis/dist/pipeline.js +224 -0
  1846. package/modules/technical-analysis/dist/pipeline.js.map +1 -0
  1847. package/modules/technical-analysis/dist/price-action-ext.d.ts +90 -0
  1848. package/modules/technical-analysis/dist/price-action-ext.d.ts.map +1 -0
  1849. package/modules/technical-analysis/dist/price-action-ext.js +511 -0
  1850. package/modules/technical-analysis/dist/price-action-ext.js.map +1 -0
  1851. package/modules/technical-analysis/dist/price-action.d.ts +348 -0
  1852. package/modules/technical-analysis/dist/price-action.d.ts.map +1 -0
  1853. package/modules/technical-analysis/dist/price-action.js +613 -0
  1854. package/modules/technical-analysis/dist/price-action.js.map +1 -0
  1855. package/modules/technical-analysis/dist/registry.d.ts +84 -0
  1856. package/modules/technical-analysis/dist/registry.d.ts.map +1 -0
  1857. package/modules/technical-analysis/dist/registry.js +625 -0
  1858. package/modules/technical-analysis/dist/registry.js.map +1 -0
  1859. package/modules/technical-analysis/dist/resample.d.ts +77 -0
  1860. package/modules/technical-analysis/dist/resample.d.ts.map +1 -0
  1861. package/modules/technical-analysis/dist/resample.js +239 -0
  1862. package/modules/technical-analysis/dist/resample.js.map +1 -0
  1863. package/modules/technical-analysis/dist/rsi.d.ts +36 -0
  1864. package/modules/technical-analysis/dist/rsi.d.ts.map +1 -0
  1865. package/modules/technical-analysis/dist/rsi.js +95 -0
  1866. package/modules/technical-analysis/dist/rsi.js.map +1 -0
  1867. package/modules/technical-analysis/dist/series.d.ts +40 -0
  1868. package/modules/technical-analysis/dist/series.d.ts.map +1 -0
  1869. package/modules/technical-analysis/dist/series.js +125 -0
  1870. package/modules/technical-analysis/dist/series.js.map +1 -0
  1871. package/modules/technical-analysis/dist/signal.d.ts +140 -0
  1872. package/modules/technical-analysis/dist/signal.d.ts.map +1 -0
  1873. package/modules/technical-analysis/dist/signal.js +353 -0
  1874. package/modules/technical-analysis/dist/signal.js.map +1 -0
  1875. package/modules/technical-analysis/dist/snapshot-cardinality.d.ts +17 -0
  1876. package/modules/technical-analysis/dist/snapshot-cardinality.d.ts.map +1 -0
  1877. package/modules/technical-analysis/dist/snapshot-cardinality.js +53 -0
  1878. package/modules/technical-analysis/dist/snapshot-cardinality.js.map +1 -0
  1879. package/modules/technical-analysis/dist/snapshot-envelope.d.ts +19 -0
  1880. package/modules/technical-analysis/dist/snapshot-envelope.d.ts.map +1 -0
  1881. package/modules/technical-analysis/dist/snapshot-envelope.js +87 -0
  1882. package/modules/technical-analysis/dist/snapshot-envelope.js.map +1 -0
  1883. package/modules/technical-analysis/dist/statistics.d.ts +146 -0
  1884. package/modules/technical-analysis/dist/statistics.d.ts.map +1 -0
  1885. package/modules/technical-analysis/dist/statistics.js +524 -0
  1886. package/modules/technical-analysis/dist/statistics.js.map +1 -0
  1887. package/modules/technical-analysis/dist/stream-validation.d.ts +14 -0
  1888. package/modules/technical-analysis/dist/stream-validation.d.ts.map +1 -0
  1889. package/modules/technical-analysis/dist/stream-validation.js +35 -0
  1890. package/modules/technical-analysis/dist/stream-validation.js.map +1 -0
  1891. package/modules/technical-analysis/dist/transforms.d.ts +77 -0
  1892. package/modules/technical-analysis/dist/transforms.d.ts.map +1 -0
  1893. package/modules/technical-analysis/dist/transforms.js +246 -0
  1894. package/modules/technical-analysis/dist/transforms.js.map +1 -0
  1895. package/modules/technical-analysis/dist/trend-ext.d.ts +121 -0
  1896. package/modules/technical-analysis/dist/trend-ext.d.ts.map +1 -0
  1897. package/modules/technical-analysis/dist/trend-ext.js +691 -0
  1898. package/modules/technical-analysis/dist/trend-ext.js.map +1 -0
  1899. package/modules/technical-analysis/dist/trend.d.ts +373 -0
  1900. package/modules/technical-analysis/dist/trend.d.ts.map +1 -0
  1901. package/modules/technical-analysis/dist/trend.js +1159 -0
  1902. package/modules/technical-analysis/dist/trend.js.map +1 -0
  1903. package/modules/technical-analysis/dist/validate.d.ts +61 -0
  1904. package/modules/technical-analysis/dist/validate.d.ts.map +1 -0
  1905. package/modules/technical-analysis/dist/validate.js +334 -0
  1906. package/modules/technical-analysis/dist/validate.js.map +1 -0
  1907. package/modules/technical-analysis/dist/volatility-ext.d.ts +98 -0
  1908. package/modules/technical-analysis/dist/volatility-ext.d.ts.map +1 -0
  1909. package/modules/technical-analysis/dist/volatility-ext.js +535 -0
  1910. package/modules/technical-analysis/dist/volatility-ext.js.map +1 -0
  1911. package/modules/technical-analysis/dist/volatility.d.ts +239 -0
  1912. package/modules/technical-analysis/dist/volatility.d.ts.map +1 -0
  1913. package/modules/technical-analysis/dist/volatility.js +709 -0
  1914. package/modules/technical-analysis/dist/volatility.js.map +1 -0
  1915. package/modules/technical-analysis/dist/volume-core.d.ts +273 -0
  1916. package/modules/technical-analysis/dist/volume-core.d.ts.map +1 -0
  1917. package/modules/technical-analysis/dist/volume-core.js +847 -0
  1918. package/modules/technical-analysis/dist/volume-core.js.map +1 -0
  1919. package/modules/technical-analysis/dist/volume-ext.d.ts +61 -0
  1920. package/modules/technical-analysis/dist/volume-ext.d.ts.map +1 -0
  1921. package/modules/technical-analysis/dist/volume-ext.js +270 -0
  1922. package/modules/technical-analysis/dist/volume-ext.js.map +1 -0
  1923. package/modules/technical-analysis/dist/volume.d.ts +15 -0
  1924. package/modules/technical-analysis/dist/volume.d.ts.map +1 -0
  1925. package/modules/technical-analysis/dist/volume.js +15 -0
  1926. package/modules/technical-analysis/dist/volume.js.map +1 -0
  1927. package/modules/technical-analysis/dist/warmup.d.ts +38 -0
  1928. package/modules/technical-analysis/dist/warmup.d.ts.map +1 -0
  1929. package/modules/technical-analysis/dist/warmup.js +269 -0
  1930. package/modules/technical-analysis/dist/warmup.js.map +1 -0
  1931. package/modules/technical-analysis/etc/technical-analysis.api.md +663 -0
  1932. package/modules/technical-analysis/src/aliases.ts +466 -0
  1933. package/modules/technical-analysis/src/bands.ts +113 -0
  1934. package/modules/technical-analysis/src/bars.ts +456 -0
  1935. package/modules/technical-analysis/src/builtin-metadata.ts +1686 -0
  1936. package/modules/technical-analysis/src/candle-aliases.ts +289 -0
  1937. package/modules/technical-analysis/src/candle-talib.ts +215 -0
  1938. package/modules/technical-analysis/src/candlesticks.ts +1024 -0
  1939. package/modules/technical-analysis/src/chart-types.ts +813 -0
  1940. package/modules/technical-analysis/src/columns.ts +87 -0
  1941. package/modules/technical-analysis/src/cycle.ts +625 -0
  1942. package/modules/technical-analysis/src/discover.ts +390 -0
  1943. package/modules/technical-analysis/src/divergence.ts +388 -0
  1944. package/modules/technical-analysis/src/features-ext.ts +866 -0
  1945. package/modules/technical-analysis/src/features.ts +9 -0
  1946. package/modules/technical-analysis/src/framework.ts +1331 -0
  1947. package/modules/technical-analysis/src/fuzzy.ts +92 -0
  1948. package/modules/technical-analysis/src/generated/validation-specs.ts +1055 -0
  1949. package/modules/technical-analysis/src/index.ts +825 -0
  1950. package/modules/technical-analysis/src/indicator-metadata.ts +43 -0
  1951. package/modules/technical-analysis/src/limits.ts +19 -0
  1952. package/modules/technical-analysis/src/macd.ts +95 -0
  1953. package/modules/technical-analysis/src/math.ts +181 -0
  1954. package/modules/technical-analysis/src/microstructure.ts +870 -0
  1955. package/modules/technical-analysis/src/momentum-ext.ts +2348 -0
  1956. package/modules/technical-analysis/src/momentum.ts +16 -0
  1957. package/modules/technical-analysis/src/moving-averages.ts +1525 -0
  1958. package/modules/technical-analysis/src/nan-policy.ts +58 -0
  1959. package/modules/technical-analysis/src/oscillators.ts +1586 -0
  1960. package/modules/technical-analysis/src/output-meta.ts +466 -0
  1961. package/modules/technical-analysis/src/overlap-ext.ts +792 -0
  1962. package/modules/technical-analysis/src/overlap.ts +12 -0
  1963. package/modules/technical-analysis/src/performance-ext.ts +57 -0
  1964. package/modules/technical-analysis/src/pipeline.ts +270 -0
  1965. package/modules/technical-analysis/src/price-action-ext.ts +675 -0
  1966. package/modules/technical-analysis/src/price-action.ts +955 -0
  1967. package/modules/technical-analysis/src/registry.ts +784 -0
  1968. package/modules/technical-analysis/src/resample.ts +335 -0
  1969. package/modules/technical-analysis/src/rsi.ts +120 -0
  1970. package/modules/technical-analysis/src/series.ts +168 -0
  1971. package/modules/technical-analysis/src/signal.ts +429 -0
  1972. package/modules/technical-analysis/src/snapshot-cardinality.ts +83 -0
  1973. package/modules/technical-analysis/src/snapshot-envelope.ts +131 -0
  1974. package/modules/technical-analysis/src/statistics.ts +720 -0
  1975. package/modules/technical-analysis/src/stream-validation.ts +42 -0
  1976. package/modules/technical-analysis/src/transforms.ts +351 -0
  1977. package/modules/technical-analysis/src/trend-ext.ts +957 -0
  1978. package/modules/technical-analysis/src/trend.ts +1529 -0
  1979. package/modules/technical-analysis/src/validate.ts +555 -0
  1980. package/modules/technical-analysis/src/volatility-ext.ts +781 -0
  1981. package/modules/technical-analysis/src/volatility.ts +963 -0
  1982. package/modules/technical-analysis/src/volume-core.ts +1106 -0
  1983. package/modules/technical-analysis/src/volume-ext.ts +380 -0
  1984. package/modules/technical-analysis/src/volume.ts +14 -0
  1985. package/modules/technical-analysis/src/warmup.ts +322 -0
  1986. package/modules/totalfinance/dist/backtest.d.ts +3 -0
  1987. package/modules/totalfinance/dist/backtest.d.ts.map +1 -0
  1988. package/modules/totalfinance/dist/backtest.js +3 -0
  1989. package/modules/totalfinance/dist/backtest.js.map +1 -0
  1990. package/modules/totalfinance/dist/calendars.d.ts +3 -0
  1991. package/modules/totalfinance/dist/calendars.d.ts.map +1 -0
  1992. package/modules/totalfinance/dist/calendars.js +3 -0
  1993. package/modules/totalfinance/dist/calendars.js.map +1 -0
  1994. package/modules/totalfinance/dist/commodities.d.ts +2 -0
  1995. package/modules/totalfinance/dist/commodities.d.ts.map +1 -0
  1996. package/modules/totalfinance/dist/commodities.js +2 -0
  1997. package/modules/totalfinance/dist/commodities.js.map +1 -0
  1998. package/modules/totalfinance/dist/core.d.ts +3 -0
  1999. package/modules/totalfinance/dist/core.d.ts.map +1 -0
  2000. package/modules/totalfinance/dist/core.js +3 -0
  2001. package/modules/totalfinance/dist/core.js.map +1 -0
  2002. package/modules/totalfinance/dist/crypto.d.ts +3 -0
  2003. package/modules/totalfinance/dist/crypto.d.ts.map +1 -0
  2004. package/modules/totalfinance/dist/crypto.js +3 -0
  2005. package/modules/totalfinance/dist/crypto.js.map +1 -0
  2006. package/modules/totalfinance/dist/fixed-income.d.ts +3 -0
  2007. package/modules/totalfinance/dist/fixed-income.d.ts.map +1 -0
  2008. package/modules/totalfinance/dist/fixed-income.js +3 -0
  2009. package/modules/totalfinance/dist/fixed-income.js.map +1 -0
  2010. package/modules/totalfinance/dist/foreign-exchange.d.ts +2 -0
  2011. package/modules/totalfinance/dist/foreign-exchange.d.ts.map +1 -0
  2012. package/modules/totalfinance/dist/foreign-exchange.js +2 -0
  2013. package/modules/totalfinance/dist/foreign-exchange.js.map +1 -0
  2014. package/modules/totalfinance/dist/fundamentals.d.ts +3 -0
  2015. package/modules/totalfinance/dist/fundamentals.d.ts.map +1 -0
  2016. package/modules/totalfinance/dist/fundamentals.js +3 -0
  2017. package/modules/totalfinance/dist/fundamentals.js.map +1 -0
  2018. package/modules/totalfinance/dist/index.d.ts +90 -0
  2019. package/modules/totalfinance/dist/index.d.ts.map +1 -0
  2020. package/modules/totalfinance/dist/index.js +68 -0
  2021. package/modules/totalfinance/dist/index.js.map +1 -0
  2022. package/modules/totalfinance/dist/math.d.ts +3 -0
  2023. package/modules/totalfinance/dist/math.d.ts.map +1 -0
  2024. package/modules/totalfinance/dist/math.js +3 -0
  2025. package/modules/totalfinance/dist/math.js.map +1 -0
  2026. package/modules/totalfinance/dist/options.d.ts +3 -0
  2027. package/modules/totalfinance/dist/options.d.ts.map +1 -0
  2028. package/modules/totalfinance/dist/options.js +3 -0
  2029. package/modules/totalfinance/dist/options.js.map +1 -0
  2030. package/modules/totalfinance/dist/performance.d.ts +3 -0
  2031. package/modules/totalfinance/dist/performance.d.ts.map +1 -0
  2032. package/modules/totalfinance/dist/performance.js +3 -0
  2033. package/modules/totalfinance/dist/performance.js.map +1 -0
  2034. package/modules/totalfinance/dist/portfolio.d.ts +2 -0
  2035. package/modules/totalfinance/dist/portfolio.d.ts.map +1 -0
  2036. package/modules/totalfinance/dist/portfolio.js +2 -0
  2037. package/modules/totalfinance/dist/portfolio.js.map +1 -0
  2038. package/modules/totalfinance/dist/research.d.ts +2 -0
  2039. package/modules/totalfinance/dist/research.d.ts.map +1 -0
  2040. package/modules/totalfinance/dist/research.js +2 -0
  2041. package/modules/totalfinance/dist/research.js.map +1 -0
  2042. package/modules/totalfinance/dist/risk.d.ts +3 -0
  2043. package/modules/totalfinance/dist/risk.d.ts.map +1 -0
  2044. package/modules/totalfinance/dist/risk.js +3 -0
  2045. package/modules/totalfinance/dist/risk.js.map +1 -0
  2046. package/modules/totalfinance/dist/scenarios.d.ts +2 -0
  2047. package/modules/totalfinance/dist/scenarios.d.ts.map +1 -0
  2048. package/modules/totalfinance/dist/scenarios.js +2 -0
  2049. package/modules/totalfinance/dist/scenarios.js.map +1 -0
  2050. package/modules/totalfinance/dist/strategy.d.ts +3 -0
  2051. package/modules/totalfinance/dist/strategy.d.ts.map +1 -0
  2052. package/modules/totalfinance/dist/strategy.js +3 -0
  2053. package/modules/totalfinance/dist/strategy.js.map +1 -0
  2054. package/modules/totalfinance/dist/structure.d.ts +3 -0
  2055. package/modules/totalfinance/dist/structure.d.ts.map +1 -0
  2056. package/modules/totalfinance/dist/structure.js +3 -0
  2057. package/modules/totalfinance/dist/structure.js.map +1 -0
  2058. package/modules/totalfinance/dist/technical-analysis.d.ts +3 -0
  2059. package/modules/totalfinance/dist/technical-analysis.d.ts.map +1 -0
  2060. package/modules/totalfinance/dist/technical-analysis.js +3 -0
  2061. package/modules/totalfinance/dist/technical-analysis.js.map +1 -0
  2062. package/modules/totalfinance/dist/valuation.d.ts +3 -0
  2063. package/modules/totalfinance/dist/valuation.d.ts.map +1 -0
  2064. package/modules/totalfinance/dist/valuation.js +3 -0
  2065. package/modules/totalfinance/dist/valuation.js.map +1 -0
  2066. package/modules/totalfinance/dist/volatility.d.ts +3 -0
  2067. package/modules/totalfinance/dist/volatility.d.ts.map +1 -0
  2068. package/modules/totalfinance/dist/volatility.js +3 -0
  2069. package/modules/totalfinance/dist/volatility.js.map +1 -0
  2070. package/modules/totalfinance/etc/totalfinance.api.md +73 -0
  2071. package/modules/totalfinance/src/backtest.ts +2 -0
  2072. package/modules/totalfinance/src/calendars.ts +2 -0
  2073. package/modules/totalfinance/src/commodities.ts +1 -0
  2074. package/modules/totalfinance/src/core.ts +2 -0
  2075. package/modules/totalfinance/src/crypto.ts +2 -0
  2076. package/modules/totalfinance/src/fixed-income.ts +2 -0
  2077. package/modules/totalfinance/src/foreign-exchange.ts +1 -0
  2078. package/modules/totalfinance/src/fundamentals.ts +2 -0
  2079. package/modules/totalfinance/src/index.ts +129 -0
  2080. package/modules/totalfinance/src/math.ts +2 -0
  2081. package/modules/totalfinance/src/options.ts +2 -0
  2082. package/modules/totalfinance/src/performance.ts +2 -0
  2083. package/modules/totalfinance/src/portfolio.ts +1 -0
  2084. package/modules/totalfinance/src/research.ts +1 -0
  2085. package/modules/totalfinance/src/risk.ts +2 -0
  2086. package/modules/totalfinance/src/scenarios.ts +1 -0
  2087. package/modules/totalfinance/src/strategy.ts +2 -0
  2088. package/modules/totalfinance/src/structure.ts +2 -0
  2089. package/modules/totalfinance/src/technical-analysis.ts +2 -0
  2090. package/modules/totalfinance/src/valuation.ts +2 -0
  2091. package/modules/totalfinance/src/volatility.ts +2 -0
  2092. package/modules/valuation/dist/adjusted-present-value.d.ts +62 -0
  2093. package/modules/valuation/dist/adjusted-present-value.d.ts.map +1 -0
  2094. package/modules/valuation/dist/adjusted-present-value.js +85 -0
  2095. package/modules/valuation/dist/adjusted-present-value.js.map +1 -0
  2096. package/modules/valuation/dist/capital-budgeting.d.ts +84 -0
  2097. package/modules/valuation/dist/capital-budgeting.d.ts.map +1 -0
  2098. package/modules/valuation/dist/capital-budgeting.js +204 -0
  2099. package/modules/valuation/dist/capital-budgeting.js.map +1 -0
  2100. package/modules/valuation/dist/cash-flows.d.ts +11 -0
  2101. package/modules/valuation/dist/cash-flows.d.ts.map +1 -0
  2102. package/modules/valuation/dist/cash-flows.js +10 -0
  2103. package/modules/valuation/dist/cash-flows.js.map +1 -0
  2104. package/modules/valuation/dist/comparable.d.ts +101 -0
  2105. package/modules/valuation/dist/comparable.d.ts.map +1 -0
  2106. package/modules/valuation/dist/comparable.js +194 -0
  2107. package/modules/valuation/dist/comparable.js.map +1 -0
  2108. package/modules/valuation/dist/corporate-primitives.d.ts +185 -0
  2109. package/modules/valuation/dist/corporate-primitives.d.ts.map +1 -0
  2110. package/modules/valuation/dist/corporate-primitives.js +337 -0
  2111. package/modules/valuation/dist/corporate-primitives.js.map +1 -0
  2112. package/modules/valuation/dist/corporate.d.ts +14 -0
  2113. package/modules/valuation/dist/corporate.d.ts.map +1 -0
  2114. package/modules/valuation/dist/corporate.js +13 -0
  2115. package/modules/valuation/dist/corporate.js.map +1 -0
  2116. package/modules/valuation/dist/discounted-cash-flow.d.ts +269 -0
  2117. package/modules/valuation/dist/discounted-cash-flow.d.ts.map +1 -0
  2118. package/modules/valuation/dist/discounted-cash-flow.js +611 -0
  2119. package/modules/valuation/dist/discounted-cash-flow.js.map +1 -0
  2120. package/modules/valuation/dist/discounting.d.ts +124 -0
  2121. package/modules/valuation/dist/discounting.d.ts.map +1 -0
  2122. package/modules/valuation/dist/discounting.js +235 -0
  2123. package/modules/valuation/dist/discounting.js.map +1 -0
  2124. package/modules/valuation/dist/equity-valuation.d.ts +104 -0
  2125. package/modules/valuation/dist/equity-valuation.d.ts.map +1 -0
  2126. package/modules/valuation/dist/equity-valuation.js +164 -0
  2127. package/modules/valuation/dist/equity-valuation.js.map +1 -0
  2128. package/modules/valuation/dist/flows.d.ts +30 -0
  2129. package/modules/valuation/dist/flows.d.ts.map +1 -0
  2130. package/modules/valuation/dist/flows.js +77 -0
  2131. package/modules/valuation/dist/flows.js.map +1 -0
  2132. package/modules/valuation/dist/forecasting.d.ts +205 -0
  2133. package/modules/valuation/dist/forecasting.d.ts.map +1 -0
  2134. package/modules/valuation/dist/forecasting.js +359 -0
  2135. package/modules/valuation/dist/forecasting.js.map +1 -0
  2136. package/modules/valuation/dist/index.d.ts +9 -0
  2137. package/modules/valuation/dist/index.d.ts.map +1 -0
  2138. package/modules/valuation/dist/index.js +10 -0
  2139. package/modules/valuation/dist/index.js.map +1 -0
  2140. package/modules/valuation/dist/leveraged-buyout.d.ts +160 -0
  2141. package/modules/valuation/dist/leveraged-buyout.d.ts.map +1 -0
  2142. package/modules/valuation/dist/leveraged-buyout.js +326 -0
  2143. package/modules/valuation/dist/leveraged-buyout.js.map +1 -0
  2144. package/modules/valuation/dist/loans.d.ts +148 -0
  2145. package/modules/valuation/dist/loans.d.ts.map +1 -0
  2146. package/modules/valuation/dist/loans.js +518 -0
  2147. package/modules/valuation/dist/loans.js.map +1 -0
  2148. package/modules/valuation/dist/probabilistic.d.ts +88 -0
  2149. package/modules/valuation/dist/probabilistic.d.ts.map +1 -0
  2150. package/modules/valuation/dist/probabilistic.js +239 -0
  2151. package/modules/valuation/dist/probabilistic.js.map +1 -0
  2152. package/modules/valuation/dist/solvers.d.ts +90 -0
  2153. package/modules/valuation/dist/solvers.d.ts.map +1 -0
  2154. package/modules/valuation/dist/solvers.js +238 -0
  2155. package/modules/valuation/dist/solvers.js.map +1 -0
  2156. package/modules/valuation/etc/valuation.api.md +162 -0
  2157. package/modules/valuation/src/adjusted-present-value.ts +181 -0
  2158. package/modules/valuation/src/capital-budgeting.ts +329 -0
  2159. package/modules/valuation/src/cash-flows.ts +11 -0
  2160. package/modules/valuation/src/comparable.ts +340 -0
  2161. package/modules/valuation/src/corporate-primitives.ts +665 -0
  2162. package/modules/valuation/src/corporate.ts +36 -0
  2163. package/modules/valuation/src/discounted-cash-flow.ts +1083 -0
  2164. package/modules/valuation/src/discounting.ts +437 -0
  2165. package/modules/valuation/src/equity-valuation.ts +313 -0
  2166. package/modules/valuation/src/flows.ts +144 -0
  2167. package/modules/valuation/src/forecasting.ts +666 -0
  2168. package/modules/valuation/src/index.ts +10 -0
  2169. package/modules/valuation/src/leveraged-buyout.ts +560 -0
  2170. package/modules/valuation/src/loans.ts +778 -0
  2171. package/modules/valuation/src/probabilistic.ts +438 -0
  2172. package/modules/valuation/src/solvers.ts +397 -0
  2173. package/modules/volatility/dist/analytics.d.ts +133 -0
  2174. package/modules/volatility/dist/analytics.d.ts.map +1 -0
  2175. package/modules/volatility/dist/analytics.js +320 -0
  2176. package/modules/volatility/dist/analytics.js.map +1 -0
  2177. package/modules/volatility/dist/arbitrage.d.ts +118 -0
  2178. package/modules/volatility/dist/arbitrage.d.ts.map +1 -0
  2179. package/modules/volatility/dist/arbitrage.js +397 -0
  2180. package/modules/volatility/dist/arbitrage.js.map +1 -0
  2181. package/modules/volatility/dist/artifacts.d.ts +24 -0
  2182. package/modules/volatility/dist/artifacts.d.ts.map +1 -0
  2183. package/modules/volatility/dist/artifacts.js +22 -0
  2184. package/modules/volatility/dist/artifacts.js.map +1 -0
  2185. package/modules/volatility/dist/calibration-limits.d.ts +13 -0
  2186. package/modules/volatility/dist/calibration-limits.d.ts.map +1 -0
  2187. package/modules/volatility/dist/calibration-limits.js +46 -0
  2188. package/modules/volatility/dist/calibration-limits.js.map +1 -0
  2189. package/modules/volatility/dist/calibration-start.d.ts +13 -0
  2190. package/modules/volatility/dist/calibration-start.d.ts.map +1 -0
  2191. package/modules/volatility/dist/calibration-start.js +55 -0
  2192. package/modules/volatility/dist/calibration-start.js.map +1 -0
  2193. package/modules/volatility/dist/earnings.d.ts +152 -0
  2194. package/modules/volatility/dist/earnings.d.ts.map +1 -0
  2195. package/modules/volatility/dist/earnings.js +340 -0
  2196. package/modules/volatility/dist/earnings.js.map +1 -0
  2197. package/modules/volatility/dist/essvi.d.ts +115 -0
  2198. package/modules/volatility/dist/essvi.d.ts.map +1 -0
  2199. package/modules/volatility/dist/essvi.js +362 -0
  2200. package/modules/volatility/dist/essvi.js.map +1 -0
  2201. package/modules/volatility/dist/estimate.d.ts +14 -0
  2202. package/modules/volatility/dist/estimate.d.ts.map +1 -0
  2203. package/modules/volatility/dist/estimate.js +18 -0
  2204. package/modules/volatility/dist/estimate.js.map +1 -0
  2205. package/modules/volatility/dist/event.d.ts +155 -0
  2206. package/modules/volatility/dist/event.d.ts.map +1 -0
  2207. package/modules/volatility/dist/event.js +319 -0
  2208. package/modules/volatility/dist/event.js.map +1 -0
  2209. package/modules/volatility/dist/fitted-model-artifacts.d.ts +378 -0
  2210. package/modules/volatility/dist/fitted-model-artifacts.d.ts.map +1 -0
  2211. package/modules/volatility/dist/fitted-model-artifacts.js +1139 -0
  2212. package/modules/volatility/dist/fitted-model-artifacts.js.map +1 -0
  2213. package/modules/volatility/dist/fitted-model-families.d.ts +287 -0
  2214. package/modules/volatility/dist/fitted-model-families.d.ts.map +1 -0
  2215. package/modules/volatility/dist/fitted-model-families.js +1251 -0
  2216. package/modules/volatility/dist/fitted-model-families.js.map +1 -0
  2217. package/modules/volatility/dist/forecast.d.ts +195 -0
  2218. package/modules/volatility/dist/forecast.d.ts.map +1 -0
  2219. package/modules/volatility/dist/forecast.js +493 -0
  2220. package/modules/volatility/dist/forecast.js.map +1 -0
  2221. package/modules/volatility/dist/generated/validation-specs.d.ts +12 -0
  2222. package/modules/volatility/dist/generated/validation-specs.d.ts.map +1 -0
  2223. package/modules/volatility/dist/generated/validation-specs.js +2181 -0
  2224. package/modules/volatility/dist/generated/validation-specs.js.map +1 -0
  2225. package/modules/volatility/dist/heston-surface.d.ts +67 -0
  2226. package/modules/volatility/dist/heston-surface.d.ts.map +1 -0
  2227. package/modules/volatility/dist/heston-surface.js +135 -0
  2228. package/modules/volatility/dist/heston-surface.js.map +1 -0
  2229. package/modules/volatility/dist/index.d.ts +64 -0
  2230. package/modules/volatility/dist/index.d.ts.map +1 -0
  2231. package/modules/volatility/dist/index.js +68 -0
  2232. package/modules/volatility/dist/index.js.map +1 -0
  2233. package/modules/volatility/dist/local-volatility.d.ts +34 -0
  2234. package/modules/volatility/dist/local-volatility.d.ts.map +1 -0
  2235. package/modules/volatility/dist/local-volatility.js +59 -0
  2236. package/modules/volatility/dist/local-volatility.js.map +1 -0
  2237. package/modules/volatility/dist/metrics.d.ts +41 -0
  2238. package/modules/volatility/dist/metrics.d.ts.map +1 -0
  2239. package/modules/volatility/dist/metrics.js +117 -0
  2240. package/modules/volatility/dist/metrics.js.map +1 -0
  2241. package/modules/volatility/dist/min-variance-delta.d.ts +61 -0
  2242. package/modules/volatility/dist/min-variance-delta.d.ts.map +1 -0
  2243. package/modules/volatility/dist/min-variance-delta.js +101 -0
  2244. package/modules/volatility/dist/min-variance-delta.js.map +1 -0
  2245. package/modules/volatility/dist/observed-skew.d.ts +137 -0
  2246. package/modules/volatility/dist/observed-skew.d.ts.map +1 -0
  2247. package/modules/volatility/dist/observed-skew.js +461 -0
  2248. package/modules/volatility/dist/observed-skew.js.map +1 -0
  2249. package/modules/volatility/dist/otm-strip.d.ts +39 -0
  2250. package/modules/volatility/dist/otm-strip.d.ts.map +1 -0
  2251. package/modules/volatility/dist/otm-strip.js +181 -0
  2252. package/modules/volatility/dist/otm-strip.js.map +1 -0
  2253. package/modules/volatility/dist/risk-reversal.d.ts +89 -0
  2254. package/modules/volatility/dist/risk-reversal.d.ts.map +1 -0
  2255. package/modules/volatility/dist/risk-reversal.js +176 -0
  2256. package/modules/volatility/dist/risk-reversal.js.map +1 -0
  2257. package/modules/volatility/dist/sabr-delta.d.ts +67 -0
  2258. package/modules/volatility/dist/sabr-delta.d.ts.map +1 -0
  2259. package/modules/volatility/dist/sabr-delta.js +153 -0
  2260. package/modules/volatility/dist/sabr-delta.js.map +1 -0
  2261. package/modules/volatility/dist/sabr.d.ts +62 -0
  2262. package/modules/volatility/dist/sabr.d.ts.map +1 -0
  2263. package/modules/volatility/dist/sabr.js +262 -0
  2264. package/modules/volatility/dist/sabr.js.map +1 -0
  2265. package/modules/volatility/dist/skew.d.ts +63 -0
  2266. package/modules/volatility/dist/skew.d.ts.map +1 -0
  2267. package/modules/volatility/dist/skew.js +147 -0
  2268. package/modules/volatility/dist/skew.js.map +1 -0
  2269. package/modules/volatility/dist/ssvi-kernel.d.ts +90 -0
  2270. package/modules/volatility/dist/ssvi-kernel.d.ts.map +1 -0
  2271. package/modules/volatility/dist/ssvi-kernel.js +103 -0
  2272. package/modules/volatility/dist/ssvi-kernel.js.map +1 -0
  2273. package/modules/volatility/dist/ssvi.d.ts +181 -0
  2274. package/modules/volatility/dist/ssvi.d.ts.map +1 -0
  2275. package/modules/volatility/dist/ssvi.js +490 -0
  2276. package/modules/volatility/dist/ssvi.js.map +1 -0
  2277. package/modules/volatility/dist/sticky-regime.d.ts +47 -0
  2278. package/modules/volatility/dist/sticky-regime.d.ts.map +1 -0
  2279. package/modules/volatility/dist/sticky-regime.js +81 -0
  2280. package/modules/volatility/dist/sticky-regime.js.map +1 -0
  2281. package/modules/volatility/dist/surface-pca.d.ts +111 -0
  2282. package/modules/volatility/dist/surface-pca.d.ts.map +1 -0
  2283. package/modules/volatility/dist/surface-pca.js +297 -0
  2284. package/modules/volatility/dist/surface-pca.js.map +1 -0
  2285. package/modules/volatility/dist/surface.d.ts +286 -0
  2286. package/modules/volatility/dist/surface.d.ts.map +1 -0
  2287. package/modules/volatility/dist/surface.js +1105 -0
  2288. package/modules/volatility/dist/surface.js.map +1 -0
  2289. package/modules/volatility/dist/svi.d.ts +133 -0
  2290. package/modules/volatility/dist/svi.d.ts.map +1 -0
  2291. package/modules/volatility/dist/svi.js +491 -0
  2292. package/modules/volatility/dist/svi.js.map +1 -0
  2293. package/modules/volatility/dist/swaption-cube.d.ts +125 -0
  2294. package/modules/volatility/dist/swaption-cube.d.ts.map +1 -0
  2295. package/modules/volatility/dist/swaption-cube.js +334 -0
  2296. package/modules/volatility/dist/swaption-cube.js.map +1 -0
  2297. package/modules/volatility/dist/tail-risk.d.ts +65 -0
  2298. package/modules/volatility/dist/tail-risk.d.ts.map +1 -0
  2299. package/modules/volatility/dist/tail-risk.js +155 -0
  2300. package/modules/volatility/dist/tail-risk.js.map +1 -0
  2301. package/modules/volatility/dist/term.d.ts +121 -0
  2302. package/modules/volatility/dist/term.d.ts.map +1 -0
  2303. package/modules/volatility/dist/term.js +336 -0
  2304. package/modules/volatility/dist/term.js.map +1 -0
  2305. package/modules/volatility/dist/vanna-volga.d.ts +278 -0
  2306. package/modules/volatility/dist/vanna-volga.d.ts.map +1 -0
  2307. package/modules/volatility/dist/vanna-volga.js +833 -0
  2308. package/modules/volatility/dist/vanna-volga.js.map +1 -0
  2309. package/modules/volatility/dist/variance-index.d.ts +101 -0
  2310. package/modules/volatility/dist/variance-index.d.ts.map +1 -0
  2311. package/modules/volatility/dist/variance-index.js +240 -0
  2312. package/modules/volatility/dist/variance-index.js.map +1 -0
  2313. package/modules/volatility/dist/volatility-spot-beta.d.ts +57 -0
  2314. package/modules/volatility/dist/volatility-spot-beta.d.ts.map +1 -0
  2315. package/modules/volatility/dist/volatility-spot-beta.js +136 -0
  2316. package/modules/volatility/dist/volatility-spot-beta.js.map +1 -0
  2317. package/modules/volatility/etc/volatility.api.md +207 -0
  2318. package/modules/volatility/src/analytics.ts +513 -0
  2319. package/modules/volatility/src/arbitrage.ts +561 -0
  2320. package/modules/volatility/src/artifacts.ts +62 -0
  2321. package/modules/volatility/src/calibration-limits.ts +61 -0
  2322. package/modules/volatility/src/calibration-start.ts +79 -0
  2323. package/modules/volatility/src/earnings.ts +548 -0
  2324. package/modules/volatility/src/essvi.ts +528 -0
  2325. package/modules/volatility/src/estimate.ts +21 -0
  2326. package/modules/volatility/src/event.ts +542 -0
  2327. package/modules/volatility/src/fitted-model-artifacts.ts +1844 -0
  2328. package/modules/volatility/src/fitted-model-families.ts +1681 -0
  2329. package/modules/volatility/src/forecast.ts +757 -0
  2330. package/modules/volatility/src/generated/validation-specs.ts +2184 -0
  2331. package/modules/volatility/src/heston-surface.ts +215 -0
  2332. package/modules/volatility/src/index.ts +285 -0
  2333. package/modules/volatility/src/local-volatility.ts +104 -0
  2334. package/modules/volatility/src/metrics.ts +176 -0
  2335. package/modules/volatility/src/min-variance-delta.ts +167 -0
  2336. package/modules/volatility/src/observed-skew.ts +684 -0
  2337. package/modules/volatility/src/otm-strip.ts +234 -0
  2338. package/modules/volatility/src/risk-reversal.ts +316 -0
  2339. package/modules/volatility/src/sabr-delta.ts +238 -0
  2340. package/modules/volatility/src/sabr.ts +375 -0
  2341. package/modules/volatility/src/skew.ts +244 -0
  2342. package/modules/volatility/src/ssvi-kernel.ts +134 -0
  2343. package/modules/volatility/src/ssvi.ts +707 -0
  2344. package/modules/volatility/src/sticky-regime.ts +150 -0
  2345. package/modules/volatility/src/surface-pca.ts +439 -0
  2346. package/modules/volatility/src/surface.ts +1499 -0
  2347. package/modules/volatility/src/svi.ts +687 -0
  2348. package/modules/volatility/src/swaption-cube.ts +539 -0
  2349. package/modules/volatility/src/tail-risk.ts +254 -0
  2350. package/modules/volatility/src/term.ts +587 -0
  2351. package/modules/volatility/src/vanna-volga.ts +1337 -0
  2352. package/modules/volatility/src/variance-index.ts +396 -0
  2353. package/modules/volatility/src/volatility-spot-beta.ts +252 -0
  2354. package/modules/workflows/dist/capabilities.d.ts +8 -0
  2355. package/modules/workflows/dist/capabilities.d.ts.map +1 -0
  2356. package/modules/workflows/dist/capabilities.js +50 -0
  2357. package/modules/workflows/dist/capabilities.js.map +1 -0
  2358. package/modules/workflows/dist/envelope-schema.d.ts +36 -0
  2359. package/modules/workflows/dist/envelope-schema.d.ts.map +1 -0
  2360. package/modules/workflows/dist/envelope-schema.js +152 -0
  2361. package/modules/workflows/dist/envelope-schema.js.map +1 -0
  2362. package/modules/workflows/dist/index.d.ts +33 -0
  2363. package/modules/workflows/dist/index.d.ts.map +1 -0
  2364. package/modules/workflows/dist/index.js +27 -0
  2365. package/modules/workflows/dist/index.js.map +1 -0
  2366. package/modules/workflows/dist/json-safe.d.ts +7 -0
  2367. package/modules/workflows/dist/json-safe.d.ts.map +1 -0
  2368. package/modules/workflows/dist/json-safe.js +23 -0
  2369. package/modules/workflows/dist/json-safe.js.map +1 -0
  2370. package/modules/workflows/dist/local/file-lock.d.ts +23 -0
  2371. package/modules/workflows/dist/local/file-lock.d.ts.map +1 -0
  2372. package/modules/workflows/dist/local/file-lock.js +198 -0
  2373. package/modules/workflows/dist/local/file-lock.js.map +1 -0
  2374. package/modules/workflows/dist/local/file-stores.d.ts +33 -0
  2375. package/modules/workflows/dist/local/file-stores.d.ts.map +1 -0
  2376. package/modules/workflows/dist/local/file-stores.js +376 -0
  2377. package/modules/workflows/dist/local/file-stores.js.map +1 -0
  2378. package/modules/workflows/dist/local/index.d.ts +15 -0
  2379. package/modules/workflows/dist/local/index.d.ts.map +1 -0
  2380. package/modules/workflows/dist/local/index.js +12 -0
  2381. package/modules/workflows/dist/local/index.js.map +1 -0
  2382. package/modules/workflows/dist/local/job-worker.d.ts +28 -0
  2383. package/modules/workflows/dist/local/job-worker.d.ts.map +1 -0
  2384. package/modules/workflows/dist/local/job-worker.js +56 -0
  2385. package/modules/workflows/dist/local/job-worker.js.map +1 -0
  2386. package/modules/workflows/dist/local/jobs.d.ts +51 -0
  2387. package/modules/workflows/dist/local/jobs.d.ts.map +1 -0
  2388. package/modules/workflows/dist/local/jobs.js +313 -0
  2389. package/modules/workflows/dist/local/jobs.js.map +1 -0
  2390. package/modules/workflows/dist/local/local-runner.d.ts +39 -0
  2391. package/modules/workflows/dist/local/local-runner.d.ts.map +1 -0
  2392. package/modules/workflows/dist/local/local-runner.js +102 -0
  2393. package/modules/workflows/dist/local/local-runner.js.map +1 -0
  2394. package/modules/workflows/dist/local/profiles.d.ts +27 -0
  2395. package/modules/workflows/dist/local/profiles.d.ts.map +1 -0
  2396. package/modules/workflows/dist/local/profiles.js +77 -0
  2397. package/modules/workflows/dist/local/profiles.js.map +1 -0
  2398. package/modules/workflows/dist/operation-kit.d.ts +10 -0
  2399. package/modules/workflows/dist/operation-kit.d.ts.map +1 -0
  2400. package/modules/workflows/dist/operation-kit.js +193 -0
  2401. package/modules/workflows/dist/operation-kit.js.map +1 -0
  2402. package/modules/workflows/dist/operation.d.ts +210 -0
  2403. package/modules/workflows/dist/operation.d.ts.map +1 -0
  2404. package/modules/workflows/dist/operation.js +255 -0
  2405. package/modules/workflows/dist/operation.js.map +1 -0
  2406. package/modules/workflows/dist/operations-analysis.d.ts +188 -0
  2407. package/modules/workflows/dist/operations-analysis.d.ts.map +1 -0
  2408. package/modules/workflows/dist/operations-analysis.js +908 -0
  2409. package/modules/workflows/dist/operations-analysis.js.map +1 -0
  2410. package/modules/workflows/dist/operations-compute.d.ts +21 -0
  2411. package/modules/workflows/dist/operations-compute.d.ts.map +1 -0
  2412. package/modules/workflows/dist/operations-compute.js +1227 -0
  2413. package/modules/workflows/dist/operations-compute.js.map +1 -0
  2414. package/modules/workflows/dist/operations-journey.d.ts +27 -0
  2415. package/modules/workflows/dist/operations-journey.d.ts.map +1 -0
  2416. package/modules/workflows/dist/operations-journey.js +2445 -0
  2417. package/modules/workflows/dist/operations-journey.js.map +1 -0
  2418. package/modules/workflows/dist/operations-trade.d.ts +3 -0
  2419. package/modules/workflows/dist/operations-trade.d.ts.map +1 -0
  2420. package/modules/workflows/dist/operations-trade.js +648 -0
  2421. package/modules/workflows/dist/operations-trade.js.map +1 -0
  2422. package/modules/workflows/dist/preview.d.ts +16 -0
  2423. package/modules/workflows/dist/preview.d.ts.map +1 -0
  2424. package/modules/workflows/dist/preview.js +30 -0
  2425. package/modules/workflows/dist/preview.js.map +1 -0
  2426. package/modules/workflows/dist/registry.d.ts +26 -0
  2427. package/modules/workflows/dist/registry.d.ts.map +1 -0
  2428. package/modules/workflows/dist/registry.js +110 -0
  2429. package/modules/workflows/dist/registry.js.map +1 -0
  2430. package/modules/workflows/dist/runtime.d.ts +76 -0
  2431. package/modules/workflows/dist/runtime.d.ts.map +1 -0
  2432. package/modules/workflows/dist/runtime.js +445 -0
  2433. package/modules/workflows/dist/runtime.js.map +1 -0
  2434. package/modules/workflows/dist/stores-trade.d.ts +101 -0
  2435. package/modules/workflows/dist/stores-trade.d.ts.map +1 -0
  2436. package/modules/workflows/dist/stores-trade.js +275 -0
  2437. package/modules/workflows/dist/stores-trade.js.map +1 -0
  2438. package/modules/workflows/dist/stores.d.ts +109 -0
  2439. package/modules/workflows/dist/stores.d.ts.map +1 -0
  2440. package/modules/workflows/dist/stores.js +393 -0
  2441. package/modules/workflows/dist/stores.js.map +1 -0
  2442. package/modules/workflows/dist/trade-wire-common-schemas.d.ts +57 -0
  2443. package/modules/workflows/dist/trade-wire-common-schemas.d.ts.map +1 -0
  2444. package/modules/workflows/dist/trade-wire-common-schemas.js +286 -0
  2445. package/modules/workflows/dist/trade-wire-common-schemas.js.map +1 -0
  2446. package/modules/workflows/dist/trade-wire-ledger-schemas.d.ts +102 -0
  2447. package/modules/workflows/dist/trade-wire-ledger-schemas.d.ts.map +1 -0
  2448. package/modules/workflows/dist/trade-wire-ledger-schemas.js +321 -0
  2449. package/modules/workflows/dist/trade-wire-ledger-schemas.js.map +1 -0
  2450. package/modules/workflows/dist/trade-wire-market-schemas.d.ts +5 -0
  2451. package/modules/workflows/dist/trade-wire-market-schemas.d.ts.map +1 -0
  2452. package/modules/workflows/dist/trade-wire-market-schemas.js +84 -0
  2453. package/modules/workflows/dist/trade-wire-market-schemas.js.map +1 -0
  2454. package/modules/workflows/dist/trade-wire-schemas.d.ts +1134 -0
  2455. package/modules/workflows/dist/trade-wire-schemas.d.ts.map +1 -0
  2456. package/modules/workflows/dist/trade-wire-schemas.js +755 -0
  2457. package/modules/workflows/dist/trade-wire-schemas.js.map +1 -0
  2458. package/modules/workflows/dist/version.d.ts +3 -0
  2459. package/modules/workflows/dist/version.d.ts.map +1 -0
  2460. package/modules/workflows/dist/version.js +3 -0
  2461. package/modules/workflows/dist/version.js.map +1 -0
  2462. package/modules/workflows/dist/wire-schemas.d.ts +84 -0
  2463. package/modules/workflows/dist/wire-schemas.d.ts.map +1 -0
  2464. package/modules/workflows/dist/wire-schemas.js +88 -0
  2465. package/modules/workflows/dist/wire-schemas.js.map +1 -0
  2466. package/modules/workflows/etc/workflows.api.md +95 -0
  2467. package/modules/workflows/src/capabilities.ts +67 -0
  2468. package/modules/workflows/src/envelope-schema.ts +170 -0
  2469. package/modules/workflows/src/index.ts +118 -0
  2470. package/modules/workflows/src/json-safe.ts +19 -0
  2471. package/modules/workflows/src/local/file-lock.ts +200 -0
  2472. package/modules/workflows/src/local/file-stores.ts +452 -0
  2473. package/modules/workflows/src/local/index.ts +20 -0
  2474. package/modules/workflows/src/local/job-worker.ts +74 -0
  2475. package/modules/workflows/src/local/jobs.ts +458 -0
  2476. package/modules/workflows/src/local/local-runner.ts +170 -0
  2477. package/modules/workflows/src/local/profiles.ts +113 -0
  2478. package/modules/workflows/src/operation-kit.ts +234 -0
  2479. package/modules/workflows/src/operation.ts +607 -0
  2480. package/modules/workflows/src/operations-analysis.ts +1058 -0
  2481. package/modules/workflows/src/operations-compute.ts +1458 -0
  2482. package/modules/workflows/src/operations-journey.ts +2744 -0
  2483. package/modules/workflows/src/operations-trade.ts +946 -0
  2484. package/modules/workflows/src/preview.ts +34 -0
  2485. package/modules/workflows/src/registry.ts +150 -0
  2486. package/modules/workflows/src/runtime.ts +633 -0
  2487. package/modules/workflows/src/stores-trade.ts +463 -0
  2488. package/modules/workflows/src/stores.ts +608 -0
  2489. package/modules/workflows/src/trade-wire-common-schemas.ts +337 -0
  2490. package/modules/workflows/src/trade-wire-ledger-schemas.ts +359 -0
  2491. package/modules/workflows/src/trade-wire-market-schemas.ts +103 -0
  2492. package/modules/workflows/src/trade-wire-schemas.ts +906 -0
  2493. package/modules/workflows/src/version.ts +2 -0
  2494. package/modules/workflows/src/wire-schemas.ts +100 -0
  2495. package/package.json +1008 -0
@@ -0,0 +1,2084 @@
1
+ /**
2
+ * `Position` — the options profit calculator core (spec §12.2–§12.5).
3
+ *
4
+ * Expiration payoff, breakevens, and max profit/loss are computed exactly from the piecewise-linear
5
+ * payoff (kinks at strikes, asymptotic slopes for unbounded ends). Mark-to-market and Greeks route
6
+ * through the BSM kernel in `@insiderfinance/totalfinance/options` — no duplicate pricing math.
7
+ */
8
+
9
+ import {
10
+ ensureFiniteWhenPresent,
11
+ type Assumptions,
12
+ CONVENTIONS_VERSION,
13
+ DEFAULT_GREEK_UNITS,
14
+ type Diagnostics,
15
+ ErrorCode,
16
+ InputError,
17
+ type QuantWarning,
18
+ WarningCode,
19
+ ensureFinite,
20
+ ensurePositive,
21
+ ensureKnownKeys,
22
+ optionExpiryToMs,
23
+ resolveValuationAsOf,
24
+ yearFraction,
25
+ requireArgumentArray,
26
+ requireArgumentObject,
27
+ } from '@totalfinance/core';
28
+ import { mulberry32, normalInverseCdf } from '@totalfinance/math';
29
+ import { type ExtendedGreeks } from '@totalfinance/options';
30
+ import { blackScholesExtendedGreeks, blackScholesPrice } from '@totalfinance/options/black-scholes';
31
+ import type {
32
+ ChartInclude,
33
+ Leg,
34
+ LegInput,
35
+ MarketSource,
36
+ MarkToMarketInput,
37
+ MarkToMarketResult,
38
+ OptimalExitPoint,
39
+ PayoffMetrics,
40
+ PayoffResult,
41
+ PositionAssumptions,
42
+ PositionConfig,
43
+ PremiumMarket,
44
+ PremiumSource,
45
+ PremiumVolatilitySource,
46
+ PriceRange,
47
+ VolatilitySource,
48
+ WhatIfCell,
49
+ WhatIfCubeBreakEven,
50
+ WhatIfCubeOptions,
51
+ WhatIfCubeProbability,
52
+ WhatIfCubeResult,
53
+ WhatIfProbabilityModel,
54
+ WhatIfProbabilityOptions,
55
+ } from './types.js';
56
+ import { POSITION_CONFIG_KEYS } from './types.js';
57
+ import { autoPriceRange } from './auto-range.js';
58
+ import { priceGridDistribution, type TerminalPriceLaw } from './thesis-distribution.js';
59
+ import {
60
+ type ProbabilityInput,
61
+ type ProbabilityMonteCarloInput,
62
+ type ProbabilityMonteCarloMetrics,
63
+ type ProbabilityMetrics,
64
+ type ProbabilityModel,
65
+ type ScenarioRow,
66
+ type ScenarioTableResult,
67
+ type TouchProbability,
68
+ expectedIntrinsic,
69
+ terminalCdf,
70
+ touchProbability,
71
+ } from './probability.js';
72
+
73
+ const EPS = 1e-9;
74
+ /** Effective per-leg vol is floored here so a large negative shock can't request a non-positive σ. */
75
+ const VOL_FLOOR = 1e-6;
76
+
77
+ /**
78
+ * The most points one price grid will materialize (2026-08-23 review, P0 "unbounded work"):
79
+ * `Number.isInteger(1e308)` is `true`, so the old check let a "steps" reach the grid loop as an
80
+ * unfinishable allocation — and every downstream consumer (payoff, chartData, scenarioTable)
81
+ * evaluates the whole multi-leg position at EVERY grid point. 10^6 points is 8 MB of grid and
82
+ * seconds of leg evaluations, ~250× the horizontal resolution of a 4K chart; no payoff diagram
83
+ * needs more.
84
+ */
85
+ const MAX_GRID_STEPS = 1_000_000;
86
+
87
+ /**
88
+ * Monte-Carlo probability caps (2026-08-23 review, P0 "unbounded work", reviewer-named): every
89
+ * path × step draws one normal through the inverse CDF (~37 ns measured), samples the local vol
90
+ * when smile-aware, and updates a Brownian-bridge touch estimate per breakeven — so paths and steps
91
+ * MULTIPLY into the workload and must be bounded together (10^7 × 10^6 = 10^13 path-steps, days).
92
+ * 10^8 path-steps is ~4–8 s; the 50,000 × 50 default is 2.5×10^6.
93
+ */
94
+ const MAX_MC_PROBABILITY_PATHS = 10_000_000;
95
+ const MAX_MC_PROBABILITY_STEPS = 1_000_000;
96
+ const MAX_MC_PROBABILITY_PATH_STEPS = 100_000_000;
97
+
98
+ /**
99
+ * INTERNAL provenance channel (dx §4.5): named builders stamp `constructedAs` THROUGH the
100
+ * constructor — positions are frozen at construction (dx §4.4), so a post-hoc `defineProperty`
101
+ * would throw. The symbol is deliberately NOT exported from the package index: provenance can
102
+ * only be stamped by this package's own builders, so `constructedAs` is never generally writable.
103
+ */
104
+ export const CONSTRUCTED_AS: unique symbol = Symbol('totalfinance.strategy.constructedAs');
105
+
106
+ /** INTERNAL — attach builder provenance to a config so the constructor stamps `constructedAs`. */
107
+ export function withProvenance(name: string, config: PositionConfig | undefined): PositionConfig {
108
+ return { ...config, [CONSTRUCTED_AS]: name } as PositionConfig;
109
+ }
110
+
111
+ function grid(range: PriceRange): number[] {
112
+ if (!Number.isFinite(range.from) || !Number.isFinite(range.to)) {
113
+ throw new InputError(
114
+ `strategy: price range from/to must be finite, got from=${range.from}, to=${range.to}.`,
115
+ { code: ErrorCode.InputNotFinite, context: { from: range.from, to: range.to } },
116
+ );
117
+ }
118
+ // Safe integer AND a work cap (2026-08-23 review, P0): see MAX_GRID_STEPS.
119
+ if (!Number.isSafeInteger(range.steps) || range.steps < 1 || range.steps > MAX_GRID_STEPS) {
120
+ throw new InputError(
121
+ `strategy: price range steps must be an integer in [1, ${MAX_GRID_STEPS.toLocaleString('en-US')}] — the grid is materialized and every consumer evaluates the whole position at each point, and 10^6 points is already ~250× a 4K chart's width. Received ${range.steps}.\n e.g. { from: 80, to: 120, steps: 201 }`,
122
+ {
123
+ code: ErrorCode.InputOutOfRange,
124
+ context: { steps: range.steps, max: MAX_GRID_STEPS },
125
+ },
126
+ );
127
+ }
128
+ const out: number[] = [];
129
+ const steps = range.steps;
130
+ if (steps === 1) return [range.from];
131
+ const dx = (range.to - range.from) / (steps - 1);
132
+ for (let i = 0; i < steps; i++) out.push(range.from + i * dx);
133
+ return out;
134
+ }
135
+
136
+ /**
137
+ * Resolve a caller's `prices` — an explicit grid array, a `{ from, to, steps }` range, or omitted — to
138
+ * a numeric grid. When omitted, the `fallback` range (strike-derived, see {@link autoPriceRange}) is
139
+ * used, so `payoff()` / `chartData()` / `scenarioTable()` all have a sensible default instead of
140
+ * throwing on a bare call. An explicit array is used as-is; a range object is expanded through `grid`
141
+ * (which rejects a malformed range with a typed error).
142
+ */
143
+ function resolveGrid(
144
+ prices: number[] | PriceRange | undefined,
145
+ fallback: () => PriceRange,
146
+ ): number[] {
147
+ if (prices === undefined) return grid(fallback());
148
+ if (Array.isArray(prices)) return prices;
149
+ return grid(prices);
150
+ }
151
+
152
+ // ── What-if cube probability helpers (Wave 6 §3) ──────────────────────────────────────────────────
153
+
154
+ /** §6: reject a probability axis that is not strictly increasing (and thus not unique) or non-finite. */
155
+ function ensureStrictlyIncreasing(
156
+ arr: readonly number[],
157
+ name: string,
158
+ functionName: string,
159
+ ): void {
160
+ for (let i = 0; i < arr.length; i++) {
161
+ ensureFinite(arr[i]!, `${name}[${i}]`, functionName);
162
+ if (i > 0 && !(arr[i]! > arr[i - 1]!)) {
163
+ throw new InputError(
164
+ `${functionName}: ${name} must be strictly increasing and unique; ${name}[${i}]=${arr[i]} ≤ ${name}[${i - 1}]=${arr[i - 1]}.`,
165
+ {
166
+ code: ErrorCode.InputOutOfRange,
167
+ context: { index: i, value: arr[i], previous: arr[i - 1] },
168
+ },
169
+ );
170
+ }
171
+ }
172
+ }
173
+
174
+ /** Reject a probability axis with a non-finite or duplicate value. */
175
+ function ensureFiniteUnique(arr: readonly number[], name: string, functionName: string): void {
176
+ const seen = new Set<number>();
177
+ for (let i = 0; i < arr.length; i++) {
178
+ ensureFinite(arr[i]!, `${name}[${i}]`, functionName);
179
+ if (seen.has(arr[i]!)) {
180
+ throw new InputError(`${functionName}: ${name} must be unique; duplicate value ${arr[i]}.`, {
181
+ code: ErrorCode.InputOutOfRange,
182
+ context: { index: i, value: arr[i] },
183
+ });
184
+ }
185
+ seen.add(arr[i]!);
186
+ }
187
+ }
188
+
189
+ /**
190
+ * The `realWorld` measure's contract: it is a REQUEST for a specific drift, so the drift must be
191
+ * supplied. Falling back to `riskFreeRate` returned the risk-neutral numbers under a result that
192
+ * still echoed `measure: 'realWorld'` — the answer and its own stated assumptions disagreed, and
193
+ * nothing in the output revealed it. `riskNeutral` (the default) needs no expectedReturn, and
194
+ * supplying one there is a contradiction worth naming rather than ignoring.
195
+ *
196
+ * This is the same law the what-if cube's model grammar already enforces (`resolveWhatIfModel`).
197
+ */
198
+ function requireExpectedReturn(
199
+ functionName: string,
200
+ measure: 'riskNeutral' | 'realWorld',
201
+ expectedReturn: number | undefined,
202
+ ): void {
203
+ if (measure === 'realWorld') {
204
+ if (expectedReturn === undefined) {
205
+ throw new InputError(
206
+ `${functionName}: measure 'realWorld' requires expectedReturn — the annualized real-world ` +
207
+ `drift IS the measure. Omitting it silently returned the risk-neutral answer under a ` +
208
+ `'realWorld' label; pass expectedReturn: 0.08, or drop measure to use the risk-neutral ` +
209
+ `default (drift = riskFreeRate − dividendYield).`,
210
+ { code: ErrorCode.InputMissingField, context: { measure, field: 'expectedReturn' } },
211
+ );
212
+ }
213
+ ensureFinite(expectedReturn, 'expectedReturn', functionName);
214
+ return;
215
+ }
216
+ if (expectedReturn !== undefined) {
217
+ throw new InputError(
218
+ `${functionName}: expectedReturn only applies to measure 'realWorld' — the risk-neutral ` +
219
+ `drift is riskFreeRate − dividendYield and cannot be overridden. Pass measure: 'realWorld' ` +
220
+ `to use it, or remove it.`,
221
+ { code: ErrorCode.InputInvalidEnum, context: { measure, expectedReturn } },
222
+ );
223
+ }
224
+ }
225
+
226
+ interface WhatIfModelResolution {
227
+ modelAssumptions: WhatIfCubeProbability['modelAssumptions'];
228
+ lawAt: (yearsForward: number) => TerminalPriceLaw;
229
+ }
230
+
231
+ /**
232
+ * Resolve a {@link WhatIfProbabilityModel} to its echoed assumptions + a `lawAt(yearsForward)` that
233
+ * builds the terminal-price law for that horizon. GBM drift follows the {@link Position.probability}
234
+ * measure grammar with no silent zero default; a custom density integrates over its explicit support.
235
+ */
236
+ function resolveWhatIfModel(
237
+ model: WhatIfProbabilityModel,
238
+ context: { s0: number; riskFreeRate: number; dividendYield: number; functionName: string },
239
+ ): WhatIfModelResolution {
240
+ const { s0, riskFreeRate, dividendYield, functionName } = context;
241
+ requireArgumentObject(functionName, 'probability.model', model);
242
+ const kind = (model as { kind?: unknown }).kind;
243
+ if (kind === 'gbm') {
244
+ const gbm = model as {
245
+ annualizedVolatility: number;
246
+ measure?: string;
247
+ expectedReturn?: number;
248
+ drift?: number;
249
+ };
250
+ const measure = gbm.measure ?? 'riskNeutral';
251
+ if (measure !== 'riskNeutral' && measure !== 'realWorld' && measure !== 'explicit') {
252
+ throw new InputError(
253
+ `${functionName}: probability.model.measure must be 'riskNeutral', 'realWorld', or 'explicit', got "${String(measure)}".`,
254
+ { code: ErrorCode.InputInvalidEnum, context: { measure } },
255
+ );
256
+ }
257
+ // Reject contradictory / extra fields per measure (Law 12): e.g. riskNeutral must not carry drift.
258
+ const allowed =
259
+ measure === 'realWorld'
260
+ ? (['kind', 'annualizedVolatility', 'measure', 'expectedReturn'] as const)
261
+ : measure === 'explicit'
262
+ ? (['kind', 'annualizedVolatility', 'measure', 'drift'] as const)
263
+ : (['kind', 'annualizedVolatility', 'measure'] as const);
264
+ ensureKnownKeys(functionName, 'probability.model', gbm, allowed);
265
+ const sigma = gbm.annualizedVolatility;
266
+ ensurePositive(
267
+ sigma,
268
+ 'probability.model.annualizedVolatility',
269
+ functionName,
270
+ ErrorCode.InputNegativeVolatility,
271
+ );
272
+ let resolvedDrift: number;
273
+ let modelAssumptions: WhatIfCubeProbability['modelAssumptions'];
274
+ if (measure === 'realWorld') {
275
+ if (gbm.expectedReturn === undefined) {
276
+ throw new InputError(
277
+ `${functionName}: probability.model measure 'realWorld' requires expectedReturn.`,
278
+ {
279
+ code: ErrorCode.InputMissingField,
280
+ context: { field: 'expectedReturn' },
281
+ },
282
+ );
283
+ }
284
+ ensureFinite(gbm.expectedReturn, 'probability.model.expectedReturn', functionName);
285
+ resolvedDrift = gbm.expectedReturn - dividendYield;
286
+ modelAssumptions = {
287
+ kind: 'gbm',
288
+ measure: 'realWorld',
289
+ annualizedVolatility: sigma,
290
+ expectedReturn: gbm.expectedReturn,
291
+ dividendYield,
292
+ resolvedDrift,
293
+ };
294
+ } else if (measure === 'explicit') {
295
+ if (gbm.drift === undefined) {
296
+ throw new InputError(
297
+ `${functionName}: probability.model measure 'explicit' requires drift.`,
298
+ {
299
+ code: ErrorCode.InputMissingField,
300
+ context: { field: 'drift' },
301
+ },
302
+ );
303
+ }
304
+ ensureFinite(gbm.drift, 'probability.model.drift', functionName);
305
+ resolvedDrift = gbm.drift;
306
+ modelAssumptions = {
307
+ kind: 'gbm',
308
+ measure: 'explicit',
309
+ annualizedVolatility: sigma,
310
+ drift: gbm.drift,
311
+ resolvedDrift,
312
+ };
313
+ } else {
314
+ resolvedDrift = riskFreeRate - dividendYield;
315
+ modelAssumptions = {
316
+ kind: 'gbm',
317
+ measure: 'riskNeutral',
318
+ annualizedVolatility: sigma,
319
+ riskFreeRate,
320
+ dividendYield,
321
+ resolvedDrift,
322
+ };
323
+ }
324
+ const lnS0 = Math.log(s0);
325
+ const lawAt = (timeToExpiryYears: number): TerminalPriceLaw => ({
326
+ kind: 'lognormal',
327
+ muLog: lnS0 + (resolvedDrift - 0.5 * sigma * sigma) * timeToExpiryYears,
328
+ sigma: sigma * Math.sqrt(timeToExpiryYears),
329
+ });
330
+ return { modelAssumptions, lawAt };
331
+ }
332
+ if (kind === 'custom') {
333
+ const custom = model as {
334
+ density: (price: number, yearsForward: number) => number;
335
+ support: { from: number; to: number };
336
+ };
337
+ ensureKnownKeys(functionName, 'probability.model', custom, [
338
+ 'kind',
339
+ 'density',
340
+ 'support',
341
+ ] as const);
342
+ if (typeof custom.density !== 'function') {
343
+ throw new InputError(`${functionName}: probability.model.density must be a function.`, {
344
+ code: ErrorCode.InputWrongType,
345
+ context: { field: 'density' },
346
+ });
347
+ }
348
+ const sup = custom.support;
349
+ requireArgumentObject(functionName, 'probability.model.support', sup);
350
+ ensureKnownKeys(functionName, 'probability.model.support', sup, ['from', 'to'] as const);
351
+ ensureFinite(sup.from, 'probability.model.support.from', functionName);
352
+ ensureFinite(sup.to, 'probability.model.support.to', functionName);
353
+ if (!(sup.from >= 0) || !(sup.to > sup.from)) {
354
+ throw new InputError(
355
+ `${functionName}: probability.model.support must satisfy 0 ≤ from < to (finite), got { from: ${sup.from}, to: ${sup.to} }.`,
356
+ { code: ErrorCode.InputOutOfRange, context: { from: sup.from, to: sup.to } },
357
+ );
358
+ }
359
+ const lawAt = (t: number): TerminalPriceLaw => ({
360
+ kind: 'custom',
361
+ density: custom.density,
362
+ from: sup.from,
363
+ to: sup.to,
364
+ yearsForward: t,
365
+ });
366
+ return { modelAssumptions: { kind: 'custom', support: { from: sup.from, to: sup.to } }, lawAt };
367
+ }
368
+ throw new InputError(
369
+ `${functionName}: probability.model.kind must be 'gbm' or 'custom', got "${String(kind)}".`,
370
+ { code: ErrorCode.InputInvalidEnum, context: { kind } },
371
+ );
372
+ }
373
+
374
+ /**
375
+ * The spot mass over the price grid at one horizon, plus the disclosed grid tails (as fractions of the
376
+ * total support mass). Day zero (or any zero horizon) is a degenerate point mass in the bin containing
377
+ * the current spot — never a divide-by-zero. `report-and-renormalize` returns the in-grid conditional
378
+ * distribution; `include-in-edge-bins` folds the tails into the edge bins.
379
+ */
380
+ function resolveDayMass(input: {
381
+ prices: number[];
382
+ yearsForward: number;
383
+ s0: number;
384
+ lawAt: (t: number) => TerminalPriceLaw;
385
+ gridPolicy: 'report-and-renormalize' | 'include-in-edge-bins';
386
+ functionName: string;
387
+ }): { masses: number[]; below: number; above: number } {
388
+ const { prices, yearsForward, s0, lawAt, gridPolicy, functionName } = input;
389
+ const n = prices.length;
390
+ if (yearsForward <= 0) {
391
+ // Degenerate point mass at the current spot.
392
+ const loEdge = prices[0]! - (prices[1]! - prices[0]!) / 2;
393
+ const hiEdge = prices[n - 1]! + (prices[n - 1]! - prices[n - 2]!) / 2;
394
+ const masses = new Array<number>(n).fill(0);
395
+ if (s0 < loEdge || s0 > hiEdge) {
396
+ if (gridPolicy === 'report-and-renormalize') {
397
+ throw new InputError(
398
+ `${functionName}: the day-zero spot ${s0} is outside the price grid [${loEdge.toFixed(4)}, ${hiEdge.toFixed(4)}]; the conditional-grid policy cannot renormalize a point mass with no in-grid support. Widen the grid or use gridPolicy: 'include-in-edge-bins'.`,
399
+ { code: ErrorCode.InputOutOfRange, context: { spot: s0, loEdge, hiEdge } },
400
+ );
401
+ }
402
+ if (s0 < loEdge) {
403
+ masses[0] = 1;
404
+ return { masses, below: 1, above: 0 };
405
+ }
406
+ masses[n - 1] = 1;
407
+ return { masses, below: 0, above: 1 };
408
+ }
409
+ let idx = n - 1;
410
+ for (let i = 0; i < n; i++) {
411
+ const hi = i === n - 1 ? hiEdge : (prices[i]! + prices[i + 1]!) / 2;
412
+ if (s0 <= hi) {
413
+ idx = i;
414
+ break;
415
+ }
416
+ }
417
+ masses[idx] = 1;
418
+ return { masses, below: 0, above: 0 };
419
+ }
420
+ const dist = priceGridDistribution({ prices, law: lawAt(yearsForward) });
421
+ const total = dist.inGridMass + dist.tailBelow + dist.tailAbove;
422
+ const norm = total > 0 ? total : 1;
423
+ const below = dist.tailBelow / norm;
424
+ const above = dist.tailAbove / norm;
425
+ if (gridPolicy === 'report-and-renormalize') {
426
+ // In-grid conditional distribution (priceGridDistribution already renormalized it to sum to 1).
427
+ return { masses: dist.nodes.map((nd) => nd.probability), below, above };
428
+ }
429
+ // include-in-edge-bins: fold the tail fractions into the edge bins of the support-fraction masses.
430
+ const masses = dist.nodes.map((nd) => (nd.probability * dist.inGridMass) / norm);
431
+ masses[0] = masses[0]! + below;
432
+ masses[n - 1] = masses[n - 1]! + above;
433
+ return { masses, below, above };
434
+ }
435
+
436
+ /**
437
+ * Zeroed extended greeks — the value for a stock leg (delta set by the caller), an expired leg, and the
438
+ * starting accumulator for the aggregate. `lambda` (elasticity Δ·S/V) is `null` here: it is not additive
439
+ * and is recomputed at the book level; a per-leg zero/expiry position has no meaningful elasticity.
440
+ */
441
+ function zeroExtendedGreeks(): ExtendedGreeks {
442
+ return {
443
+ delta: 0,
444
+ gamma: 0,
445
+ theta: 0,
446
+ vega: 0,
447
+ rho: 0,
448
+ vanna: 0,
449
+ charm: 0,
450
+ vomma: 0,
451
+ speed: 0,
452
+ color: 0,
453
+ phi: 0,
454
+ zomma: 0,
455
+ veta: 0,
456
+ vera: 0,
457
+ ultima: 0,
458
+ lambda: null,
459
+ };
460
+ }
461
+
462
+ /** Evaluate an injected local-volatility function, failing loudly if it returns a non-finite/≤0 σ. */
463
+ function sampleLocalVolatility(
464
+ lv: (level: number, timeToExpiryYears: number) => number,
465
+ level: number,
466
+ t: number,
467
+ functionName: string,
468
+ ): number {
469
+ const s = lv(level, t);
470
+ if (!Number.isFinite(s) || s <= 0) {
471
+ throw new InputError(
472
+ `${functionName}: localVolatility(${level}, ${t}) returned ${s}; a local-volatility path needs a finite positive σ.`,
473
+ { code: ErrorCode.InputOutOfRange, context: { level, timeToExpiryYears: t, sigma: s } },
474
+ );
475
+ }
476
+ return s;
477
+ }
478
+
479
+ /** Linear-interpolated quantile of an already-ascending-sorted array. */
480
+ function quantileSorted(sorted: number[], q: number): number {
481
+ const n = sorted.length;
482
+ if (n === 1) return sorted[0]!;
483
+ const idx = q * (n - 1);
484
+ const lo = Math.floor(idx);
485
+ const hi = Math.ceil(idx);
486
+ return sorted[lo]! * (1 - (idx - lo)) + sorted[hi]! * (idx - lo);
487
+ }
488
+
489
+ /**
490
+ * Model-price one leg's entry premium from the market (§3.4): options via BSM at their entry
491
+ * time-to-expiry, stock at spot. Every unpriced leg routes through here so `premiumSource: 'model'`
492
+ * is honest.
493
+ */
494
+ function modelPremium(
495
+ leg: Extract<LegInput, { kind: 'call' | 'put' }>,
496
+ market: PremiumMarket,
497
+ index: number,
498
+ functionName: string,
499
+ ): number {
500
+ const expiry = leg.expiry ?? market.expiry;
501
+ if (expiry === undefined) {
502
+ throw new InputError(
503
+ `${functionName}: legs[${index}] has no premium and no expiry to model one — set the leg's expiry or market.expiry.`,
504
+ { code: ErrorCode.InputMissingField, context: { index, field: 'expiry' } },
505
+ );
506
+ }
507
+ // Core `resolveAsOf` (WS3.2): date-only → UTC midnight, datetimes must carry a zone, garbage
508
+ // throws a teaching error — deterministic on every machine, never a silent local-zone parse.
509
+ const asOfMs = resolveValuationAsOf(market.asOf, functionName);
510
+ ensureFinite(asOfMs, 'market.asOf', functionName);
511
+ const t = yearFraction(asOfMs, optionExpiryToMs(expiry), 'ACT/365F');
512
+ // The leg's own implied volatility prices its entry, exactly as `value()` marks it — pricing the
513
+ // entry at the position vol and the mark at the leg vol opened every chain-fed position with a
514
+ // phantom P&L.
515
+ return blackScholesPrice({
516
+ type: leg.kind,
517
+ spot: market.spot,
518
+ strike: leg.strike,
519
+ timeToExpiryYears: t,
520
+ riskFreeRate: market.riskFreeRate,
521
+ dividendYield: market.dividendYield ?? 0,
522
+ volatility: leg.impliedVolatility ?? market.volatility,
523
+ });
524
+ }
525
+
526
+ /**
527
+ * The reward-to-risk ratio of an expiration payoff, `|maxProfit / maxLoss|`, or `null` with the
528
+ * warning that says why it is undefined: an unbounded profit, an unbounded loss, or a zero maximum
529
+ * loss (B3). One definition serves `probability().riskReward`, `explainPosition`'s `rewardToRisk`
530
+ * and the scanner's `returnOnRisk`, so the three reads of one position can never disagree —
531
+ * and `Infinity` never crosses the surface to read as "the best possible trade".
532
+ */
533
+ export function rewardToRisk(metrics: PayoffMetrics): {
534
+ ratio: number | null;
535
+ warning: QuantWarning | null;
536
+ } {
537
+ const undefinedBecause =
538
+ metrics.maxLoss === null
539
+ ? 'the maximum loss is unbounded'
540
+ : metrics.maxProfit === null
541
+ ? 'the maximum profit is unbounded'
542
+ : metrics.maxLoss === 0
543
+ ? 'the maximum loss is zero'
544
+ : null;
545
+ if (undefinedBecause !== null) {
546
+ return {
547
+ ratio: null,
548
+ warning: {
549
+ code: WarningCode.StrategyRiskRewardUndefined,
550
+ message: `${undefinedBecause}, so the reward-to-risk ratio is undefined (reported as null).`,
551
+ severity: 'info',
552
+ context: { maxProfit: metrics.maxProfit, maxLoss: metrics.maxLoss },
553
+ },
554
+ };
555
+ }
556
+ return { ratio: Math.abs(metrics.maxProfit! / metrics.maxLoss!), warning: null };
557
+ }
558
+
559
+ /**
560
+ * Resolve every leg's entry premium to a number. A leg that already carries a premium is `'user'`;
561
+ * a leg without one is priced from `config.market` when `premiums: 'model'`, else a typed error
562
+ * teaches the two supported modes. `premiumSource` is `'model'` iff any premium was modeled.
563
+ */
564
+ function resolvePremiums(
565
+ legs: readonly LegInput[],
566
+ config: PositionConfig,
567
+ functionName: string,
568
+ ): {
569
+ resolved: Leg[];
570
+ premiumSource: PremiumSource;
571
+ premiumVolatilitySource?: PremiumVolatilitySource;
572
+ } {
573
+ const mode = config.premiums ?? 'user';
574
+ let modeledAny = false;
575
+ const volatilitySources = new Set<'leg' | 'position'>();
576
+ const resolved = legs.map((leg, i): Leg => {
577
+ // A stock row is priced by its entry price, an option row by its premium; either is modeled
578
+ // from the market (the spot, the Black–Scholes–Merton premium) when omitted.
579
+ const priceField = leg.kind === 'stock' ? 'price' : 'premium';
580
+ const supplied = leg.kind === 'stock' ? leg.price : leg.premium;
581
+ if (typeof supplied === 'number')
582
+ return leg.kind === 'stock' ? { ...leg, price: supplied } : { ...leg, premium: supplied };
583
+ if (mode !== 'model' || config.market === undefined) {
584
+ throw new InputError(
585
+ `${functionName}: legs[${i}] has no ${priceField}. Supply entry ${priceField === 'price' ? 'prices' : 'premiums'}, or pass ` +
586
+ `{ premiums: 'model', market: { spot, volatility, riskFreeRate, asOf } } to price them from ` +
587
+ `the market.`,
588
+ { code: ErrorCode.InputMissingField, context: { index: i, field: priceField } },
589
+ );
590
+ }
591
+ modeledAny = true;
592
+ if (leg.kind === 'stock') return { ...leg, price: config.market.spot };
593
+ volatilitySources.add(leg.impliedVolatility !== undefined ? 'leg' : 'position');
594
+ return { ...leg, premium: modelPremium(leg, config.market, i, functionName) };
595
+ });
596
+ if (!modeledAny) return { resolved, premiumSource: 'user' };
597
+ const premiumVolatilitySource: PremiumVolatilitySource | undefined =
598
+ volatilitySources.size === 0
599
+ ? undefined
600
+ : volatilitySources.size === 2
601
+ ? 'mixed'
602
+ : ([...volatilitySources][0] as 'leg' | 'position');
603
+ return {
604
+ resolved,
605
+ premiumSource: 'model',
606
+ ...(premiumVolatilitySource !== undefined ? { premiumVolatilitySource } : {}),
607
+ };
608
+ }
609
+
610
+ /**
611
+ * Only options have expiry horizons. Keep an omitted option expiry as its own bucket: all-undated
612
+ * options support a symbolic terminal payoff, but mixing dated and undated options is unresolved,
613
+ * not evidence that the undated options share their sibling's date. Stock never adds a bucket.
614
+ */
615
+ function optionExpiries(legs: readonly Leg[]): Set<string | undefined> {
616
+ return new Set(legs.filter((leg) => leg.kind !== 'stock').map((leg) => leg.expiry));
617
+ }
618
+
619
+ export class Position {
620
+ /**
621
+ * The resolved legs — a frozen snapshot (deep-copied at construction, `Object.freeze`d per leg
622
+ * and as an array). A Position is immutable by design: to tweak a strategy, edit your own leg
623
+ * list and rebuild with `strategy(editedLegs, config)` — every downstream calculation is generic
624
+ * over the legs, so the rebuilt position needs no named builder. Mutating this array throws
625
+ * instead of silently diverging from `assumptions()`/cached results.
626
+ */
627
+ readonly legs: readonly Readonly<Leg>[];
628
+ readonly multiplier: number;
629
+ /** How the entry premiums were sourced: `'user'` (supplied) or `'model'` (priced from `market`). */
630
+ readonly premiumSource: PremiumSource;
631
+ /** When modeled, which volatility priced the entries (`'leg'`, `'position'` or `'mixed'`). */
632
+ readonly premiumVolatilitySource?: PremiumVolatilitySource;
633
+ /**
634
+ * The market this position was built with, if any — a frozen copy (R5), so mutating the caller's
635
+ * market object later never silently retargets the position. `probability()`, `value()`,
636
+ * `scenarioTable()`, and `chartData()` default to it; per-call fields merge over it.
637
+ */
638
+ readonly market?: Readonly<PremiumMarket>;
639
+ /** Keep an explicit default horizon for stock-only probability; never infer it from stock dates. */
640
+ private readonly defaultExpiry: string | undefined;
641
+ /**
642
+ * PROVENANCE, not identity (dx §4.5): the named builder that constructed this position, absent
643
+ * for raw `strategy(legs)`. Because positions are immutable this can never go stale — but a
644
+ * rebuilt-after-tweak position has no name. For "what is this NOW?" use `classifyStrategy`.
645
+ */
646
+ readonly constructedAs?: string;
647
+
648
+ constructor(legs: readonly LegInput[], config: PositionConfig = {}) {
649
+ // Validate at construction so payoff/metrics/chart never surface NaN max-profit/loss or chart
650
+ // points from a malformed leg or multiplier (design law #4). All builders flow through here.
651
+ const functionName = 'strategy';
652
+ requireArgumentArray(functionName, 'legs', legs);
653
+ requireArgumentObject(functionName, 'config', config);
654
+ // Law 12: the config rejects unknown keys here at the SHARED entry — `strategy(legs, config)`,
655
+ // `strategyOf`, and every named builder all construct through this constructor. (Provenance
656
+ // rides a symbol key, invisible to Object.keys, so builder-stamped configs pass untouched.)
657
+ ensureKnownKeys(functionName, 'config', config, POSITION_CONFIG_KEYS);
658
+ // When-present ladders BEFORE any coalesce (the 350c2796 ruling): a null multiplier used to
659
+ // silently size at 100, a null market silently priced market-free, and a null expiry fell
660
+ // through the precedence chain below as if omitted.
661
+ ensureFiniteWhenPresent(config.multiplier, 'multiplier', functionName);
662
+ if (
663
+ config.premiums !== undefined &&
664
+ config.premiums !== 'model' &&
665
+ config.premiums !== 'user'
666
+ ) {
667
+ throw new InputError(
668
+ `${functionName}: config.premiums must be 'model' | 'user' when provided. Received ${config.premiums === null ? 'null' : JSON.stringify(config.premiums)}.`,
669
+ { code: ErrorCode.InputInvalidEnum, context: { field: 'config.premiums' } },
670
+ );
671
+ }
672
+ if (
673
+ config.expiry !== undefined &&
674
+ (typeof config.expiry !== 'string' || config.expiry.length === 0)
675
+ ) {
676
+ throw new InputError(
677
+ `${functionName}: config.expiry must be an ISO date string when provided. Received ${config.expiry === null ? 'null' : typeof config.expiry}.`,
678
+ { code: ErrorCode.InputWrongType, context: { field: 'config.expiry' } },
679
+ );
680
+ }
681
+ if (
682
+ config.market !== undefined &&
683
+ (config.market === null || typeof config.market !== 'object')
684
+ ) {
685
+ throw new InputError(
686
+ `${functionName}: config.market must be an object of market fields when provided. Received ${config.market === null ? 'null' : typeof config.market}.`,
687
+ { code: ErrorCode.InputWrongType, context: { field: 'config.market' } },
688
+ );
689
+ }
690
+ const multiplier = config.multiplier ?? 100;
691
+ ensurePositive(multiplier, 'multiplier', functionName);
692
+ // Position-level default expiry (R4): materialized onto every leg that lacks its own, so the
693
+ // position remembers when it expires (probability()/value() need no re-telling). Precedence:
694
+ // leg.expiry > config.expiry > config.market.expiry. Validated eagerly — a garbage default
695
+ // expiry must fail here, not on the first probability() call.
696
+ const defaultExpiry = config.expiry ?? config.market?.expiry;
697
+ if (defaultExpiry !== undefined) optionExpiryToMs(defaultExpiry);
698
+ this.defaultExpiry = defaultExpiry;
699
+ // Each row is closed to its own kind (B4): a stock row has no strike, premium, expiry or
700
+ // volatility to carry, and an option row has no share price — a misspelled or misplaced field
701
+ // teaches instead of riding along. The default horizon is materialized onto OPTION rows only;
702
+ // stock has no expiry.
703
+ legs.forEach((leg, i) => {
704
+ requireArgumentObject(functionName, `legs[${i}]`, leg);
705
+ if (leg.kind === 'stock')
706
+ ensureKnownKeys(functionName, `legs[${i}]`, leg, ['kind', 'price', 'quantity']);
707
+ else
708
+ ensureKnownKeys(functionName, `legs[${i}]`, leg, [
709
+ 'kind',
710
+ 'strike',
711
+ 'premium',
712
+ 'quantity',
713
+ 'expiry',
714
+ 'impliedVolatility',
715
+ ]);
716
+ });
717
+ const withExpiry =
718
+ defaultExpiry === undefined
719
+ ? legs
720
+ : legs.map((l) =>
721
+ l.kind !== 'stock' && l.expiry === undefined ? { ...l, expiry: defaultExpiry } : l,
722
+ );
723
+ // Resolve entry premiums first — unpriced legs are model-priced from config.market (§3.4).
724
+ const { resolved, premiumSource, premiumVolatilitySource } = resolvePremiums(
725
+ withExpiry,
726
+ config,
727
+ functionName,
728
+ );
729
+ resolved.forEach((leg, i) => {
730
+ if (leg.kind === 'stock') {
731
+ ensureFinite(leg.price, `legs[${i}].price`, functionName);
732
+ } else {
733
+ ensurePositive(
734
+ leg.strike,
735
+ `legs[${i}].strike`,
736
+ functionName,
737
+ ErrorCode.InputNegativeStrike,
738
+ );
739
+ ensureFinite(leg.premium, `legs[${i}].premium`, functionName);
740
+ }
741
+ ensureFinite(leg.quantity, `legs[${i}].quantity`, functionName);
742
+ if (leg.quantity === 0) {
743
+ throw new InputError(`${functionName}: legs[${i}].quantity must be non-zero.`, {
744
+ code: ErrorCode.InputOutOfRange,
745
+ context: { index: i },
746
+ });
747
+ }
748
+ });
749
+ this.legs = Object.freeze(resolved.map((leg) => Object.freeze(leg)));
750
+ this.multiplier = multiplier;
751
+ this.premiumSource = premiumSource;
752
+ if (premiumVolatilitySource !== undefined)
753
+ this.premiumVolatilitySource = premiumVolatilitySource;
754
+ if (config.market !== undefined) this.market = Object.freeze({ ...config.market });
755
+ // Builder provenance rides the config through the internal CONSTRUCTED_AS symbol (named
756
+ // builders and strategyFromChain) — it must be set BEFORE the freeze below.
757
+ const provenance = (config as { [CONSTRUCTED_AS]?: unknown })[CONSTRUCTED_AS];
758
+ if (typeof provenance === 'string') this.constructedAs = provenance;
759
+ // Positions are immutable (dx §4.4). The legs are frozen above; freezing the instance itself
760
+ // makes `pos.multiplier = 1` (which would silently retarget every metric) a TypeError in
761
+ // strict mode instead of a lie.
762
+ Object.freeze(this);
763
+ }
764
+
765
+ /**
766
+ * Position-construction assumptions (design law #3): whether the entry premiums were supplied by
767
+ * the caller (`'user'`) or model-priced from a market (`'model'`), plus the contract multiplier.
768
+ */
769
+ assumptions(): PositionAssumptions {
770
+ return {
771
+ premiumSource: this.premiumSource,
772
+ ...(this.premiumVolatilitySource !== undefined
773
+ ? { premiumVolatilitySource: this.premiumVolatilitySource }
774
+ : {}),
775
+ multiplier: this.multiplier,
776
+ ...(this.constructedAs !== undefined ? { constructedAs: this.constructedAs } : {}),
777
+ };
778
+ }
779
+
780
+ /**
781
+ * Merge call-site market overrides over the remembered construction market (R5). Only DEFINED
782
+ * call fields override (an explicit `undefined` never erases a remembered value), the position's
783
+ * single option expiry backfills `expiry`, and `required` fields still missing after the merge throw
784
+ * one teaching error listing them all. Returns the merged fields plus the echoed `marketSource`.
785
+ */
786
+ private resolveMarket<T extends Partial<PremiumMarket> & { expiry?: string }>(
787
+ input: T,
788
+ functionName: string,
789
+ required: readonly ('spot' | 'volatility' | 'riskFreeRate' | 'asOf' | 'expiry')[],
790
+ ): { merged: T & Partial<PremiumMarket>; marketSource: MarketSource } {
791
+ const MARKET_KEYS = [
792
+ 'spot',
793
+ 'volatility',
794
+ 'riskFreeRate',
795
+ 'asOf',
796
+ 'dividendYield',
797
+ 'expiry',
798
+ ] as const;
799
+ // Defaults were materialized at construction. Infer a horizon only when ALL options agree;
800
+ // neither a dated stock nor a dated sibling can resolve a missing option expiry.
801
+ const expiries = optionExpiries(this.legs);
802
+ let positionExpiry: string | undefined;
803
+ if (expiries.size === 0) positionExpiry = this.defaultExpiry;
804
+ else if (expiries.size === 1) positionExpiry = [...expiries][0];
805
+ const defaults: Partial<PremiumMarket> & { expiry?: string } = {
806
+ ...(this.market !== undefined ? this.market : {}),
807
+ ...(positionExpiry !== undefined ? { expiry: positionExpiry } : {}),
808
+ };
809
+ // The position owns its horizon: a call-site `expiry` that contradicts the expiry materialized
810
+ // on its option legs used to be echoed in `assumptions` and used by `probability()` while every
811
+ // leg kept pricing at its own date. A FOREIGN horizon is refused; a value the legs already carry,
812
+ // or the remembered construction market's own `expiry` (re-passing that market object is the
813
+ // common call), changes nothing and is accepted. A call-site expiry is a horizon only for a
814
+ // position whose options carry none.
815
+ const datedExpiries = [...expiries].filter((e): e is string => e !== undefined);
816
+ if (
817
+ input.expiry !== undefined &&
818
+ datedExpiries.length > 0 &&
819
+ !datedExpiries.includes(input.expiry) &&
820
+ input.expiry !== this.market?.expiry
821
+ ) {
822
+ throw new InputError(
823
+ `${functionName}: this position's option legs expire ${datedExpiries.map((e) => `"${e}"`).join(', ')}, ` +
824
+ `so a call-site expiry "${input.expiry}" would price them at a horizon they do not have. ` +
825
+ `Rebuild the position with the new expiry — strategy(legs, { expiry }) or a per-leg expiry — ` +
826
+ `instead of overriding it at valuation.`,
827
+ {
828
+ code: ErrorCode.StrategyExpiryConflict,
829
+ context: {
830
+ function: functionName,
831
+ field: 'expiry',
832
+ expiry: input.expiry,
833
+ legExpiries: datedExpiries,
834
+ },
835
+ },
836
+ );
837
+ }
838
+ const merged: Record<string, unknown> = { ...defaults };
839
+ let callContributed = false;
840
+ for (const [k, v] of Object.entries(input)) {
841
+ if (v === undefined) continue;
842
+ merged[k] = v;
843
+ if ((MARKET_KEYS as readonly string[]).includes(k)) callContributed = true;
844
+ }
845
+ // Dated legs govern: the horizon every single-expiry analytic prices and echoes is the legs'
846
+ // own, never a call-site or construction-market default that happened to differ.
847
+ if (positionExpiry !== undefined) merged['expiry'] = positionExpiry;
848
+ const constructionContributed = MARKET_KEYS.some(
849
+ (k) => defaults[k] !== undefined && merged[k] === defaults[k],
850
+ );
851
+ const missing = required.filter((k) => merged[k] === undefined);
852
+ if (missing.length > 0) {
853
+ throw new InputError(
854
+ `${functionName}: missing market field(s): ${missing.join(', ')}. Pass them in the call, or build ` +
855
+ `the position with { market: { spot, volatility, riskFreeRate, asOf, expiry } } so they default from it.`,
856
+ { code: ErrorCode.InputMissingField, context: { missing: [...missing] } },
857
+ );
858
+ }
859
+ const marketSource: MarketSource =
860
+ constructionContributed && callContributed
861
+ ? 'merged'
862
+ : constructionContributed
863
+ ? 'construction'
864
+ : 'call';
865
+ return { merged: merged as T & Partial<PremiumMarket>, marketSource };
866
+ }
867
+
868
+ /**
869
+ * Single-expiration analytics (`payoff`/`metrics`/`probability`) assume all OPTIONS expire together.
870
+ * A calendar/diagonal spans multiple expiries, so a single terminal payoff is meaningless — refuse
871
+ * it and point the caller at the time-aware `value()` / `scenarioTable()` instead (design law #4:
872
+ * never answer a different question than the one asked). More than one option-expiry bucket also
873
+ * rejects mixed dated/undated options. Stock has no expiry and is valued at the terminal spot.
874
+ */
875
+ private assertSingleExpiry(method: string): void {
876
+ const distinct = optionExpiries(this.legs);
877
+ if (distinct.size > 1) {
878
+ throw new InputError(
879
+ `strategy: ${method}() is single-expiration analytics, but this position spans multiple ` +
880
+ `expiries (a calendar/diagonal). Use value() or scenarioTable() for a time-aware mark-to-market.`,
881
+ {
882
+ code: ErrorCode.StrategyMultiExpiryExpirationAnalytics,
883
+ context: { method, expiries: [...distinct] },
884
+ },
885
+ );
886
+ }
887
+ }
888
+
889
+ /** Expiration P&L at an underlying price. */
890
+ pnlAtExpiry(underlyingPrice: number): number {
891
+ // A single terminal payoff is meaningless for a calendar/diagonal (legs expire at different
892
+ // times); refuse it here rather than fabricate a flat curve (the guard `metrics()`/`payoff()`
893
+ // already enforce, extended to the public payoff primitive and to `chartData(expirationPnl)`).
894
+ this.assertSingleExpiry('pnlAtExpiry');
895
+ let total = 0;
896
+ for (const leg of this.legs) {
897
+ if (leg.kind === 'stock') {
898
+ total += leg.quantity * (underlyingPrice - leg.price);
899
+ } else {
900
+ const intrinsic =
901
+ leg.kind === 'call'
902
+ ? Math.max(underlyingPrice - leg.strike, 0)
903
+ : Math.max(leg.strike - underlyingPrice, 0);
904
+ total += leg.quantity * this.multiplier * (intrinsic - leg.premium);
905
+ }
906
+ }
907
+ return total;
908
+ }
909
+
910
+ /** Slope of the expiration payoff at an underlying price (used for asymptotic analysis). */
911
+ private slopeAt(underlyingPrice: number): number {
912
+ let slope = 0;
913
+ for (const leg of this.legs) {
914
+ if (leg.kind === 'stock') {
915
+ slope += leg.quantity;
916
+ } else {
917
+ const d =
918
+ leg.kind === 'call'
919
+ ? underlyingPrice > leg.strike
920
+ ? 1
921
+ : 0
922
+ : underlyingPrice < leg.strike
923
+ ? -1
924
+ : 0;
925
+ slope += leg.quantity * this.multiplier * d;
926
+ }
927
+ }
928
+ return slope;
929
+ }
930
+
931
+ /** Net cash to enter (positive = debit, negative = credit). */
932
+ netDebit(): number {
933
+ let net = 0;
934
+ for (const leg of this.legs) {
935
+ net +=
936
+ leg.kind === 'stock'
937
+ ? leg.quantity * leg.price
938
+ : leg.quantity * this.multiplier * leg.premium;
939
+ }
940
+ return net;
941
+ }
942
+
943
+ /**
944
+ * Net debit/credit, max profit/loss, and breakevens. The expiration payoff is piecewise-linear, so
945
+ * these are computed ANALYTICALLY from the kink set (every option strike plus every stock entry
946
+ * price) and the tail slopes — never by sampling a coarse grid, which missed breakevens beyond the
947
+ * last strike (e.g. a lone long stock, or a deep-ITM option) and ignored stock entry prices.
948
+ */
949
+ metrics(): PayoffMetrics {
950
+ this.assertSingleExpiry('metrics');
951
+ const netDebit = this.netDebit();
952
+ const kinks = [
953
+ ...new Set(this.legs.map((l) => (l.kind === 'stock' ? l.price : l.strike))),
954
+ ].sort((a, b) => a - b);
955
+
956
+ if (kinks.length === 0) {
957
+ const p = this.pnlAtExpiry(0);
958
+ return {
959
+ netDebit,
960
+ netCredit: -netDebit,
961
+ maxProfit: p,
962
+ maxLoss: p,
963
+ bounded: { profit: true, loss: true },
964
+ breakevens: [],
965
+ };
966
+ }
967
+
968
+ const pnl = kinks.map((k) => this.pnlAtExpiry(k));
969
+ const leftSlope = this.slopeAt(kinks[0]! - 1);
970
+ const rightSlope = this.slopeAt(kinks[kinks.length - 1]! + 1);
971
+
972
+ // The payoff is linear on [0, k₀], between consecutive kinks, and on [kₙ, ∞). Its extremes occur
973
+ // at a kink, at S=0, or at ±∞ per the right-tail slope (S ≥ 0, so the left tail is bounded).
974
+ const pnl0 = this.pnlAtExpiry(0);
975
+ // An unbounded tail is `null` with its `bounded` flag false (B3) — never `Infinity`, which
976
+ // JSON drops and which read as "the best trade" in a ratio.
977
+ const bounded = { profit: !(rightSlope > EPS), loss: !(rightSlope < -EPS) };
978
+ const maxProfit = bounded.profit ? Math.max(pnl0, ...pnl) : null;
979
+ const maxLoss = bounded.loss ? Math.min(pnl0, ...pnl) : null;
980
+
981
+ const breakevens: number[] = [];
982
+ const add = (x: number): void => {
983
+ if (Number.isFinite(x) && !breakevens.some((b) => Math.abs(b - x) < 1e-9)) breakevens.push(x);
984
+ };
985
+ // A kink sitting exactly on zero is itself a breakeven (e.g. a lone long stock at its entry).
986
+ kinks.forEach((k, i) => {
987
+ if (Math.abs(pnl[i]!) < 1e-9) add(k);
988
+ });
989
+ // Interior segments: an exact root wherever consecutive kinks straddle zero.
990
+ for (let i = 0; i < kinks.length - 1; i++) {
991
+ const a = pnl[i]!;
992
+ const b = pnl[i + 1]!;
993
+ if ((a < 0 && b > 0) || (a > 0 && b < 0)) {
994
+ add(kinks[i]! + ((kinks[i + 1]! - kinks[i]!) * (0 - a)) / (b - a));
995
+ }
996
+ }
997
+ // Left tail (0 ≤ x < k₀): crossing off the first kink using the analytic left slope.
998
+ if (Math.abs(leftSlope) > EPS) {
999
+ const x = kinks[0]! - pnl[0]! / leftSlope;
1000
+ if (x >= 0 && x < kinks[0]!) add(x);
1001
+ }
1002
+ // Right tail (x > kₙ): crossing off the last kink using the analytic right slope.
1003
+ if (Math.abs(rightSlope) > EPS) {
1004
+ const last = kinks.length - 1;
1005
+ const x = kinks[last]! - pnl[last]! / rightSlope;
1006
+ if (x > kinks[last]!) add(x);
1007
+ }
1008
+ breakevens.sort((a, b) => a - b);
1009
+
1010
+ return { netDebit, netCredit: -netDebit, maxProfit, maxLoss, bounded, breakevens };
1011
+ }
1012
+
1013
+ /**
1014
+ * Strike-derived default price window for the chart/scenario methods when a caller omits `prices` —
1015
+ * the same auto-range a payoff diagram draws: strikes (stock legs use their entry price), finite
1016
+ * breakevens (single-expiry only), and any known spot. Keeps a bare `payoff()` / `chartData()` /
1017
+ * `scenarioTable()` useful instead of forcing a hand-picked grid.
1018
+ */
1019
+ private defaultPriceRange(): PriceRange {
1020
+ const singleExpiry = optionExpiries(this.legs).size <= 1;
1021
+ return autoPriceRange([
1022
+ ...this.legs.map((l) => (l.kind === 'stock' ? l.price : l.strike)),
1023
+ ...(singleExpiry ? this.metrics().breakevens : []),
1024
+ ...(this.market?.spot !== undefined ? [this.market.spot] : []),
1025
+ ]);
1026
+ }
1027
+
1028
+ /**
1029
+ * Expiration payoff metrics plus a chart-ready grid of points (spec §12.2). `prices` is an explicit
1030
+ * grid array or a `{ from, to, steps }` range; omit it to frame the strike-derived default window
1031
+ * (the same one a payoff diagram draws).
1032
+ */
1033
+ payoff(options: { prices?: number[] | PriceRange } = {}): PayoffResult {
1034
+ requireArgumentObject('strategy.payoff', 'options', options);
1035
+ this.assertSingleExpiry('payoff');
1036
+ const points = resolveGrid(options.prices, () => this.defaultPriceRange()).map(
1037
+ (underlyingPrice) => ({
1038
+ underlyingPrice,
1039
+ pnl: this.pnlAtExpiry(underlyingPrice),
1040
+ }),
1041
+ );
1042
+ return { ...this.metrics(), points };
1043
+ }
1044
+
1045
+ private markToMarketAssumptions(input: {
1046
+ timeToExpiryYears: number | undefined;
1047
+ asOf: number;
1048
+ dividendYield: number;
1049
+ volatilitySource: VolatilitySource;
1050
+ marketSource: MarketSource;
1051
+ }): Assumptions<{ volatilitySource: VolatilitySource; marketSource: MarketSource }> {
1052
+ const { timeToExpiryYears: t, asOf, dividendYield: q, volatilitySource, marketSource } = input;
1053
+ return {
1054
+ conventionsVersion: CONVENTIONS_VERSION,
1055
+ dayCount: 'ACT/365F',
1056
+ compounding: 'continuous',
1057
+ asOf,
1058
+ // A fully multi-expiry position (calendar/diagonal) has no position-level time-to-expiry:
1059
+ // every leg prices at its own t, so echoing one here would disclose an unused assumption.
1060
+ ...(t !== undefined ? { timeToExpiryYears: t } : {}),
1061
+ dividendModel: q === 0 ? 'none' : 'continuousYield',
1062
+ units: DEFAULT_GREEK_UNITS,
1063
+ model: 'black-scholes-merton',
1064
+ engine: 'black-scholes-merton',
1065
+ volatilitySource,
1066
+ marketSource,
1067
+ };
1068
+ }
1069
+
1070
+ /** Mark-to-market value, P&L, per-leg and aggregate Greeks via BSM (spec §12.3). */
1071
+ value(overrides: Partial<MarkToMarketInput> = {}): MarkToMarketResult {
1072
+ // Validate at the boundary before the trusted low-level kernels, so an invalid MTM input never
1073
+ // surfaces as a NaN value/Greeks with `converged: true` (design law #4).
1074
+ const functionName = 'strategy.value';
1075
+ // A position-level `expiry` is required only when some OPTION lacks its own: a fully multi-expiry
1076
+ // position (calendar/diagonal) prices every leg at its own expiry, so demanding one would ask
1077
+ // for a pricing-irrelevant fact — and any supplied one is neither consumed nor echoed.
1078
+ const expiries = optionExpiries(this.legs);
1079
+ const needsPositionExpiry = expiries.has(undefined);
1080
+ const isFullyMultiExpiry = !needsPositionExpiry && expiries.size > 1;
1081
+ // The construction market is the default; call fields merge over it (R5).
1082
+ const { merged: input, marketSource } = this.resolveMarket(
1083
+ overrides,
1084
+ functionName,
1085
+ needsPositionExpiry
1086
+ ? ['spot', 'riskFreeRate', 'asOf', 'expiry']
1087
+ : ['spot', 'riskFreeRate', 'asOf'],
1088
+ ) as { merged: MarkToMarketInput; marketSource: MarketSource };
1089
+ ensurePositive(input.spot, 'spot', functionName, ErrorCode.InputNegativeSpot);
1090
+ ensureFinite(input.riskFreeRate, 'riskFreeRate', functionName);
1091
+ const asOfMs = resolveValuationAsOf(input.asOf, functionName);
1092
+ ensureFinite(asOfMs, 'asOf', functionName);
1093
+ const q = input.dividendYield ?? 0;
1094
+ ensureFinite(q, 'dividendYield', functionName);
1095
+ // Position-level time-to-expiry, via the shared option-expiry convention (date-only → 16:00 ET,
1096
+ // datetime parsed) so a same-day 0DTE contract keeps positive time-to-expiry instead of
1097
+ // collapsing to t<0. Undefined for stock-only or fully multi-expiry positions (no shared t).
1098
+ let timeToExpiryYears: number | undefined;
1099
+ if (expiries.size > 0 && !isFullyMultiExpiry && input.expiry !== undefined) {
1100
+ timeToExpiryYears = yearFraction(asOfMs, optionExpiryToMs(input.expiry), 'ACT/365F');
1101
+ ensureFinite(timeToExpiryYears, 'timeToExpiryYears', functionName); // catches an unparseable expiry (→ NaN)
1102
+ }
1103
+ // Per-leg time-to-expiry: a leg with its own `expiry` (calendars/diagonals) is priced at its own
1104
+ // TTE; legs without one use the position-level expiry (`t` is guaranteed defined for them by the
1105
+ // `needsPositionExpiry` requirement above). Cache by expiry string to avoid re-parsing.
1106
+ const legTimeCache = new Map<string, number>();
1107
+ const legTime = (leg: Leg): number => {
1108
+ if (leg.expiry === undefined) return timeToExpiryYears!;
1109
+ const cached = legTimeCache.get(leg.expiry);
1110
+ if (cached !== undefined) return cached;
1111
+ const lt = yearFraction(asOfMs, optionExpiryToMs(leg.expiry), 'ACT/365F');
1112
+ ensureFinite(lt, 'timeToExpiryYears', functionName);
1113
+ legTimeCache.set(leg.expiry, lt);
1114
+ return lt;
1115
+ };
1116
+ // Per-leg volatility (WS7.1): a leg prices at its own `impliedVolatility` when set, else the
1117
+ // position-level `volatility`. Each future option leg needs a positive volatility from one of
1118
+ // those two sources; a leg with its own `impliedVolatility` does not require `input.volatility`.
1119
+ // Validate every applicable source and record where the volatility came from.
1120
+ let usesLegVolatility = false;
1121
+ let usesPositionVolatility = false;
1122
+ let usesCallVolatility = false;
1123
+ // Per-call overrides (Preview P1): an array aligned to the legs; a number overrides that leg's
1124
+ // volatility for this call, `undefined` leaves the leg's own precedence untouched.
1125
+ const legVolatilities = input.legVolatilities;
1126
+ if (legVolatilities !== undefined) {
1127
+ if (!Array.isArray(legVolatilities) || legVolatilities.length !== this.legs.length) {
1128
+ throw new InputError(
1129
+ `${functionName}: legVolatilities must be an array aligned to the position's ${this.legs.length} legs (a number overrides that leg's volatility for this call; undefined leaves it). Received ${Array.isArray(legVolatilities) ? `${legVolatilities.length} entries` : legVolatilities === null ? 'null' : typeof legVolatilities}.`,
1130
+ { code: ErrorCode.InputWrongShape, context: { field: 'legVolatilities' } },
1131
+ );
1132
+ }
1133
+ legVolatilities.forEach((v, i) => {
1134
+ if (v === undefined) return;
1135
+ ensurePositive(v, `legVolatilities[${i}]`, functionName, ErrorCode.InputNegativeVolatility);
1136
+ });
1137
+ }
1138
+ const callVolatility = (index: number): number | undefined =>
1139
+ legVolatilities === undefined ? undefined : legVolatilities[index];
1140
+ for (const [index, leg] of this.legs.entries()) {
1141
+ if (leg.kind === 'stock' || legTime(leg) <= EPS) continue; // expired/stock legs use no vol
1142
+ if (callVolatility(index) !== undefined) {
1143
+ usesCallVolatility = true;
1144
+ } else if (leg.impliedVolatility !== undefined) {
1145
+ ensurePositive(
1146
+ leg.impliedVolatility,
1147
+ 'leg.impliedVolatility',
1148
+ functionName,
1149
+ ErrorCode.InputNegativeVolatility,
1150
+ );
1151
+ usesLegVolatility = true;
1152
+ } else {
1153
+ usesPositionVolatility = true;
1154
+ }
1155
+ }
1156
+ if (usesPositionVolatility) {
1157
+ // At least one un-expired leg has no per-leg iv, so a position-level vol is required here.
1158
+ if (input.volatility === undefined) {
1159
+ throw new InputError(
1160
+ `${functionName}: a leg without its own impliedVolatility needs a position-level volatility; ` +
1161
+ `pass \`volatility\` (or give every leg an impliedVolatility).`,
1162
+ { code: ErrorCode.InputMissingField, context: { field: 'volatility' } },
1163
+ );
1164
+ }
1165
+ ensurePositive(
1166
+ input.volatility,
1167
+ 'volatility',
1168
+ functionName,
1169
+ ErrorCode.InputNegativeVolatility,
1170
+ );
1171
+ }
1172
+ const volatilitySource: VolatilitySource = usesCallVolatility
1173
+ ? 'perCall'
1174
+ : usesLegVolatility && usesPositionVolatility
1175
+ ? 'mixed'
1176
+ : usesLegVolatility
1177
+ ? 'perLeg'
1178
+ : 'position';
1179
+ // An additive vol shock applies to EVERY effective leg vol (per-leg `iv` and position `vol`), so
1180
+ // a scenario shock actually reaches per-leg-IV legs instead of being silently ignored.
1181
+ const volatilityShock = input.volatilityShock ?? 0;
1182
+ let volatilityFloored = false;
1183
+ const S = input.spot;
1184
+ const perLeg = [];
1185
+ const agg = zeroExtendedGreeks();
1186
+ let currentValue = 0;
1187
+ let entryValue = 0;
1188
+
1189
+ for (const [legIndex, leg] of this.legs.entries()) {
1190
+ if (leg.kind === 'stock') {
1191
+ const v = leg.quantity * S;
1192
+ const entry = leg.quantity * leg.price;
1193
+ // Stock is pure delta (elasticity 1); every option greek is 0.
1194
+ const g: ExtendedGreeks = { ...zeroExtendedGreeks(), delta: leg.quantity, lambda: 1 };
1195
+ perLeg.push({ leg, value: v, pnl: v - entry, greeks: g });
1196
+ currentValue += v;
1197
+ entryValue += entry;
1198
+ agg.delta += g.delta;
1199
+ continue;
1200
+ }
1201
+ const scaled = leg.quantity * this.multiplier;
1202
+ const tLeg = legTime(leg);
1203
+ let price: number;
1204
+ let g: ExtendedGreeks;
1205
+ if (tLeg <= EPS) {
1206
+ // At/after this leg's expiry: value at intrinsic, Greeks zero.
1207
+ price = leg.kind === 'call' ? Math.max(S - leg.strike, 0) : Math.max(leg.strike - S, 0);
1208
+ g = zeroExtendedGreeks();
1209
+ } else {
1210
+ // `input.vol` is guaranteed present here when a leg has no iv (validated above).
1211
+ let legVolatility =
1212
+ (callVolatility(legIndex) ?? leg.impliedVolatility ?? input.volatility!) +
1213
+ volatilityShock;
1214
+ if (legVolatility < VOL_FLOOR) {
1215
+ legVolatility = VOL_FLOOR;
1216
+ volatilityFloored = true;
1217
+ }
1218
+ price = blackScholesPrice({
1219
+ type: leg.kind,
1220
+ spot: S,
1221
+ strike: leg.strike,
1222
+ timeToExpiryYears: tLeg,
1223
+ riskFreeRate: input.riskFreeRate,
1224
+ dividendYield: q,
1225
+ volatility: legVolatility,
1226
+ });
1227
+ // Extended greeks (not just first-order): the second-order fields power the higher-order P&L
1228
+ // attribution in `explainPositionPnl` (@insiderfinance/totalfinance/risk) automatically. All are raw and scale
1229
+ // linearly with position size; `lambda` (Δ·S/V) is dimensionless and passes through unscaled.
1230
+ const lg = blackScholesExtendedGreeks({
1231
+ type: leg.kind,
1232
+ spot: S,
1233
+ strike: leg.strike,
1234
+ timeToExpiryYears: tLeg,
1235
+ riskFreeRate: input.riskFreeRate,
1236
+ dividendYield: q,
1237
+ volatility: legVolatility,
1238
+ });
1239
+ g = {
1240
+ delta: lg.delta * scaled,
1241
+ gamma: lg.gamma * scaled,
1242
+ theta: lg.theta * scaled,
1243
+ vega: lg.vega * scaled,
1244
+ rho: lg.rho * scaled,
1245
+ vanna: lg.vanna * scaled,
1246
+ charm: lg.charm * scaled,
1247
+ vomma: lg.vomma * scaled,
1248
+ speed: lg.speed * scaled,
1249
+ color: lg.color * scaled,
1250
+ phi: lg.phi * scaled,
1251
+ zomma: lg.zomma * scaled,
1252
+ veta: lg.veta * scaled,
1253
+ vera: lg.vera * scaled,
1254
+ ultima: lg.ultima * scaled,
1255
+ lambda: lg.lambda,
1256
+ };
1257
+ }
1258
+ const v = scaled * price;
1259
+ const entry = scaled * leg.premium;
1260
+ perLeg.push({ leg, value: v, pnl: v - entry, greeks: g });
1261
+ currentValue += v;
1262
+ entryValue += entry;
1263
+ agg.delta += g.delta;
1264
+ agg.gamma += g.gamma;
1265
+ agg.theta += g.theta;
1266
+ agg.vega += g.vega;
1267
+ agg.rho += g.rho;
1268
+ agg.vanna += g.vanna;
1269
+ agg.charm += g.charm;
1270
+ agg.vomma += g.vomma;
1271
+ agg.speed += g.speed;
1272
+ agg.color += g.color;
1273
+ agg.phi += g.phi;
1274
+ agg.zomma += g.zomma;
1275
+ agg.veta += g.veta;
1276
+ agg.vera += g.vera;
1277
+ agg.ultima += g.ultima;
1278
+ }
1279
+ // Book elasticity Λ = Δ·S / V (dimensionless; not additive across legs, so recomputed here). Null
1280
+ // when the book value underflows to 0 — elasticity is undefined at V = 0 (Law 7), never ±∞/NaN.
1281
+ const aggLambda = (agg.delta * S) / currentValue;
1282
+ agg.lambda = Number.isFinite(aggLambda) ? aggLambda : null;
1283
+
1284
+ const pnl = currentValue - entryValue;
1285
+ const warnings: QuantWarning[] = [];
1286
+ if (volatilityFloored) {
1287
+ warnings.push({
1288
+ code: WarningCode.StrategyVolatilityFloored,
1289
+ message: `An effective leg volatility fell below the ${VOL_FLOOR} floor after the vol shock and was priced at the floor, not the requested shock.`,
1290
+ severity: 'warn',
1291
+ });
1292
+ }
1293
+ const diagnostics: Diagnostics = {
1294
+ engine: 'black-scholes-merton',
1295
+ method: 'closed-form',
1296
+ converged: true,
1297
+ warnings,
1298
+ };
1299
+ return {
1300
+ value: pnl,
1301
+ pnl,
1302
+ perLeg,
1303
+ greeks: agg,
1304
+ assumptions: this.markToMarketAssumptions({
1305
+ timeToExpiryYears,
1306
+ asOf: asOfMs,
1307
+ dividendYield: q,
1308
+ volatilitySource,
1309
+ marketSource,
1310
+ }),
1311
+ diagnostics,
1312
+ };
1313
+ }
1314
+
1315
+ /**
1316
+ * Probability-metric assumptions (R2 envelope): applied conventions plus where the market fields
1317
+ * came from (construction/call/merged, R5) — carried in `assumptions`, never hoisted top-level.
1318
+ */
1319
+ private probabilityAssumptions(
1320
+ asOf: number,
1321
+ timeToExpiryYears: number,
1322
+ marketSource: MarketSource,
1323
+ probabilityModel: ProbabilityModel,
1324
+ ): Assumptions<{ marketSource: MarketSource; probabilityModel: ProbabilityModel }> {
1325
+ return {
1326
+ conventionsVersion: CONVENTIONS_VERSION,
1327
+ dayCount: 'ACT/365F',
1328
+ asOf,
1329
+ timeToExpiryYears,
1330
+ marketSource,
1331
+ probabilityModel,
1332
+ };
1333
+ }
1334
+
1335
+ /**
1336
+ * Probability & scenario metrics (spec §12.6): probability of profit, expected value, reward/risk,
1337
+ * and the probability of touching each breakeven — under an explicit, echoed lognormal model.
1338
+ */
1339
+ probability(overrides: Partial<ProbabilityInput> = {}): ProbabilityMetrics {
1340
+ const functionName = 'strategy.probability';
1341
+ this.assertSingleExpiry('probability');
1342
+ // The construction market is the default; call fields merge over it (R5). A position built
1343
+ // with { premiums: 'model', market } answers probability() with no arguments at all.
1344
+ const { merged: input, marketSource } = this.resolveMarket(overrides, functionName, [
1345
+ 'spot',
1346
+ 'volatility',
1347
+ 'riskFreeRate',
1348
+ 'asOf',
1349
+ 'expiry',
1350
+ ]) as { merged: ProbabilityInput; marketSource: MarketSource };
1351
+ ensurePositive(input.spot, 'spot', functionName, ErrorCode.InputNegativeSpot);
1352
+ ensureFinite(input.riskFreeRate, 'riskFreeRate', functionName);
1353
+ const asOfMs = resolveValuationAsOf(input.asOf, functionName);
1354
+ ensureFinite(asOfMs, 'asOf', functionName);
1355
+ const q = input.dividendYield ?? 0;
1356
+ ensureFinite(q, 'dividendYield', functionName);
1357
+ // Resolve the expiry via the shared option-expiry convention (date-only → 16:00 ET, datetime
1358
+ // parsed) so a same-day 0DTE contract keeps positive time-to-expiry instead of collapsing to t<0.
1359
+ const t = yearFraction(asOfMs, optionExpiryToMs(input.expiry), 'ACT/365F');
1360
+ ensureFinite(t, 'timeToExpiryYears', functionName);
1361
+ if (t > EPS)
1362
+ ensurePositive(
1363
+ input.volatility,
1364
+ 'volatility',
1365
+ functionName,
1366
+ ErrorCode.InputNegativeVolatility,
1367
+ );
1368
+
1369
+ const measure = input.measure ?? 'riskNeutral';
1370
+ // Reject an unknown measure rather than silently treating it as risk-neutral and echoing it back.
1371
+ if (measure !== 'riskNeutral' && measure !== 'realWorld') {
1372
+ throw new InputError(
1373
+ `${functionName}: measure must be 'riskNeutral' or 'realWorld', got "${measure}".`,
1374
+ {
1375
+ code: ErrorCode.InputInvalidEnum,
1376
+ context: { measure },
1377
+ },
1378
+ );
1379
+ }
1380
+ // `realWorld` REQUIRES its drift. The old `?? input.riskFreeRate` fallback made an omitted
1381
+ // `expectedReturn` silently reproduce the risk-neutral answer while the echoed
1382
+ // `assumptions.probabilityModel.measure` still claimed 'realWorld' — a result that says it is
1383
+ // one thing and is another. Same contract the what-if cube's model grammar already enforces.
1384
+ requireExpectedReturn(functionName, measure, input.expectedReturn);
1385
+ const drift = (measure === 'realWorld' ? input.expectedReturn! : input.riskFreeRate) - q;
1386
+ const S0 = input.spot;
1387
+ const sigma = input.volatility;
1388
+ const m = this.metrics();
1389
+
1390
+ // Profit regions are the intervals between sorted breakevens (plus 0 and ∞); POP sums the
1391
+ // lognormal probability mass of the regions where expiration P&L is positive.
1392
+ const bes = [...m.breakevens].sort((a, b) => a - b);
1393
+ const edges = [0, ...bes, Infinity];
1394
+ let pop = 0;
1395
+ for (let i = 0; i < edges.length - 1; i++) {
1396
+ const lo = edges[i]!;
1397
+ const hi = edges[i + 1]!;
1398
+ const rep =
1399
+ lo === 0 && hi === Infinity
1400
+ ? S0
1401
+ : lo === 0
1402
+ ? hi / 2
1403
+ : hi === Infinity
1404
+ ? lo + Math.max(S0, lo * 0.5)
1405
+ : (lo + hi) / 2;
1406
+ if (this.pnlAtExpiry(rep) > 0) {
1407
+ const cdfLo =
1408
+ lo === 0
1409
+ ? 0
1410
+ : terminalCdf({
1411
+ spot: S0,
1412
+ strike: lo,
1413
+ drift,
1414
+ volatility: sigma,
1415
+ timeToExpiryYears: t,
1416
+ });
1417
+ const cdfHi =
1418
+ hi === Infinity
1419
+ ? 1
1420
+ : terminalCdf({
1421
+ spot: S0,
1422
+ strike: hi,
1423
+ drift,
1424
+ volatility: sigma,
1425
+ timeToExpiryYears: t,
1426
+ });
1427
+ pop += cdfHi - cdfLo;
1428
+ }
1429
+ }
1430
+
1431
+ // Expected expiration P&L: per leg, closed-form expected intrinsic (undiscounted) minus premium.
1432
+ let ev = 0;
1433
+ for (const leg of this.legs) {
1434
+ if (leg.kind === 'stock') {
1435
+ ev += leg.quantity * (S0 * Math.exp(drift * t) - leg.price);
1436
+ } else {
1437
+ const ei = expectedIntrinsic({
1438
+ type: leg.kind,
1439
+ spot: S0,
1440
+ strike: leg.strike,
1441
+ drift,
1442
+ volatility: sigma,
1443
+ timeToExpiryYears: t,
1444
+ });
1445
+ ev += leg.quantity * this.multiplier * (ei - leg.premium);
1446
+ }
1447
+ }
1448
+
1449
+ const { ratio: riskReward, warning: riskRewardWarning } = rewardToRisk(m);
1450
+ const probabilityOfTouch: TouchProbability[] = bes.map((price) => ({
1451
+ price,
1452
+ probability: touchProbability({
1453
+ spot: S0,
1454
+ barrier: price,
1455
+ drift,
1456
+ volatility: sigma,
1457
+ timeToExpiryYears: t,
1458
+ }),
1459
+ }));
1460
+
1461
+ return {
1462
+ probabilityOfProfit: Math.min(1, Math.max(0, pop)),
1463
+ expectedValue: ev,
1464
+ riskReward,
1465
+ probabilityOfTouch,
1466
+ assumptions: this.probabilityAssumptions(asOfMs, t, marketSource, {
1467
+ measure,
1468
+ drift,
1469
+ volatility: sigma,
1470
+ volatilityModel: 'lognormal',
1471
+ timeToExpiryYears: t,
1472
+ }),
1473
+ diagnostics: { warnings: riskRewardWarning === null ? [] : [riskRewardWarning] },
1474
+ };
1475
+ }
1476
+
1477
+ /**
1478
+ * Monte-Carlo probability metrics (spec §12.6): the simulated analogue of {@link probability}, for
1479
+ * cross-validation and path-dependent reads. Terminal lognormal paths give the probability of profit
1480
+ * and expected P&L (with a standard error); the probability of touching each breakeven is estimated
1481
+ * with the Brownian-bridge continuous-monitoring correction. Seeded and deterministic.
1482
+ */
1483
+ monteCarloProbability(
1484
+ overrides: Partial<ProbabilityMonteCarloInput> & { seed: number },
1485
+ ): ProbabilityMonteCarloMetrics {
1486
+ const functionName = 'strategy.monteCarloProbability';
1487
+ // Unlike `probability()`/`value()`, this has no defaultable empty input — a simulation needs an
1488
+ // explicit `seed` (the determinism law never invents one) — so a bare call teaches the seed
1489
+ // requirement directly instead of a generic shape error.
1490
+ if (overrides === undefined || overrides === null) {
1491
+ throw new InputError(
1492
+ `${functionName}: a Monte-Carlo run must be explicitly seeded — call monteCarloProbability({ seed: 42 }). ` +
1493
+ `Market fields (spot, volatility, rate, asOf, expiry) default from the construction market; the seed never defaults.`,
1494
+ { code: ErrorCode.InputMissingField, context: { missing: ['seed'] } },
1495
+ );
1496
+ }
1497
+ requireArgumentObject(functionName, 'overrides', overrides);
1498
+ this.assertSingleExpiry('monteCarloProbability');
1499
+ // Market fields default from construction (R5); the seed is never defaulted — a simulation
1500
+ // must be explicitly, reproducibly seeded.
1501
+ const { merged: input, marketSource } = this.resolveMarket(overrides, functionName, [
1502
+ 'spot',
1503
+ 'riskFreeRate',
1504
+ 'asOf',
1505
+ 'expiry',
1506
+ ]) as { merged: ProbabilityMonteCarloInput; marketSource: MarketSource };
1507
+ ensurePositive(input.spot, 'spot', functionName, ErrorCode.InputNegativeSpot);
1508
+ ensureFinite(input.riskFreeRate, 'riskFreeRate', functionName);
1509
+ const asOfMs = resolveValuationAsOf(input.asOf, functionName);
1510
+ ensureFinite(asOfMs, 'asOf', functionName);
1511
+ ensureFinite(input.seed, 'seed', functionName);
1512
+ const q = input.dividendYield ?? 0;
1513
+ ensureFinite(q, 'dividendYield', functionName);
1514
+ const t = yearFraction(asOfMs, optionExpiryToMs(input.expiry), 'ACT/365F');
1515
+ ensureFinite(t, 'timeToExpiryYears', functionName);
1516
+ ensurePositive(t, 'timeToExpiryYears', functionName);
1517
+ const useLocalVolatility = input.localVolatility !== undefined;
1518
+ if (!useLocalVolatility && input.volatility === undefined) {
1519
+ throw new InputError(
1520
+ `${functionName}: provide volatility (constant-σ) or localVolatility (smile-aware).`,
1521
+ {
1522
+ code: ErrorCode.InputMissingField,
1523
+ context: {},
1524
+ },
1525
+ );
1526
+ }
1527
+ if (input.volatility !== undefined)
1528
+ ensurePositive(
1529
+ input.volatility,
1530
+ 'volatility',
1531
+ functionName,
1532
+ ErrorCode.InputNegativeVolatility,
1533
+ );
1534
+
1535
+ const measure = input.measure ?? 'riskNeutral';
1536
+ if (measure !== 'riskNeutral' && measure !== 'realWorld') {
1537
+ throw new InputError(
1538
+ `${functionName}: measure must be 'riskNeutral' or 'realWorld', got "${measure}".`,
1539
+ {
1540
+ code: ErrorCode.InputInvalidEnum,
1541
+ context: { measure },
1542
+ },
1543
+ );
1544
+ }
1545
+ requireExpectedReturn(functionName, measure, input.expectedReturn);
1546
+ const drift = (measure === 'realWorld' ? input.expectedReturn! : input.riskFreeRate) - q;
1547
+
1548
+ // Safe integers AND work caps (2026-08-23 review, P0, reviewer-named): see the
1549
+ // MAX_MC_PROBABILITY_* constants — above 2^53 the loop counters cannot advance at all, and the
1550
+ // paths × steps PRODUCT is the real workload, so it is bounded alongside each factor.
1551
+ const paths = input.paths ?? 50_000;
1552
+ if (!Number.isSafeInteger(paths) || paths < 2 || paths > MAX_MC_PROBABILITY_PATHS) {
1553
+ throw new InputError(
1554
+ `${functionName}: paths must be an integer in [2, ${MAX_MC_PROBABILITY_PATHS.toLocaleString('en-US')}] — every path simulates the full step grid and updates a touch estimate per breakeven, and win-rate standard error ∝ 1/√paths gains only 3× per extra decade. Received ${paths}.\n e.g. monteCarloProbability({ seed: 42, paths: 100_000 })`,
1555
+ {
1556
+ code: ErrorCode.InputOutOfRange,
1557
+ context: { paths, max: MAX_MC_PROBABILITY_PATHS },
1558
+ },
1559
+ );
1560
+ }
1561
+ const steps = input.steps ?? 50;
1562
+ if (!Number.isSafeInteger(steps) || steps < 1 || steps > MAX_MC_PROBABILITY_STEPS) {
1563
+ throw new InputError(
1564
+ `${functionName}: steps must be an integer in [1, ${MAX_MC_PROBABILITY_STEPS.toLocaleString('en-US')}] — each step is one normal draw per path (plus a local-vol sample when smile-aware), and the touch estimator's bridge correction already covers what finer stepping would add. Received ${steps}.\n e.g. monteCarloProbability({ seed: 42, steps: 100 })`,
1565
+ {
1566
+ code: ErrorCode.InputOutOfRange,
1567
+ context: { steps, max: MAX_MC_PROBABILITY_STEPS },
1568
+ },
1569
+ );
1570
+ }
1571
+ if (paths * steps > MAX_MC_PROBABILITY_PATH_STEPS) {
1572
+ throw new InputError(
1573
+ `${functionName}: paths × steps must not exceed ${MAX_MC_PROBABILITY_PATH_STEPS.toLocaleString('en-US')} — the product is the total simulation workload (one inverse-CDF draw per path-step, ~4–8 s at the cap), so each factor being under its own cap proves nothing. Received ${paths} × ${steps} = ${(paths * steps).toLocaleString('en-US')}.\n e.g. monteCarloProbability({ seed: 42, paths: 100_000, steps: 100 })`,
1574
+ {
1575
+ code: ErrorCode.InputOutOfRange,
1576
+ context: { paths, steps, maxPathSteps: MAX_MC_PROBABILITY_PATH_STEPS },
1577
+ },
1578
+ );
1579
+ }
1580
+
1581
+ const S0 = input.spot;
1582
+ const localVolatilityFn = input.localVolatility;
1583
+ // Representative echo vol: local vol at (spot, t) when smile-aware, else the constant σ.
1584
+ const echoVolatility = useLocalVolatility
1585
+ ? sampleLocalVolatility(localVolatilityFn!, S0, t, functionName)
1586
+ : input.volatility!;
1587
+ const bes = [...this.metrics().breakevens].sort((x, y) => x - y);
1588
+ const randomNumberGenerator = mulberry32(input.seed);
1589
+ const timeStepYears = t / steps;
1590
+ const sqdt = Math.sqrt(timeStepYears);
1591
+
1592
+ const wantQuantiles = input.pnlQuantiles !== undefined && input.pnlQuantiles.length > 0;
1593
+ if (wantQuantiles) {
1594
+ for (const q of input.pnlQuantiles!) {
1595
+ if (!(q > 0 && q < 1)) {
1596
+ throw new InputError(`${functionName}: each pnlQuantile must be in (0, 1), got ${q}.`, {
1597
+ code: ErrorCode.InputOutOfRange,
1598
+ context: { quantile: q },
1599
+ });
1600
+ }
1601
+ }
1602
+ }
1603
+ const pnls = wantQuantiles ? new Array<number>(paths) : undefined;
1604
+
1605
+ let wins = 0;
1606
+ let evSum = 0;
1607
+ let evSumSq = 0;
1608
+ const touchSum = new Array<number>(bes.length).fill(0);
1609
+
1610
+ for (let p = 0; p < paths; p++) {
1611
+ let logS = Math.log(S0);
1612
+ let prevS = S0;
1613
+ const survive = new Array<number>(bes.length).fill(1); // probability NOT yet touched
1614
+ for (let i = 0; i < steps; i++) {
1615
+ // Constant σ, or the Dupire local vol at the price/time reached this step (smile-aware paths).
1616
+ const sig = useLocalVolatility
1617
+ ? sampleLocalVolatility(
1618
+ localVolatilityFn!,
1619
+ prevS,
1620
+ (i + 0.5) * timeStepYears,
1621
+ functionName,
1622
+ )
1623
+ : input.volatility!;
1624
+ const sig2dt = sig * sig * timeStepYears;
1625
+ logS +=
1626
+ (drift - 0.5 * sig * sig) * timeStepYears +
1627
+ sig * sqdt * normalInverseCdf(randomNumberGenerator.next());
1628
+ const s = Math.exp(logS);
1629
+ for (let b = 0; b < bes.length; b++) {
1630
+ const H = bes[b]!;
1631
+ if ((prevS - H) * (s - H) <= 0) {
1632
+ survive[b] = 0; // discrete crossing ⇒ definitely touched
1633
+ } else {
1634
+ // Brownian-bridge probability of having crossed H between prevS and s (same side).
1635
+ survive[b]! *= 1 - Math.exp((-2 * Math.log(prevS / H) * Math.log(s / H)) / sig2dt);
1636
+ }
1637
+ }
1638
+ prevS = s;
1639
+ }
1640
+ const pnl = this.pnlAtExpiry(prevS);
1641
+ if (pnl > 0) wins++;
1642
+ evSum += pnl;
1643
+ evSumSq += pnl * pnl;
1644
+ if (pnls) pnls[p] = pnl;
1645
+ for (let b = 0; b < bes.length; b++) touchSum[b]! += 1 - survive[b]!;
1646
+ }
1647
+
1648
+ const ev = evSum / paths;
1649
+ const variance = Math.max(0, (evSumSq - paths * ev * ev) / (paths - 1));
1650
+ const result: ProbabilityMonteCarloMetrics = {
1651
+ probabilityOfProfit: wins / paths,
1652
+ expectedValue: ev,
1653
+ expectedValueStandardError: Math.sqrt(variance / paths),
1654
+ probabilityOfTouch: bes.map((price, b) => ({ price, probability: touchSum[b]! / paths })),
1655
+ paths,
1656
+ seed: input.seed,
1657
+ assumptions: this.probabilityAssumptions(asOfMs, t, marketSource, {
1658
+ measure,
1659
+ drift,
1660
+ volatility: echoVolatility,
1661
+ volatilityModel: useLocalVolatility ? 'localVolatility' : 'lognormal',
1662
+ timeToExpiryYears: t,
1663
+ }),
1664
+ };
1665
+ if (pnls) {
1666
+ pnls.sort((a, b) => a - b);
1667
+ result.pnlQuantiles = input.pnlQuantiles!.map((q) => ({
1668
+ quantile: q,
1669
+ pnl: quantileSorted(pnls, q),
1670
+ }));
1671
+ }
1672
+ return result;
1673
+ }
1674
+
1675
+ /**
1676
+ * Scenario table (spec §12.6): mark-to-market P&L and Greeks across a grid of underlying prices,
1677
+ * additive vol shocks, and days forward — the standard "what-if" matrix for an options ticket.
1678
+ */
1679
+ scenarioTable(
1680
+ options: {
1681
+ /** Market overrides; defaults from the construction market (R5). */
1682
+ market?: Partial<Omit<MarkToMarketInput, 'spot'>>;
1683
+ /** Spot axis: an explicit grid array or a `{ from, to, steps }` range. Omit for the default window. */
1684
+ prices?: number[] | PriceRange;
1685
+ /** Additive vol shocks (decimal), e.g. `[-0.05, 0, 0.05]`. Default `[0]`. */
1686
+ volatilityShocks?: number[];
1687
+ /** Calendar days to advance `asOf`, e.g. `[0, 1, 7]`. Default `[0]`. */
1688
+ daysForward?: number[];
1689
+ } = {},
1690
+ ): ScenarioTableResult {
1691
+ const functionName = 'strategy.scenarioTable';
1692
+ requireArgumentObject(functionName, 'options', options);
1693
+ const prices = resolveGrid(options.prices, () => this.defaultPriceRange());
1694
+ const volatilityShocks = options.volatilityShocks ?? [0];
1695
+ const days = options.daysForward ?? [0];
1696
+ const DAY = 86_400_000;
1697
+ const market = options.market ?? {};
1698
+ // Where the table's market came from (R5): merge the caller's market fields over the
1699
+ // construction market exactly as the per-cell value() calls will. Nothing is REQUIRED here —
1700
+ // each cell's value() enforces the full field set — this only derives the honest echo.
1701
+ const { marketSource } = this.resolveMarket(
1702
+ market as Partial<PremiumMarket> & { expiry?: string },
1703
+ functionName,
1704
+ [],
1705
+ );
1706
+ const baseAsOfRaw = market.asOf ?? this.market?.asOf;
1707
+ if (baseAsOfRaw === undefined) {
1708
+ throw new InputError(
1709
+ `${functionName}: missing market field(s): asOf. Pass market.asOf, or build the ` +
1710
+ `position with { market: { spot, volatility, riskFreeRate, asOf, expiry } } so it defaults from it.`,
1711
+ { code: ErrorCode.InputMissingField, context: { missing: ['asOf'] } },
1712
+ );
1713
+ }
1714
+ const baseAsOf = resolveValuationAsOf(baseAsOfRaw, functionName);
1715
+ const rows: ScenarioRow[] = [];
1716
+ let clampedCells = 0;
1717
+ for (const underlyingPrice of prices) {
1718
+ for (const volatilityShock of volatilityShocks) {
1719
+ for (const daysForward of days) {
1720
+ // Route the shock through `value(volatilityShock)` so it reaches per-leg-IV legs (not just the
1721
+ // position `vol`); `value()` floors the effective vol and reports it, which we tally here.
1722
+ const markToMarket = this.value({
1723
+ ...market,
1724
+ spot: underlyingPrice,
1725
+ volatilityShock,
1726
+ asOf: baseAsOf + daysForward * DAY,
1727
+ });
1728
+ if (
1729
+ markToMarket.diagnostics.warnings.some((w) => w.code === 'strategy.volatility_floored')
1730
+ )
1731
+ clampedCells++;
1732
+ rows.push({
1733
+ underlyingPrice,
1734
+ volatilityShock,
1735
+ daysForward,
1736
+ pnl: markToMarket.pnl,
1737
+ delta: markToMarket.greeks.delta,
1738
+ gamma: markToMarket.greeks.gamma,
1739
+ theta: markToMarket.greeks.theta,
1740
+ vega: markToMarket.greeks.vega,
1741
+ });
1742
+ }
1743
+ }
1744
+ }
1745
+ const warnings: QuantWarning[] = [];
1746
+ if (clampedCells > 0) {
1747
+ warnings.push({
1748
+ code: WarningCode.StrategyVolatilityFloored,
1749
+ message: `${clampedCells} scenario cell(s) had a shocked volatility below the ${VOL_FLOOR} floor and were priced at the floor, not the requested shock.`,
1750
+ severity: 'warn',
1751
+ context: { clampedCells, volatilityFloor: VOL_FLOOR },
1752
+ });
1753
+ }
1754
+ // R2 one-envelope law: the grid is the `value`, `marketSource` lives in assumptions (never
1755
+ // hoisted), and the clamped-vol warnings ride `diagnostics.warnings` like every other result.
1756
+ return {
1757
+ value: rows,
1758
+ assumptions: { conventionsVersion: CONVENTIONS_VERSION, marketSource },
1759
+ diagnostics: {
1760
+ engine: 'black-scholes-merton',
1761
+ method: 'closed-form',
1762
+ converged: true,
1763
+ warnings,
1764
+ },
1765
+ };
1766
+ }
1767
+
1768
+ /**
1769
+ * A what-if **cube**: the position marked over the full spot × vol-shock × days-forward grid, plus
1770
+ * the **optimal-exit surface** — for each (spot, vol) outcome, the day along the time axis that
1771
+ * optimizes P&L (`max-pnl` by default, or `min-pnl`). `scenarioTable` extended a dimension: it returns
1772
+ * a navigable cube (axes + row-major cells) with the reductions a trader wants, not a flat row list.
1773
+ *
1774
+ * Every cell is a `value()` mark (time-aware, per-leg-IV, shock-through-to-leg-IV), so calendars and
1775
+ * per-leg volatilities behave identically. The optimal-exit surface is a CONDITIONAL what-if ("if the
1776
+ * underlying is here with this vol shock, which day marks best?"), not a path-dependent stopping rule.
1777
+ * See `docs/specs/what-if-cube.md`.
1778
+ */
1779
+ whatIfCube(options: WhatIfCubeOptions = {}): WhatIfCubeResult {
1780
+ const functionName = 'strategy.whatIfCube';
1781
+ requireArgumentObject(functionName, 'options', options);
1782
+ const prices = resolveGrid(options.prices, () => this.defaultPriceRange());
1783
+ const volatilityShocks = options.volatilityShocks ?? [0];
1784
+ const days = options.daysForward ?? [0];
1785
+ if (prices.length === 0 || volatilityShocks.length === 0 || days.length === 0) {
1786
+ throw new InputError(
1787
+ `${functionName}: prices, volatilityShocks, and daysForward must each be non-empty (a cube needs at least one of each axis).`,
1788
+ {
1789
+ code: ErrorCode.InputOutOfRange,
1790
+ context: {
1791
+ prices: prices.length,
1792
+ volatilityShocks: volatilityShocks.length,
1793
+ days: days.length,
1794
+ },
1795
+ },
1796
+ );
1797
+ }
1798
+ const objective = options.objective ?? 'max-pnl';
1799
+ if (objective !== 'max-pnl' && objective !== 'min-pnl') {
1800
+ throw new InputError(
1801
+ `${functionName}: objective must be 'max-pnl' or 'min-pnl'; got ${String(objective)}.`,
1802
+ {
1803
+ code: ErrorCode.InputInvalidEnum,
1804
+ context: { objective },
1805
+ },
1806
+ );
1807
+ }
1808
+ const DAY = 86_400_000;
1809
+ const market = options.market ?? {};
1810
+ const { marketSource } = this.resolveMarket(
1811
+ market as Partial<PremiumMarket> & { expiry?: string },
1812
+ functionName,
1813
+ [],
1814
+ );
1815
+ const baseAsOfRaw = market.asOf ?? this.market?.asOf;
1816
+ if (baseAsOfRaw === undefined) {
1817
+ throw new InputError(
1818
+ `${functionName}: missing market field(s): asOf. Pass market.asOf, or build the ` +
1819
+ `position with { market: { spot, volatility, riskFreeRate, asOf, expiry } } so it defaults from it.`,
1820
+ { code: ErrorCode.InputMissingField, context: { missing: ['asOf'] } },
1821
+ );
1822
+ }
1823
+ const baseAsOf = resolveValuationAsOf(baseAsOfRaw, functionName);
1824
+
1825
+ const cells: WhatIfCell[] = [];
1826
+ const optimalExit: OptimalExitPoint[] = [];
1827
+ let best: WhatIfCell | undefined;
1828
+ let worst: WhatIfCell | undefined;
1829
+ let clampedCells = 0;
1830
+ const better = (a: number, b: number): boolean => (objective === 'max-pnl' ? a > b : a < b);
1831
+
1832
+ // Break-even-time surface: first non-negative-P&L day per (price, vol). Price outer, vol inner.
1833
+ const breakEvenRows: Array<Array<number | null>> = [];
1834
+ // Row-major: price outer, vol middle, day inner — so `cells` index is ((i·|vol|)+j)·|days|+k.
1835
+ for (const underlyingPrice of prices) {
1836
+ const beRow: Array<number | null> = [];
1837
+ for (const volatilityShock of volatilityShocks) {
1838
+ let exit: OptimalExitPoint | undefined;
1839
+ let firstNonNegativeDay: number | null = null;
1840
+ for (const daysForward of days) {
1841
+ const markToMarket = this.value({
1842
+ ...market,
1843
+ spot: underlyingPrice,
1844
+ volatilityShock,
1845
+ asOf: baseAsOf + daysForward * DAY,
1846
+ });
1847
+ if (
1848
+ markToMarket.diagnostics.warnings.some((w) => w.code === 'strategy.volatility_floored')
1849
+ )
1850
+ clampedCells++;
1851
+ const cell: WhatIfCell = {
1852
+ underlyingPrice,
1853
+ volatilityShock,
1854
+ daysForward,
1855
+ pnl: markToMarket.pnl,
1856
+ delta: markToMarket.greeks.delta,
1857
+ gamma: markToMarket.greeks.gamma,
1858
+ theta: markToMarket.greeks.theta,
1859
+ vega: markToMarket.greeks.vega,
1860
+ };
1861
+ cells.push(cell);
1862
+ if (exit === undefined || better(cell.pnl, exit.pnl)) {
1863
+ exit = { underlyingPrice, volatilityShock, daysForward, pnl: cell.pnl };
1864
+ }
1865
+ // First requested day with non-negative P&L (a conditional surface; not assumed monotone).
1866
+ if (firstNonNegativeDay === null && cell.pnl >= 0) firstNonNegativeDay = daysForward;
1867
+ if (best === undefined || cell.pnl > best.pnl) best = cell;
1868
+ if (worst === undefined || cell.pnl < worst.pnl) worst = cell;
1869
+ }
1870
+ // `exit` is defined: `days` has ≥ 1 entry (defaults to `[0]`).
1871
+ optimalExit.push(exit!);
1872
+ beRow.push(firstNonNegativeDay);
1873
+ }
1874
+ breakEvenRows.push(beRow);
1875
+ }
1876
+ const breakEven: WhatIfCubeBreakEven = {
1877
+ firstNonNegativeDayByPriceAndVolatility: breakEvenRows,
1878
+ };
1879
+
1880
+ // Opt-in probability weighting (Wave 6 §3) — resolved from the current spot + selected process.
1881
+ const probability = options.probability
1882
+ ? this.whatIfProbability(options.probability, {
1883
+ prices,
1884
+ volatilityShocks,
1885
+ days,
1886
+ cells,
1887
+ market,
1888
+ baseAsOf,
1889
+ functionName,
1890
+ })
1891
+ : undefined;
1892
+
1893
+ const warnings: QuantWarning[] = [];
1894
+ if (clampedCells > 0) {
1895
+ warnings.push({
1896
+ code: WarningCode.StrategyVolatilityFloored,
1897
+ message: `${clampedCells} cube cell(s) had a shocked volatility below the ${VOL_FLOOR} floor and were priced at the floor, not the requested shock.`,
1898
+ severity: 'warn',
1899
+ context: { clampedCells, volatilityFloor: VOL_FLOOR },
1900
+ });
1901
+ }
1902
+
1903
+ return {
1904
+ value: {
1905
+ axes: { prices, volatilityShocks, daysForward: days },
1906
+ cells,
1907
+ optimalExit,
1908
+ // `best`/`worst` are defined: the loops run at least once (prices/volatilityShocks/days each non-empty).
1909
+ best: best!,
1910
+ worst: worst!,
1911
+ breakEven,
1912
+ ...(probability !== undefined ? { probability } : {}),
1913
+ },
1914
+ assumptions: { conventionsVersion: CONVENTIONS_VERSION, marketSource },
1915
+ diagnostics: {
1916
+ engine: 'black-scholes-merton',
1917
+ method: 'closed-form',
1918
+ converged: true,
1919
+ warnings,
1920
+ },
1921
+ };
1922
+ }
1923
+
1924
+ /**
1925
+ * Resolve the what-if cube's probability block (Wave 6 §3): a spot distribution per day (GBM by
1926
+ * measure, or a custom density), disclosed grid tails, and per-(vol, day) expected P&L. The spot law
1927
+ * is anchored at the CURRENT spot; day zero is a degenerate point mass in the containing bin (no
1928
+ * divide-by-zero). Shares {@link priceGridDistribution} with the optimizer.
1929
+ */
1930
+ private whatIfProbability(
1931
+ options: WhatIfProbabilityOptions,
1932
+ context: {
1933
+ prices: number[];
1934
+ volatilityShocks: number[];
1935
+ days: number[];
1936
+ cells: WhatIfCell[];
1937
+ market: Partial<Omit<MarkToMarketInput, 'spot'>>;
1938
+ baseAsOf: number;
1939
+ functionName: string;
1940
+ },
1941
+ ): WhatIfCubeProbability {
1942
+ const { prices, volatilityShocks, days, cells, market, functionName } = context;
1943
+ requireArgumentObject(functionName, 'probability', options);
1944
+ ensureKnownKeys(functionName, 'probability', options, ['model', 'gridPolicy'] as const);
1945
+ const gridPolicy = options.gridPolicy ?? 'report-and-renormalize';
1946
+ if (gridPolicy !== 'report-and-renormalize' && gridPolicy !== 'include-in-edge-bins') {
1947
+ throw new InputError(
1948
+ `${functionName}: probability.gridPolicy must be 'report-and-renormalize' or 'include-in-edge-bins', got "${String(gridPolicy)}".`,
1949
+ { code: ErrorCode.InputInvalidEnum, context: { gridPolicy } },
1950
+ );
1951
+ }
1952
+ // §6: probability mode needs strictly increasing unique prices, strictly increasing unique
1953
+ // non-negative days, and finite unique vol shocks — the spot mass is undefined otherwise.
1954
+ ensureStrictlyIncreasing(prices, 'probability prices', functionName);
1955
+ ensureStrictlyIncreasing(days, 'probability daysForward', functionName);
1956
+ if (days[0]! < 0) {
1957
+ throw new InputError(
1958
+ `${functionName}: probability daysForward must be non-negative, got ${days[0]}.`,
1959
+ {
1960
+ code: ErrorCode.InputOutOfRange,
1961
+ context: { day: days[0] },
1962
+ },
1963
+ );
1964
+ }
1965
+ ensureFiniteUnique(volatilityShocks, 'probability volatilityShocks', functionName);
1966
+
1967
+ // Anchor the process at the CURRENT spot + rate/dividend (the GBM start), not the grid prices.
1968
+ const { merged } = this.resolveMarket(
1969
+ market as Partial<PremiumMarket> & { expiry?: string },
1970
+ functionName,
1971
+ ['spot', 'riskFreeRate'],
1972
+ );
1973
+ const s0 = merged.spot!;
1974
+ const rate = merged.riskFreeRate!;
1975
+ const dividendYield = merged.dividendYield ?? 0;
1976
+ ensurePositive(s0, 'spot', functionName, ErrorCode.InputNegativeSpot);
1977
+ ensureFinite(rate, 'riskFreeRate', functionName);
1978
+ ensureFinite(dividendYield, 'dividendYield', functionName);
1979
+
1980
+ const { modelAssumptions, lawAt } = resolveWhatIfModel(options.model, {
1981
+ s0,
1982
+ riskFreeRate: rate,
1983
+ dividendYield,
1984
+ functionName,
1985
+ });
1986
+
1987
+ const DAY_YEARS = 1 / 365; // ACT/365F: calendar days forward → years
1988
+ const spotMassByDay: number[][] = [];
1989
+ const tailMassByDay: Array<{ below: number; above: number }> = [];
1990
+ const expectationMeaning =
1991
+ gridPolicy === 'report-and-renormalize' ? 'conditional-on-grid' : 'edge-censored';
1992
+
1993
+ for (const day of days) {
1994
+ const yearsForward = day * DAY_YEARS;
1995
+ const { masses, below, above } = resolveDayMass({
1996
+ prices,
1997
+ yearsForward,
1998
+ s0,
1999
+ lawAt,
2000
+ gridPolicy,
2001
+ functionName,
2002
+ });
2003
+ spotMassByDay.push(masses);
2004
+ tailMassByDay.push({ below, above });
2005
+ }
2006
+
2007
+ // expectedPnlByVolatilityAndDay[v][d] = Σ_price spotMass(price, day) · cell.pnl(price, vol, day).
2008
+ const nDays = days.length;
2009
+ const nVolatility = volatilityShocks.length;
2010
+ const expectedPnlByVolatilityAndDay: number[][] = volatilityShocks.map(() =>
2011
+ new Array<number>(nDays).fill(0),
2012
+ );
2013
+ for (let pi = 0; pi < prices.length; pi++) {
2014
+ for (let vi = 0; vi < nVolatility; vi++) {
2015
+ for (let di = 0; di < nDays; di++) {
2016
+ const pnl = cells[(pi * nVolatility + vi) * nDays + di]!.pnl;
2017
+ expectedPnlByVolatilityAndDay[vi]![di]! += spotMassByDay[di]![pi]! * pnl;
2018
+ }
2019
+ }
2020
+ }
2021
+
2022
+ return {
2023
+ spotMassByDay,
2024
+ tailMassByDay,
2025
+ gridPolicy,
2026
+ expectationMeaning,
2027
+ modelAssumptions,
2028
+ expectedPnlByVolatilityAndDay,
2029
+ };
2030
+ }
2031
+
2032
+ /**
2033
+ * Chart-ready output (spec §12.5). Current P&L / live Greeks need a market: per-call fields
2034
+ * merge over the construction market (R5), so a model-premium position charts with no `market`.
2035
+ */
2036
+ chartData(
2037
+ options: {
2038
+ prices?: number[] | PriceRange;
2039
+ include?: ChartInclude;
2040
+ market?: Partial<Omit<MarkToMarketInput, 'spot'>>;
2041
+ } = {},
2042
+ ): Array<{
2043
+ underlyingPrice: number;
2044
+ expirationPnl?: number;
2045
+ currentPnl?: number;
2046
+ delta?: number;
2047
+ theta?: number;
2048
+ }> {
2049
+ requireArgumentObject('strategy.chartData', 'options', options);
2050
+ const include = options.include ?? { expirationPnl: true };
2051
+ const needsMarket = include.currentPnl || include.delta || include.theta;
2052
+ if (needsMarket && !options.market && !this.market) {
2053
+ throw new InputError(
2054
+ 'chartData: `market` is required when currentPnl/delta/theta columns are requested ' +
2055
+ '(or build the position with { market: {...} } so it defaults from it).',
2056
+ { code: ErrorCode.StrategyInvalidChartRange, context: { include } },
2057
+ );
2058
+ }
2059
+ return resolveGrid(options.prices, () => this.defaultPriceRange()).map((underlyingPrice) => {
2060
+ const row: {
2061
+ underlyingPrice: number;
2062
+ expirationPnl?: number;
2063
+ currentPnl?: number;
2064
+ delta?: number;
2065
+ theta?: number;
2066
+ } = {
2067
+ underlyingPrice,
2068
+ };
2069
+ if (include.expirationPnl) row.expirationPnl = this.pnlAtExpiry(underlyingPrice);
2070
+ if (needsMarket) {
2071
+ const markToMarket = this.value({ ...(options.market ?? {}), spot: underlyingPrice });
2072
+ if (include.currentPnl) row.currentPnl = markToMarket.pnl;
2073
+ if (include.delta) row.delta = markToMarket.greeks.delta;
2074
+ if (include.theta) row.theta = markToMarket.greeks.theta;
2075
+ }
2076
+ return row;
2077
+ });
2078
+ }
2079
+ }
2080
+
2081
+ /** Build a position from legs. */
2082
+ export function strategyOf(legs: readonly LegInput[], config?: PositionConfig): Position {
2083
+ return new Position(legs, config);
2084
+ }