FinancialConfig.java

package com.morphiqlabs.financial;

/**
 * Configuration class for financial analysis parameters.
 * 
 * <p>This class requires users to explicitly specify financial parameters
 * such as the risk-free rate, ensuring that analysis is performed with
 * appropriate market-specific values rather than potentially outdated defaults.</p>
 * 
 * <p><strong>Risk-Free Rate Guidelines:</strong></p>
 * <ul>
 *   <li>US Treasury Bills (3-month) for short-term analysis</li>
 *   <li>US Treasury Notes (10-year) for long-term analysis</li>
 *   <li>Central bank rates for the relevant currency</li>
 *   <li>High-grade corporate bonds for corporate finance</li>
 * </ul>
 * 
 * <p>Example rates across different periods:</p>
 * <ul>
 *   <li>2020-2021: Near 0% (pandemic era)</li>
 *   <li>2023-2024: 4-5% (rate hike cycle)</li>
 *   <li>Historical average (1962-2023): ~4.4%</li>
 * </ul>
 */
public class FinancialConfig {
    
    private final double riskFreeRate;
    
    /**
     * Creates a financial configuration with specified risk-free rate.
     * 
     * @param riskFreeRate the risk-free rate as an annual decimal (e.g., 0.045 for 4.5%)
     * @throws IllegalArgumentException if riskFreeRate is negative
     */
    public FinancialConfig(double riskFreeRate) {
        if (riskFreeRate < 0) {
            throw new IllegalArgumentException("Risk-free rate cannot be negative: " + riskFreeRate);
        }
        this.riskFreeRate = riskFreeRate;
    }
    
    /**
     * Returns the configured risk-free rate.
     * 
     * @return the risk-free rate as an annual decimal
     */
    public double getRiskFreeRate() {
        return riskFreeRate;
    }
    
    @Override
    public String toString() {
        return String.format("FinancialConfig{riskFreeRate=%.4f}", riskFreeRate);
    }
    
    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (!(obj instanceof FinancialConfig)) return false;
        FinancialConfig other = (FinancialConfig) obj;
        return Double.compare(riskFreeRate, other.riskFreeRate) == 0;
    }
    
    @Override
    public int hashCode() {
        return Double.hashCode(riskFreeRate);
    }
}