From a567bcffafc8a7010f336cb99dc64cfb7bbedda8 Mon Sep 17 00:00:00 2001 From: Andy Pack <andy@sarsoo.xyz> Date: Sat, 15 Feb 2025 20:19:40 +0000 Subject: [PATCH] adding portfolio and asset to wasm --- finlib-wasm/js-local/index.js | 6 ++++- finlib-wasm/js-local/package-lock.json | 2 +- finlib/src/lib.rs | 4 +++- finlib/src/py/mod.rs | 31 +------------------------- finlib/src/py/portfolio.rs | 30 +++++++++++++++++++++++++ finlib/src/wasm/mod.rs | 1 + finlib/src/wasm/portfolio.rs | 30 +++++++++++++++++++++++++ 7 files changed, 71 insertions(+), 33 deletions(-) create mode 100644 finlib/src/py/portfolio.rs create mode 100644 finlib/src/wasm/mod.rs create mode 100644 finlib/src/wasm/portfolio.rs diff --git a/finlib-wasm/js-local/index.js b/finlib-wasm/js-local/index.js index 11fd2bd..9a0ccb5 100644 --- a/finlib-wasm/js-local/index.js +++ b/finlib-wasm/js-local/index.js @@ -1,4 +1,8 @@ -import { ValueAtRisk } from "finlib"; +import { ValueAtRisk, Portfolio, PortfolioAsset } from "finlib"; console.log(ValueAtRisk.varcovar([1, 2, 3, 4], 0.1)); console.log(ValueAtRisk.varcovar([1, 2, 3, 4], 0.05)); + +let portfolio = new Portfolio([new PortfolioAsset(1.0, "test", [1.0, 2.0, 3.0])]); +console.log(portfolio.isValid()); +console.log(portfolio.valueAtRisk(0.1)); diff --git a/finlib-wasm/js-local/package-lock.json b/finlib-wasm/js-local/package-lock.json index eea2376..80474e3 100644 --- a/finlib-wasm/js-local/package-lock.json +++ b/finlib-wasm/js-local/package-lock.json @@ -20,7 +20,7 @@ } }, "../pkg": { - "name": "@sarsoo/finlib", + "name": "finlib-wasm", "version": "0.0.1" }, "node_modules/@discoveryjs/json-ext": { diff --git a/finlib/src/lib.rs b/finlib/src/lib.rs index 29a08cf..02693b1 100644 --- a/finlib/src/lib.rs +++ b/finlib/src/lib.rs @@ -3,4 +3,6 @@ pub mod stats; pub mod util; pub mod risk; #[cfg(feature = "py")] -pub mod py; \ No newline at end of file +pub mod py; +#[cfg(feature = "wasm")] +pub mod wasm; \ No newline at end of file diff --git a/finlib/src/py/mod.rs b/finlib/src/py/mod.rs index 3d5ddb6..20e1ebf 100644 --- a/finlib/src/py/mod.rs +++ b/finlib/src/py/mod.rs @@ -1,30 +1 @@ -use pyo3::prelude::*; -use crate::risk::portfolio::{Portfolio, PortfolioAsset}; - -#[pymethods] -impl Portfolio { - - #[new] - pub fn init(assets: Vec<PortfolioAsset>) -> Self { - Portfolio::from(assets) - } - - #[pyo3(name = "is_valid")] - pub fn is_valid_py(&self) -> bool { - self.is_valid() - } - - #[pyo3(name = "value_at_risk")] - pub fn value_at_risk_py(&mut self, confidence: f64) -> PyResult<Option<f64>> { - Ok(self.value_at_risk(confidence)) - } -} - -#[pymethods] -impl PortfolioAsset { - - #[new] - pub fn init(portfolio_weight: f64, name: String, values: Vec<f64>) -> Self { - PortfolioAsset::new(portfolio_weight, name, values) - } -} \ No newline at end of file +pub mod portfolio; \ No newline at end of file diff --git a/finlib/src/py/portfolio.rs b/finlib/src/py/portfolio.rs new file mode 100644 index 0000000..3d5ddb6 --- /dev/null +++ b/finlib/src/py/portfolio.rs @@ -0,0 +1,30 @@ +use pyo3::prelude::*; +use crate::risk::portfolio::{Portfolio, PortfolioAsset}; + +#[pymethods] +impl Portfolio { + + #[new] + pub fn init(assets: Vec<PortfolioAsset>) -> Self { + Portfolio::from(assets) + } + + #[pyo3(name = "is_valid")] + pub fn is_valid_py(&self) -> bool { + self.is_valid() + } + + #[pyo3(name = "value_at_risk")] + pub fn value_at_risk_py(&mut self, confidence: f64) -> PyResult<Option<f64>> { + Ok(self.value_at_risk(confidence)) + } +} + +#[pymethods] +impl PortfolioAsset { + + #[new] + pub fn init(portfolio_weight: f64, name: String, values: Vec<f64>) -> Self { + PortfolioAsset::new(portfolio_weight, name, values) + } +} \ No newline at end of file diff --git a/finlib/src/wasm/mod.rs b/finlib/src/wasm/mod.rs new file mode 100644 index 0000000..20e1ebf --- /dev/null +++ b/finlib/src/wasm/mod.rs @@ -0,0 +1 @@ +pub mod portfolio; \ No newline at end of file diff --git a/finlib/src/wasm/portfolio.rs b/finlib/src/wasm/portfolio.rs new file mode 100644 index 0000000..91242d9 --- /dev/null +++ b/finlib/src/wasm/portfolio.rs @@ -0,0 +1,30 @@ +use wasm_bindgen::prelude::*; +use crate::risk::portfolio::{Portfolio, PortfolioAsset}; + +#[wasm_bindgen] +impl Portfolio { + + #[wasm_bindgen(constructor)] + pub fn init_wasm(assets: Vec<PortfolioAsset>) -> Self { + Portfolio::from(assets) + } + + #[wasm_bindgen(js_name = "isValid")] + pub fn is_valid_wasm(&self) -> bool { + self.is_valid() + } + + #[wasm_bindgen(js_name = "valueAtRisk")] + pub fn value_at_risk_wasm(&mut self, confidence: f64) -> Option<f64> { + self.value_at_risk(confidence) + } +} + +#[wasm_bindgen] +impl PortfolioAsset { + + #[wasm_bindgen(constructor)] + pub fn init_wasm(portfolio_weight: f64, name: String, values: Vec<f64>) -> Self { + PortfolioAsset::new(portfolio_weight, name, values) + } +} \ No newline at end of file