Skip to main content

rustyqlib/rates/
build_contracts.rs

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