diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 0aa4d26..6913d7c 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -131,7 +131,7 @@ jobs: - name: Push working-directory: ./FinLib.NET/FinLib - run: dotnet nuget push --source gitea ./bin/Release/FinLib.NET.0.0.3.nupkg + run: dotnet nuget push --source gitea ./bin/Release/FinLib.NET.0.0.4.nupkg buildWASM: name: Build WASM diff --git a/Cargo.lock b/Cargo.lock index 08b4261..265f179 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -259,7 +259,7 @@ checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "finlib" -version = "0.0.3" +version = "0.0.4" dependencies = [ "getrandom 0.2.15", "log", @@ -274,7 +274,7 @@ dependencies = [ [[package]] name = "finlib-ffi" -version = "0.0.3" +version = "0.0.4" dependencies = [ "cbindgen", "csbindgen", @@ -283,7 +283,7 @@ dependencies = [ [[package]] name = "finlib-wasm" -version = "0.0.3" +version = "0.0.4" dependencies = [ "console_error_panic_hook", "console_log", @@ -606,7 +606,7 @@ dependencies = [ [[package]] name = "pyfinlib" -version = "0.0.3" +version = "0.0.4" dependencies = [ "finlib", "log", diff --git a/Cargo.toml b/Cargo.toml index 5c81626..2383a13 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,7 +14,7 @@ default-members = [ ] [workspace.package] -version = "0.0.3" +version = "0.0.4" authors = ["sarsoo <andy@sarsoo.xyz>"] description = "Quant finance functions implemented in Rust" edition = "2021" diff --git a/FinLib.NET/FinLib/FinLib.Interest.cs b/FinLib.NET/FinLib/FinLib.Interest.cs index a6bba3f..efa04ef 100644 --- a/FinLib.NET/FinLib/FinLib.Interest.cs +++ b/FinLib.NET/FinLib/FinLib.Interest.cs @@ -7,8 +7,5 @@ namespace FinLib.Interest; public static class Interest { - public static double Compound(double principal, double rate, double time, double n) - { - return NativeMethods.interest_compound(principal, rate, time, n); - } + public static double Compound(double principal, double rate, double time, double n) => NativeMethods.interest_compound(principal, rate, time, n); } \ No newline at end of file diff --git a/FinLib.NET/FinLib/FinLib.Risk.cs b/FinLib.NET/FinLib/FinLib.Risk.cs index 7813bdb..bba9bee 100644 --- a/FinLib.NET/FinLib/FinLib.Risk.cs +++ b/FinLib.NET/FinLib/FinLib.Risk.cs @@ -30,4 +30,6 @@ public static class ValueAtRisk } } } + + public static double ScaleValueAtRisk(double initialValue, nint timeCycles) => NativeMethods.scale_value_at_risk(initialValue, timeCycles); } \ No newline at end of file diff --git a/FinLib.NET/FinLib/FinLib.csproj b/FinLib.NET/FinLib/FinLib.csproj index 28d7541..f2b69d9 100644 --- a/FinLib.NET/FinLib/FinLib.csproj +++ b/FinLib.NET/FinLib/FinLib.csproj @@ -1,17 +1,17 @@ <Project Sdk="Microsoft.NET.Sdk"> + <PropertyGroup> + <PackageId>FinLib.NET</PackageId> + <Version>0.0.4</Version> + <Authors>sarsoo</Authors> + </PropertyGroup> + <PropertyGroup> <TargetFrameworks>netstandard2.0</TargetFrameworks> <LangVersion>latest</LangVersion> <AllowUnsafeBlocks>true</AllowUnsafeBlocks> </PropertyGroup> - <PropertyGroup> - <PackageId>FinLib.NET</PackageId> - <Version>0.0.1</Version> - <Authors>sarsoo</Authors> - </PropertyGroup> - <ItemGroup Condition=" '$(Configuration)' == 'Debug' "> <Content Include="..\..\target\debug\libfinlib_ffi.*"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> diff --git a/FinLib.NET/FinLib/NativeMethods.g.cs b/FinLib.NET/FinLib/NativeMethods.g.cs index 1d1065f..fcbb16b 100644 --- a/FinLib.NET/FinLib/NativeMethods.g.cs +++ b/FinLib.NET/FinLib/NativeMethods.g.cs @@ -28,9 +28,48 @@ namespace FinLib [DllImport(__DllName, EntryPoint = "varcovar_value_at_risk", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] internal static extern double* varcovar_value_at_risk(double* arr, nuint len, double confidence); + [DllImport(__DllName, EntryPoint = "scale_value_at_risk", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] + internal static extern double scale_value_at_risk(double initial_value, nint time_cycles); + } + [StructLayout(LayoutKind.Sequential)] + internal unsafe partial struct Portfolio + { + } + + [StructLayout(LayoutKind.Sequential)] + internal unsafe partial struct PortfolioAsset + { + } + + [StructLayout(LayoutKind.Sequential)] + internal unsafe partial struct OptionVariables + { + } + + [StructLayout(LayoutKind.Sequential)] + internal unsafe partial struct CallOption + { + } + + [StructLayout(LayoutKind.Sequential)] + internal unsafe partial struct PutOption + { + } + + [StructLayout(LayoutKind.Sequential)] + internal unsafe partial struct OptionGreeks + { + } + + + internal enum ValueType : byte + { + Absolute, + RateOfChange, + } } diff --git a/finlib-cpp/include/finlib-native.h b/finlib-cpp/include/finlib-native.h index 1dd2773..dea90d7 100644 --- a/finlib-cpp/include/finlib-native.h +++ b/finlib-cpp/include/finlib-native.h @@ -23,6 +23,8 @@ const double *historical_value_at_risk(const double *arr, size_t len, double con double interest_compound(double principal, double rate, double time, double n); +double scale_value_at_risk(double initial_value, ptrdiff_t time_cycles); + const double *varcovar_value_at_risk(const double *arr, size_t len, double confidence); } // extern "C" diff --git a/finlib-ffi/build.rs b/finlib-ffi/build.rs index 4f30ff9..08e65f4 100644 --- a/finlib-ffi/build.rs +++ b/finlib-ffi/build.rs @@ -19,7 +19,18 @@ fn main() { csbindgen::Builder::default() .input_extern_file("src/lib.rs") .input_extern_file("../finlib/src/lib.rs") + .input_extern_file("../finlib/src/risk/portfolio.rs") + .input_extern_file("../finlib/src/options/blackscholes/mod.rs") .csharp_dll_name("libfinlib_ffi") + .always_included_types([ + "Portfolio", + "ValueType", + "PortfolioAsset", + "OptionVariables", + "CallOption", + "PutOption", + "OptionGreeks", + ]) .csharp_namespace("FinLib") .generate_csharp_file("../FinLib.NET/FinLib/NativeMethods.g.cs") .unwrap(); diff --git a/finlib-ffi/cbindgen.toml b/finlib-ffi/cbindgen.toml index cd8eb52..dc8e222 100644 --- a/finlib-ffi/cbindgen.toml +++ b/finlib-ffi/cbindgen.toml @@ -144,11 +144,11 @@ bitflags = false ############## Options for How Your Rust library Should Be Parsed ############## [parse] -parse_deps = false -# include = [] -exclude = [] +parse_deps = true +include = ["finlib"] +#exclude = [] clean = false -extra_bindings = [] +extra_bindings = ["finlib"] diff --git a/finlib-ffi/src/lib.rs b/finlib-ffi/src/lib.rs index ddf2a73..a52cbcf 100644 --- a/finlib-ffi/src/lib.rs +++ b/finlib-ffi/src/lib.rs @@ -44,3 +44,9 @@ pub unsafe extern "C" fn varcovar_value_at_risk(arr: *const f64, len: usize, con Box::into_raw(Box::new(finlib::risk::var::varcovar::value_at_risk_percent(input_array, confidence))) } + +#[no_mangle] +pub unsafe extern "C" fn scale_value_at_risk(initial_value: f64, time_cycles: isize) -> f64 { + + finlib::risk::var::varcovar::scale_value_at_risk(initial_value, time_cycles) +} diff --git a/finlib/src/options/blackscholes/mod.rs b/finlib/src/options/blackscholes/mod.rs index 7235352..b162007 100644 --- a/finlib/src/options/blackscholes/mod.rs +++ b/finlib/src/options/blackscholes/mod.rs @@ -255,11 +255,11 @@ pub fn vega(v: &OptionVariables) -> f64 { #[cfg_attr(feature = "ffi", repr(C))] #[derive(Debug, Copy, Clone, Default, PartialEq, PartialOrd)] pub struct OptionGreeks { - delta: f64, - gamma: f64, - vega: f64, - theta: f64, - rho: f64 + pub delta: f64, + pub gamma: f64, + pub vega: f64, + pub theta: f64, + pub rho: f64 } impl OptionGreeks {