#[derive(Clone, Copy, Debug)]
pub enum OptimizerMethod {
Markowitz,
MeanCVaR,
InverseVol,
RiskParity,
HRP,
BlackLitterman,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct UnknownOptimizerMethod(pub String);
impl std::fmt::Display for UnknownOptimizerMethod {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"unknown optimizer method '{}'. Valid: markowitz, mean-cvar, inverse-vol, \
risk-parity, hrp, black-litterman",
self.0
)
}
}
impl std::error::Error for UnknownOptimizerMethod {}
impl std::str::FromStr for OptimizerMethod {
type Err = UnknownOptimizerMethod;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s.to_lowercase().as_str() {
"markowitz" | "mv" | "mean-variance" | "meanvariance" => Ok(Self::Markowitz),
"cvar" | "mean-cvar" | "meancvar" => Ok(Self::MeanCVaR),
"inv-vol" | "inverse-vol" | "invvol" => Ok(Self::InverseVol),
"risk-parity" | "riskparity" => Ok(Self::RiskParity),
"hrp" => Ok(Self::HRP),
"bl" | "black-litterman" | "blacklitterman" => Ok(Self::BlackLitterman),
_ => Err(UnknownOptimizerMethod(s.to_string())),
}
}
}
#[derive(Clone, Debug, Default)]
pub struct PortfolioResult {
pub weights: Vec<f64>,
pub expected_return: f64,
pub volatility: f64,
pub sharpe: f64,
}
pub(crate) fn empty_result() -> PortfolioResult {
PortfolioResult::default()
}