-
Notifications
You must be signed in to change notification settings - Fork 126
/
historySOFR.go
145 lines (117 loc) · 4.43 KB
/
historySOFR.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package staticscrapers
import (
"bytes"
"encoding/xml"
"fmt"
"os"
"strconv"
"time"
models "github.com/diadata-org/diadata/pkg/model"
utils "github.com/diadata-org/diadata/pkg/utils"
log "github.com/sirupsen/logrus"
)
type (
CmktRatesSecondaryFindByDateResponse struct {
XMLName xml.Name `xml:"mktRatesSecondaryFindByDateResponse,omitempty" json:"mktRatesSecondaryFindByDateResponse,omitempty"`
CmktRatesFindItem []*CmktRatesFindItem `xml:"mktRatesFindItem,omitempty" json:"mktRatesFindItem,omitempty"`
}
CmktRatesFindItem struct {
XMLName xml.Name `xml:"mktRatesFindItem,omitempty" json:"mktRatesFindItem,omitempty"`
CrateOperation *CrateOperation `xml:"rateOperation,omitempty" json:"rateOperation,omitempty"`
}
CrateOperation struct {
XMLName xml.Name `xml:"rateOperation,omitempty" json:"rateOperation,omitempty"`
CeffectiveDate *CeffectiveDate `xml:"effectiveDate,omitempty" json:"effectiveDate,omitempty"`
CinsertTimestamp *CinsertTimestamp `xml:"insertTimestamp,omitempty" json:"insertTimestamp,omitempty"`
Crate *Crate `xml:"rate,omitempty" json:"rate,omitempty"`
CrateType *CrateType `xml:"rateType,omitempty" json:"rateType,omitempty"`
CtradingVolume *CtradingVolume `xml:"tradingVolume,omitempty" json:"tradingVolume,omitempty"`
CbusinessEventLog *CbusinessEventLog `xml:"businessEventLog,omitempty" json:"businessEventLog,omitempty"`
}
CbusinessEventLog struct {
XMLName xml.Name `xml:"businessEventLog,omitempty" json:"businessEventLog,omitempty"`
CeventDate *CeventDate `xml:"eventDate,omitempty" json:"eventDate,omitempty"`
}
CeventDate struct {
XMLName xml.Name `xml:"eventDate,omitempty" json:"eventDate,omitempty"`
CEvDate string `xml:",chardata" json:",omitempty"`
}
CeffectiveDate struct {
XMLName xml.Name `xml:"effectiveDate,omitempty" json:"effectiveDate,omitempty"`
CEffDate string `xml:",chardata" json:",omitempty"`
}
Crate struct {
XMLName xml.Name `xml:"rate,omitempty" json:"rate,omitempty"`
CValue string `xml:",chardata" json:",omitempty"`
}
CrateType struct {
XMLName xml.Name `xml:"rateType,omitempty" json:"rateType,omitempty"`
CType string `xml:",chardata" json:",omitempty"`
}
CtradingVolume struct {
XMLName xml.Name `xml:"tradingVolume,omitempty" json:"tradingVolume,omitempty"`
CVolume string `xml:",chardata" json:",omitempty"`
}
CinsertTimestamp struct {
XMLName xml.Name `xml:"insertTimestamp,omitempty" json:"insertTimestamp,omitempty"`
CTimestamp string `xml:",chardata" json:",omitempty"`
}
)
// WriteHistoricSOFR makes a GET request to fetch the historic data of the SOFR index
// and writes it into the redis database.
func WriteHistoricSOFR(ds models.Datastore) error {
log.Printf("Writing historic SOFR data")
// Get rss from fed webpage
XMLdata, _, err := utils.GetRequest("https://apps.newyorkfed.org/api/mktrates/r3")
if err != nil {
return err
}
// Decode the body
rss := new(CmktRatesSecondaryFindByDateResponse)
buffer := bytes.NewBuffer(XMLdata)
decoded := xml.NewDecoder(buffer)
err = decoded.Decode(rss)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
// A slice containing all historic data
histDataSlice := rss.CmktRatesFindItem
numData := len(histDataSlice)
for i := 0; i < numData; i++ {
var rate float64
var dateTime time.Time
var effDate time.Time
// Collect entries of InterestRate struct -----------------------------------
symbol := histDataSlice[i].CrateOperation.CrateType.CType
// Convert interest rate from string to float64
rate, err = strconv.ParseFloat(histDataSlice[i].CrateOperation.Crate.CValue, 64)
if err != nil {
fmt.Println(err)
}
// Convert time string to Time type in UTC and pass date (without daytime)
dateTime, err = time.Parse(time.RFC3339, histDataSlice[i].CrateOperation.CbusinessEventLog.CeventDate.CEvDate)
if err != nil {
log.Error(err)
} else {
dateTime = dateTime.Round(time.Second).UTC()
}
effDate, err = time.Parse("2006-01-02", histDataSlice[i].CrateOperation.CeffectiveDate.CEffDate)
if err != nil {
log.Error(err)
}
t := models.InterestRate{
Symbol: symbol,
Value: rate,
PublicationTime: dateTime,
EffectiveDate: effDate,
Source: "FED",
}
err = ds.SetInterestRate(&t)
if err != nil {
log.Error(err)
}
}
log.Info("Writing historic SOFR data complete.")
return err
}