Skip to main content

rustyqlib/rates/
build_contracts.rs

1use crate::rates;
2use crate::rates::deposits::Deposit;
3use chrono::Local;
4use crate::rates::fra::FRA;
5use crate::core::traits::Rates;
6use crate::core::utils::Contract;
7use crate::rates::utils::TermStructure;
8
9pub fn build_ir_contracts(data: Contract) -> Box<dyn Rates> {
10    let rate_data = data.rate_data.clone().unwrap();
11    let start_date_str = rate_data.start_date; // Only for 0M case
12    let maturity_date_str = rate_data.maturity_date;
13    let current_date = Local::now().date_naive();
14    let maturity_date = rates::utils::convert_mm_to_date(maturity_date_str);
15    let start_date = rates::utils::convert_mm_to_date(start_date_str);
16    if rate_data.instrument.as_str() == "Deposit" {
17        let mut deposit = Deposit {
18            start_date: start_date,
19            maturity_date: maturity_date,
20            valuation_date: current_date,
21            notional: rate_data.notional,
22            fix_rate: rate_data.fix_rate,
23            day_count: rates::utils::DayCountConvention::Act360,
24            business_day_adjustment: 0,
25            term_structure: None
26        };
27        match rate_data.day_count.as_str() {
28            "Act360" |"A360" => {
29                deposit.day_count = rates::utils::DayCountConvention::Act360;
30            }
31            "Act365" |"A365" => {
32                deposit.day_count = rates::utils::DayCountConvention::Act365;
33            }
34            "Thirty360" |"30/360" => {
35                deposit.day_count = rates::utils::DayCountConvention::Thirty360;
36            }
37            _ => {}
38        }
39        let ird:Box<dyn Rates> = Box::new(deposit);
40        return ird;
41    }
42    else if rate_data.instrument.as_str()=="FRA" {
43        //let mut start_date_str = rate_data.start_date;
44        //let mut maturity_date_str = rate_data.maturity_date;
45        //let current_date = Local::today();
46        //let maturity_date = rates::utils::convert_mm_to_date(maturity_date_str);
47        //let start_date = rates::utils::convert_mm_to_date(start_date_str);
48        let mut fra = FRA {
49            start_date: start_date,
50            maturity_date: maturity_date,
51            valuation_date: current_date,
52            notional: rate_data.notional,
53            currency: rate_data.currency,
54            fix_rate: rate_data.fix_rate,
55            day_count: rates::utils::DayCountConvention::Act360,
56            business_day_adjustment: 0,
57            term_structure: None
58        };
59        match rate_data.day_count.as_str() {
60            "Act360" |"A360" => {
61                fra.day_count = rates::utils::DayCountConvention::Act360;
62            }
63            "Act365" |"A365" => {
64                fra.day_count = rates::utils::DayCountConvention::Act365;
65            }
66            "Thirty360" |"30/360" => {
67                fra.day_count = rates::utils::DayCountConvention::Thirty360;
68            }
69            _ => {}
70        }
71        let ird:Box<dyn Rates> = Box::new(fra);
72        return ird;
73    }
74    else {
75        panic!("Invalid asset");
76    }
77}
78
79pub fn build_ir_contracts_from_json(data: Vec<Contract>) -> Vec<Box<dyn Rates>> {
80    let mut irds:Vec<Box<dyn Rates>> = Vec::new();
81    for contract in data {
82        let ird = build_ir_contracts(contract);
83        irds.push(ird);
84    }
85    return irds;
86}
87pub fn build_term_structure(mut contracts:Vec<Box<dyn Rates>>) -> TermStructure {
88    let mut ts:rates::utils::TermStructure = rates::utils::TermStructure::new(vec![],vec![],vec![],
89                                                                              rates::utils::DayCountConvention::Act360);
90    let contract = contracts[0].as_mut();
91    ts.discount_factor.push(contract.get_maturity_discount_factor());
92    ts.date.push(contract.get_maturity_date());
93    ts.rate.push(contract.get_rate());
94    for i in 1..contracts.len(){
95        let contract = contracts[i].as_mut();
96        contract.set_term_structure(ts.clone());
97        ts.discount_factor.push(contract.get_maturity_discount_factor());
98        ts.date.push(contract.get_maturity_date());
99        ts.rate.push(contract.get_rate());
100    }
101    return ts
102}