14 people like it.
Like the snippet!
Discount/Zero Curve Construction
A simplistic discount curve bootstrapping process
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:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
329:
330:
331:
332:
333:
334:
335:
336:
337:
338:
339:
340:
341:
342:
343:
344:
345:
346:
347:
348:
349:
350:
351:
352:
353:
354:
355:
356:
357:
358:
359:
360:
361:
362:
363:
364:
365:
366:
367:
368:
369:
370:
371:
372:
373:
374:
375:
376:
377:
378:
379:
380:
381:
382:
383:
384:
385:
386:
387:
388:
389:
390:
391:
392:
393:
394:
395:
396:
397:
398:
399:
400:
401:
402:
403:
404:
405:
|
open System.Text.RegularExpressions
type Date = System.DateTime
let date d = System.DateTime.Parse(d)
type Period = { startDate:Date; endDate:Date }
type Calendar = { weekendDays:System.DayOfWeek Set; holidays:Date Set }
type Tenor = { years:int; months:int; days:int }
let tenor t =
let regex s = new Regex(s)
let pattern = regex ("(?<weeks>[0-9]+)W" +
"|(?<years>[0-9]+)Y(?<months>[0-9]+)M(?<days>[0-9]+)D" +
"|(?<years>[0-9]+)Y(?<months>[0-9]+)M" +
"|(?<months>[0-9]+)M(?<days>[0-9]+)D" +
"|(?<years>[0-9]+)Y" +
"|(?<months>[0-9]+)M" +
"|(?<days>[0-9]+)D")
let m = pattern.Match(t)
if m.Success then
{ new Tenor with
years = (if m.Groups.["years"].Success
then int m.Groups.["years"].Value
else 0)
and months = (if m.Groups.["months"].Success
then int m.Groups.["months"].Value
else 0)
and days = (if m.Groups.["days"].Success
then int m.Groups.["days"].Value
else if m.Groups.["weeks"].Success
then int m.Groups.["weeks"].Value * 7
else 0) }
else
failwith "Invalid tenor format. Valid formats include 1Y 3M 7D 2W 1Y6M, etc"
let offset tenor (date:Date) =
date.AddDays(float tenor.days)
.AddMonths(tenor.months)
.AddYears(tenor.years)
let findNthWeekDay n weekDay (date:Date) =
let mutable d = new Date(date.Year, date.Month, 1)
while d.DayOfWeek <> weekDay do d <- d.AddDays(1.0)
for i = 1 to n - 1 do d <- d.AddDays(7.0)
if d.Month = date.Month then
d
else
failwith "No such day"
// Assume ACT/360 day count convention
let Actual360 period = double (period.endDate - period.startDate).Days / 360.0
let rec schedule frequency period =
seq {
yield period.startDate
let next = frequency period.startDate
if (next <= period.endDate) then
yield! schedule frequency { startDate = next; endDate = period.endDate }
}
let semiAnnual (from:Date) = from.AddMonths(6)
let isBusinessDay (date:Date) calendar =
not (calendar.weekendDays.Contains date.DayOfWeek || calendar.holidays.Contains date)
type RollRule =
| Actual = 0
| Following = 1
| Previous = 2
| ModifiedFollowing = 3
| ModifiedPrevious = 4
let dayAfter (date:Date) = date.AddDays(1.0)
let dayBefore (date:Date) = date.AddDays(-1.0)
let deriv f x =
let dx = (x + max (1e-6 * x) 1e-12)
let fv = f x
let dfv = f dx
if (dx <= x) then
(dfv - fv) / 1e-12
else
(dfv - fv) / (dx - x)
// Newton's method with separate functions for f and df
let newton f (guess:double) =
guess - f guess / deriv f guess
// Simple recursive solver for Newton's method with separate functions for f and df, to a given accuracy
let rec solveNewton f accuracy guess =
let root = (newton f guess)
if abs(root - guess) < accuracy then root else solveNewton f accuracy root
// Assume Log-Linear interpolation
let logarithmic (sampleDate:Date) highDp lowDp =
let (lowDate:Date), lowFactor = lowDp
let (highDate:Date), highFactor = highDp
lowFactor *
((highFactor / lowFactor) **
(double (sampleDate - lowDate).Days / double (highDate - lowDate).Days))
let rec roll rule calendar date =
if isBusinessDay date calendar then
date
else
match rule with
| RollRule.Actual -> date
| RollRule.Following -> dayAfter date |> roll rule calendar
| RollRule.Previous -> dayBefore date |> roll rule calendar
| RollRule.ModifiedFollowing ->
let next = roll RollRule.Following calendar date
if next.Month <> date.Month then
roll RollRule.Previous calendar date
else
next
| RollRule.ModifiedPrevious ->
let prev = roll RollRule.Previous calendar date
if prev.Month <> date.Month then
roll RollRule.Following calendar date
else
prev
| _ -> failwith "Invalid RollRule"
let rec rollBy n rule calendar (date:Date) =
match n with
| 0 -> date
| x ->
match rule with
| RollRule.Actual -> date.AddDays(float x)
| RollRule.Following -> dayAfter date
|> roll rule calendar
|> rollBy (x - 1) rule calendar
| RollRule.Previous -> roll rule calendar date
|> dayBefore
|> roll rule calendar
|> rollBy (x - 1) rule calendar
| RollRule.ModifiedFollowing ->
// Roll n-1 days Following
let next = rollBy (x - 1) RollRule.Following calendar date
// Roll the last day ModifiedFollowing
let final = roll RollRule.Following calendar (dayAfter next)
if final.Month <> next.Month then
roll RollRule.Previous calendar next
else
final
| RollRule.ModifiedPrevious ->
// Roll n-1 days Previous
let next = rollBy (x - 1) RollRule.Previous calendar date
// Roll the last day ModifiedPrevious
let final = roll RollRule.Previous calendar (dayAfter next)
if final.Month <> next.Month then
roll RollRule.Following calendar next
else
final
| _ -> failwith "Invalid RollRule"
let rec findDf interpolate sampleDate =
function
// exact match
(dpDate:Date, dpFactor:double) :: tail when dpDate = sampleDate
-> dpFactor
// falls between two points - interpolate
| (highDate:Date, highFactor:double) :: (lowDate:Date, lowFactor:double) :: tail
when lowDate < sampleDate && sampleDate < highDate
-> interpolate sampleDate (highDate, highFactor) (lowDate, lowFactor)
// recurse
| head :: tail -> findDf interpolate sampleDate tail
// falls outside the curve
| [] -> failwith "Outside the bounds of the discount curve"
let findPeriodDf period discountCurve =
let payDf = findDf logarithmic period.endDate discountCurve
let valueDf = findDf logarithmic period.startDate discountCurve
payDf / valueDf
let computeDf dayCount fromDf toQuote =
let dpDate, dpFactor = fromDf
let qDate, qValue = toQuote
(qDate, dpFactor * (1.0 /
(1.0 + qValue * dayCount { startDate = dpDate;
endDate = qDate })))
// Just to compute f(guess)
let computeSwapDf dayCount spotDate swapQuote discountCurve swapSchedule (guessDf:double) =
let qDate, qQuote = swapQuote
let guessDiscountCurve = (qDate, guessDf) :: discountCurve
let spotDf = findDf logarithmic spotDate discountCurve
let swapDf = findPeriodDf { startDate = spotDate; endDate = qDate } guessDiscountCurve
let swapVal =
let rec _computeSwapDf a spotDate qQuote guessDiscountCurve =
function
swapPeriod :: tail ->
let couponDf = findPeriodDf { startDate = spotDate;
endDate = swapPeriod.endDate } guessDiscountCurve
_computeSwapDf (couponDf * (dayCount swapPeriod) * qQuote + a)
spotDate qQuote guessDiscountCurve tail
| [] -> a
_computeSwapDf -1.0 spotDate qQuote guessDiscountCurve swapSchedule
spotDf * (swapVal + swapDf)
[<Measure>] type bp
[<Measure>] type percent
[<Measure>] type price
let convertPercentToRate (x:float<percent>) = x / 100.0<percent>
let convertPriceToRate (x:float<price>) = (100.0<price> - x) / 100.0<price>
type InterestRateQuote =
| Rate of float
| Percent of float<percent>
| BasisPoints of float<bp>
with
member x.ToRate() =
match x with
| Rate r -> r
| Percent p -> p / 100.0<percent>
| BasisPoints bp -> bp / 10000.0<bp>
member x.ToPercentage() =
match x with
| Rate r -> r * 100.0<percent>
| Percent p -> p
| BasisPoints bp -> bp / 100.0<bp/percent>
member x.ToBasisPoints() =
match x with
| Rate r -> r * 10000.0<bp>
| Percent p -> p * 100.0<bp/percent>
| BasisPoints bp -> bp
end
type FuturesContract = Date
let contract d = date d
type QuoteType =
| Overnight // the overnight rate (one day period)
| TomorrowNext // the one day period starting "tomorrow"
| TomorrowTomorrowNext // the one day period starting the day after "tomorrow"
| Cash of Tenor // cash deposit period in days, weeks, months
| Futures of FuturesContract // year and month of futures contract expiry
| Swap of Tenor // swap period in years
// Bootstrap the next discount factor from the previous one
let rec bootstrap dayCount quotes discountCurve =
match quotes with
quote :: tail ->
let newDf = computeDf dayCount (List.head discountCurve) quote
bootstrap dayCount tail (newDf :: discountCurve)
| [] -> discountCurve
// Generate the next discount factor from a fixed point on the curve
// (cash points are wrt to spot, not the previous df)
let rec bootstrapCash dayCount spotDate quotes discountCurve =
match quotes with
quote :: tail ->
let spotDf = (spotDate, findDf logarithmic spotDate discountCurve)
let newDf = computeDf dayCount spotDf quote
bootstrapCash dayCount spotDate tail (newDf :: discountCurve)
| [] -> discountCurve
let bootstrapFutures dayCount futuresStartDate quotes discountCurve =
match futuresStartDate with
| Some d ->
bootstrap dayCount
(Seq.toList quotes)
((d, findDf logarithmic d discountCurve) :: discountCurve)
| None -> discountCurve
// Swaps are computed from a schedule generated from spot and priced
// according to the curve built thusfar
let rec bootstrapSwaps dayCount spotDate calendar swapQuotes discountCurve =
match swapQuotes with
(qDate, qQuote) :: tail ->
// build the schedule for this swap
let swapDates = schedule semiAnnual { startDate = spotDate; endDate = qDate }
let rolledSwapDates = Seq.map (fun (d:Date) -> roll RollRule.Following calendar d)
swapDates
let swapPeriods = Seq.toList (Seq.map (fun (s, e) ->
{ startDate = s;
endDate = e }) (Seq.pairwise rolledSwapDates))
// solve
let accuracy = 1e-12
let spotFactor = findDf logarithmic spotDate discountCurve
let f = computeSwapDf dayCount spotDate (qDate, qQuote) discountCurve swapPeriods
let newDf = solveNewton f accuracy spotFactor
bootstrapSwaps dayCount spotDate calendar tail ((qDate, newDf) :: discountCurve)
| [] -> discountCurve
let USD = { weekendDays = Set [ System.DayOfWeek.Saturday; System.DayOfWeek.Sunday ];
holidays = Set [ date "2009-01-01";
date "2009-01-19";
date "2009-02-16";
date "2009-05-25";
date "2009-07-03";
date "2009-09-07";
date "2009-10-12";
date "2009-11-11";
date "2009-11-26";
date "2009-12-25" ] }
let curveDate = date "2009-05-01"
let spotDate = rollBy 2 RollRule.Following USD curveDate
let quotes = [ (Overnight, 0.045);
(TomorrowNext, 0.045);
(Cash (tenor "1W"), 0.0462);
(Cash (tenor "2W"), 0.0464);
(Cash (tenor "3W"), 0.0465);
(Cash (tenor "1M"), 0.0467);
(Cash (tenor "3M"), 0.0493);
(Futures (contract "Jun2009"), 95.150);
(Futures (contract "Sep2009"), 95.595);
(Futures (contract "Dec2009"), 95.795);
(Futures (contract "Mar2010"), 95.900);
(Futures (contract "Jun2010"), 95.910);
(Swap (tenor "2Y"), 0.04404);
(Swap (tenor "3Y"), 0.04474);
(Swap (tenor "4Y"), 0.04580);
(Swap (tenor "5Y"), 0.04686);
(Swap (tenor "6Y"), 0.04772);
(Swap (tenor "7Y"), 0.04857);
(Swap (tenor "8Y"), 0.04924);
(Swap (tenor "9Y"), 0.04983);
(Swap (tenor "10Y"), 0.0504);
(Swap (tenor "12Y"), 0.05119);
(Swap (tenor "15Y"), 0.05201);
(Swap (tenor "20Y"), 0.05276);
(Swap (tenor "25Y"), 0.05294);
(Swap (tenor "30Y"), 0.05306) ]
let spotPoints = quotes
|> List.choose (fun (t, q) ->
match t with
| Overnight _ -> Some (rollBy 1 RollRule.Following USD curveDate, q)
| TomorrowNext _ -> Some (rollBy 2 RollRule.Following USD curveDate, q)
| TomorrowTomorrowNext _ -> Some (rollBy 3 RollRule.Following USD curveDate, q)
| _ -> None)
|> List.sortBy (fun (d, _) -> d)
let cashPoints = quotes
|> List.choose (fun (t, q) ->
match t with
| Cash c -> Some (offset c spotDate |> roll RollRule.Following USD, q)
| _ -> None)
|> List.sortBy (fun (d, _) -> d)
let futuresQuotes = quotes
|> List.choose (fun (t, q) ->
match t with
| Futures f -> Some (f, q)
| _ -> None)
|> List.sortBy (fun (c, _) -> c)
let (sc, _) = List.head futuresQuotes
let (ec, _) = futuresQuotes.[futuresQuotes.Length - 1]
let futuresStartDate = findNthWeekDay 3 System.DayOfWeek.Wednesday sc
|> roll RollRule.ModifiedFollowing USD
let futuresEndDate = (new Date(ec.Year, ec.Month, 1)).AddMonths(3)
// "invent" an additional contract to capture the end of the futures schedule
let endContract = (futuresEndDate, 0.0)
let futuresPoints = Seq.append futuresQuotes [endContract]
|> Seq.pairwise
|> Seq.map (fun ((_, q1), (c2, _)) ->
(findNthWeekDay 3 System.DayOfWeek.Wednesday c2
|> roll RollRule.ModifiedFollowing USD, (100.0 - q1) / 100.0))
|> Seq.toList
let swapPoints = quotes
|> List.choose (fun (t, q) ->
match t with
| Swap s -> Some (offset s spotDate |> roll RollRule.Following USD, q)
| _ -> None)
|> List.sortBy (fun (d, _) -> d)
let discountFactors = [ (curveDate, 1.0) ]
|> bootstrap Actual360 spotPoints
|> bootstrapCash Actual360 spotDate cashPoints
|> bootstrapFutures Actual360 (Some futuresStartDate) futuresPoints
|> bootstrapSwaps Actual360 spotDate USD swapPoints
|> Seq.sortBy (fun (qDate, _) -> qDate)
printfn "Discount Factors"
Seq.iter (fun (d:Date, v) -> printfn "\t%s\t%.13F" (d.ToString("yyyy-MM-dd")) v) discountFactors
let zeroCouponRates = discountFactors
|> Seq.map (fun (d, f)
-> (d, 100.0 * -log(f) * 365.25 / double (d - curveDate).Days))
printfn "Zero-Coupon Rates"
Seq.iter (fun (d:Date, v) -> printfn "\t%s\t%.13F" (d.ToString("yyyy-MM-dd")) v) zeroCouponRates
|
namespace System
namespace System.Text
namespace System.Text.RegularExpressions
type Date = System.DateTime
Full name: Script.Date
Multiple items
type DateTime =
struct
new : ticks:int64 -> DateTime + 10 overloads
member Add : value:TimeSpan -> DateTime
member AddDays : value:float -> DateTime
member AddHours : value:float -> DateTime
member AddMilliseconds : value:float -> DateTime
member AddMinutes : value:float -> DateTime
member AddMonths : months:int -> DateTime
member AddSeconds : value:float -> DateTime
member AddTicks : value:int64 -> DateTime
member AddYears : value:int -> DateTime
...
end
Full name: System.DateTime
--------------------
System.DateTime()
(+0 other overloads)
System.DateTime(ticks: int64) : unit
(+0 other overloads)
System.DateTime(ticks: int64, kind: System.DateTimeKind) : unit
(+0 other overloads)
System.DateTime(year: int, month: int, day: int) : unit
(+0 other overloads)
System.DateTime(year: int, month: int, day: int, calendar: System.Globalization.Calendar) : unit
(+0 other overloads)
System.DateTime(year: int, month: int, day: int, hour: int, minute: int, second: int) : unit
(+0 other overloads)
System.DateTime(year: int, month: int, day: int, hour: int, minute: int, second: int, kind: System.DateTimeKind) : unit
(+0 other overloads)
System.DateTime(year: int, month: int, day: int, hour: int, minute: int, second: int, calendar: System.Globalization.Calendar) : unit
(+0 other overloads)
System.DateTime(year: int, month: int, day: int, hour: int, minute: int, second: int, millisecond: int) : unit
(+0 other overloads)
System.DateTime(year: int, month: int, day: int, hour: int, minute: int, second: int, millisecond: int, kind: System.DateTimeKind) : unit
(+0 other overloads)
val date : d:string -> System.DateTime
Full name: Script.date
val d : string
System.DateTime.Parse(s: string) : System.DateTime
System.DateTime.Parse(s: string, provider: System.IFormatProvider) : System.DateTime
System.DateTime.Parse(s: string, provider: System.IFormatProvider, styles: System.Globalization.DateTimeStyles) : System.DateTime
type Period =
{startDate: Date;
endDate: Date;}
Full name: Script.Period
Period.startDate: Date
Period.endDate: Date
type Calendar =
{weekendDays: Set<DayOfWeek>;
holidays: Set<Date>;}
Full name: Script.Calendar
Calendar.weekendDays: Set<System.DayOfWeek>
type DayOfWeek =
| Sunday = 0
| Monday = 1
| Tuesday = 2
| Wednesday = 3
| Thursday = 4
| Friday = 5
| Saturday = 6
Full name: System.DayOfWeek
Multiple items
module Set
from Microsoft.FSharp.Collections
--------------------
type Set<'T (requires comparison)> =
interface IComparable
interface IEnumerable
interface IEnumerable<'T>
interface ICollection<'T>
new : elements:seq<'T> -> Set<'T>
member Add : value:'T -> Set<'T>
member Contains : value:'T -> bool
override Equals : obj -> bool
member IsProperSubsetOf : otherSet:Set<'T> -> bool
member IsProperSupersetOf : otherSet:Set<'T> -> bool
...
Full name: Microsoft.FSharp.Collections.Set<_>
--------------------
new : elements:seq<'T> -> Set<'T>
Calendar.holidays: Set<Date>
type Tenor =
{years: int;
months: int;
days: int;}
Full name: Script.Tenor
Tenor.years: int
Multiple items
val int : value:'T -> int (requires member op_Explicit)
Full name: Microsoft.FSharp.Core.Operators.int
--------------------
type int = int32
Full name: Microsoft.FSharp.Core.int
--------------------
type int<'Measure> = int
Full name: Microsoft.FSharp.Core.int<_>
Tenor.months: int
Tenor.days: int
val tenor : t:string -> Tenor
Full name: Script.tenor
val t : string
val regex : (string -> Regex)
val s : string
Multiple items
type Regex =
new : pattern:string -> Regex + 1 overload
member GetGroupNames : unit -> string[]
member GetGroupNumbers : unit -> int[]
member GroupNameFromNumber : i:int -> string
member GroupNumberFromName : name:string -> int
member IsMatch : input:string -> bool + 1 overload
member Match : input:string -> Match + 2 overloads
member Matches : input:string -> MatchCollection + 1 overload
member Options : RegexOptions
member Replace : input:string * replacement:string -> string + 5 overloads
...
Full name: System.Text.RegularExpressions.Regex
--------------------
Regex(pattern: string) : unit
Regex(pattern: string, options: RegexOptions) : unit
val pattern : Regex
val m : Match
Regex.Match(input: string) : Match
Regex.Match(input: string, startat: int) : Match
Regex.Match(input: string, beginning: int, length: int) : Match
property Group.Success: bool
property Match.Groups: GroupCollection
val failwith : message:string -> 'T
Full name: Microsoft.FSharp.Core.Operators.failwith
val offset : tenor:Tenor -> date:Date -> System.DateTime
Full name: Script.offset
val tenor : Tenor
val date : Date
System.DateTime.AddDays(value: float) : System.DateTime
Multiple items
val float : value:'T -> float (requires member op_Explicit)
Full name: Microsoft.FSharp.Core.Operators.float
--------------------
type float = System.Double
Full name: Microsoft.FSharp.Core.float
--------------------
type float<'Measure> = float
Full name: Microsoft.FSharp.Core.float<_>
val findNthWeekDay : n:int -> weekDay:System.DayOfWeek -> date:Date -> Date
Full name: Script.findNthWeekDay
val n : int
val weekDay : System.DayOfWeek
val mutable d : Date
property System.DateTime.Year: int
property System.DateTime.Month: int
property System.DateTime.DayOfWeek: System.DayOfWeek
val i : int
val Actual360 : period:Period -> float
Full name: Script.Actual360
val period : Period
Multiple items
val double : value:'T -> float (requires member op_Explicit)
Full name: Microsoft.FSharp.Core.ExtraTopLevelOperators.double
--------------------
type double = System.Double
Full name: Microsoft.FSharp.Core.double
val schedule : frequency:(Date -> Date) -> period:Period -> seq<Date>
Full name: Script.schedule
val frequency : (Date -> Date)
Multiple items
val seq : sequence:seq<'T> -> seq<'T>
Full name: Microsoft.FSharp.Core.Operators.seq
--------------------
type seq<'T> = System.Collections.Generic.IEnumerable<'T>
Full name: Microsoft.FSharp.Collections.seq<_>
val next : Date
val semiAnnual : from:Date -> System.DateTime
Full name: Script.semiAnnual
val from : Date
System.DateTime.AddMonths(months: int) : System.DateTime
val isBusinessDay : date:Date -> calendar:Calendar -> bool
Full name: Script.isBusinessDay
val calendar : Calendar
val not : value:bool -> bool
Full name: Microsoft.FSharp.Core.Operators.not
member Set.Contains : value:'T -> bool
type RollRule =
| Actual = 0
| Following = 1
| Previous = 2
| ModifiedFollowing = 3
| ModifiedPrevious = 4
Full name: Script.RollRule
RollRule.Actual: RollRule = 0
RollRule.Following: RollRule = 1
RollRule.Previous: RollRule = 2
RollRule.ModifiedFollowing: RollRule = 3
RollRule.ModifiedPrevious: RollRule = 4
val dayAfter : date:Date -> System.DateTime
Full name: Script.dayAfter
val dayBefore : date:Date -> System.DateTime
Full name: Script.dayBefore
val deriv : f:(float -> float) -> x:float -> float
Full name: Script.deriv
val f : (float -> float)
val x : float
val dx : float
val max : e1:'T -> e2:'T -> 'T (requires comparison)
Full name: Microsoft.FSharp.Core.Operators.max
val fv : float
val dfv : float
val newton : f:(double -> float) -> guess:double -> double
Full name: Script.newton
val f : (double -> float)
val guess : double
val solveNewton : f:(double -> float) -> accuracy:double -> guess:double -> double
Full name: Script.solveNewton
val accuracy : double
val root : double
val abs : value:'T -> 'T (requires member Abs)
Full name: Microsoft.FSharp.Core.Operators.abs
val logarithmic : sampleDate:Date -> Date * double -> Date * double -> double
Full name: Script.logarithmic
val sampleDate : Date
val highDp : Date * double
val lowDp : Date * double
val lowDate : Date
val lowFactor : double
val highDate : Date
val highFactor : double
val roll : rule:RollRule -> calendar:Calendar -> date:Date -> Date
Full name: Script.roll
val rule : RollRule
val prev : Date
val rollBy : n:int -> rule:RollRule -> calendar:Calendar -> date:Date -> Date
Full name: Script.rollBy
val x : int
val final : Date
val findDf : interpolate:(Date -> Date * double -> Date * double -> double) -> sampleDate:Date -> _arg1:(Date * double) list -> double
Full name: Script.findDf
val interpolate : (Date -> Date * double -> Date * double -> double)
val dpDate : Date
val dpFactor : double
val tail : (Date * double) list
val head : Date * double
val findPeriodDf : period:Period -> discountCurve:(Date * double) list -> double
Full name: Script.findPeriodDf
val discountCurve : (Date * double) list
val payDf : double
val valueDf : double
val computeDf : dayCount:(Period -> float) -> Date * float -> Date * float -> Date * float
Full name: Script.computeDf
val dayCount : (Period -> float)
val fromDf : Date * float
val toQuote : Date * float
val dpFactor : float
val qDate : Date
val qValue : float
val computeSwapDf : dayCount:(Period -> double) -> spotDate:Date -> Date * double -> discountCurve:(Date * double) list -> swapSchedule:Period list -> guessDf:double -> double
Full name: Script.computeSwapDf
val dayCount : (Period -> double)
val spotDate : Date
val swapQuote : Date * double
val swapSchedule : Period list
val guessDf : double
val qQuote : double
val guessDiscountCurve : (Date * double) list
val spotDf : double
val swapDf : double
val swapVal : double
val _computeSwapDf : (double -> Date -> double -> (Date * double) list -> Period list -> double)
val a : double
val swapPeriod : Period
val tail : Period list
val couponDf : double
Multiple items
type MeasureAttribute =
inherit Attribute
new : unit -> MeasureAttribute
Full name: Microsoft.FSharp.Core.MeasureAttribute
--------------------
new : unit -> MeasureAttribute
[<Measure>]
type bp
Full name: Script.bp
[<Measure>]
type percent
Full name: Script.percent
[<Measure>]
type price
Full name: Script.price
val convertPercentToRate : x:float<percent> -> float
Full name: Script.convertPercentToRate
val x : float<percent>
val convertPriceToRate : x:float<price> -> float
Full name: Script.convertPriceToRate
val x : float<price>
type InterestRateQuote =
| Rate of float
| Percent of float<percent>
| BasisPoints of float<bp>
member ToBasisPoints : unit -> float<bp>
member ToPercentage : unit -> float<percent>
member ToRate : unit -> float
Full name: Script.InterestRateQuote
union case InterestRateQuote.Rate: float -> InterestRateQuote
union case InterestRateQuote.Percent: float<percent> -> InterestRateQuote
union case InterestRateQuote.BasisPoints: float<bp> -> InterestRateQuote
val x : InterestRateQuote
member InterestRateQuote.ToRate : unit -> float
Full name: Script.InterestRateQuote.ToRate
val r : float
val p : float<percent>
Multiple items
val bp : float<bp>
--------------------
[<Measure>]
type bp
Full name: Script.bp
member InterestRateQuote.ToPercentage : unit -> float<percent>
Full name: Script.InterestRateQuote.ToPercentage
member InterestRateQuote.ToBasisPoints : unit -> float<bp>
Full name: Script.InterestRateQuote.ToBasisPoints
type FuturesContract = Date
Full name: Script.FuturesContract
val contract : d:string -> System.DateTime
Full name: Script.contract
type QuoteType =
| Overnight
| TomorrowNext
| TomorrowTomorrowNext
| Cash of Tenor
| Futures of FuturesContract
| Swap of Tenor
Full name: Script.QuoteType
union case QuoteType.Overnight: QuoteType
union case QuoteType.TomorrowNext: QuoteType
union case QuoteType.TomorrowTomorrowNext: QuoteType
union case QuoteType.Cash: Tenor -> QuoteType
union case QuoteType.Futures: FuturesContract -> QuoteType
union case QuoteType.Swap: Tenor -> QuoteType
val bootstrap : dayCount:(Period -> float) -> quotes:(Date * float) list -> discountCurve:(Date * float) list -> (Date * float) list
Full name: Script.bootstrap
val quotes : (Date * float) list
val discountCurve : (Date * float) list
val quote : Date * float
val tail : (Date * float) list
val newDf : Date * float
Multiple items
module List
from Microsoft.FSharp.Collections
--------------------
type List<'T> =
| ( [] )
| ( :: ) of Head: 'T * Tail: 'T list
interface IEnumerable
interface IEnumerable<'T>
member Head : 'T
member IsEmpty : bool
member Item : index:int -> 'T with get
member Length : int
member Tail : 'T list
static member Cons : head:'T * tail:'T list -> 'T list
static member Empty : 'T list
Full name: Microsoft.FSharp.Collections.List<_>
val head : list:'T list -> 'T
Full name: Microsoft.FSharp.Collections.List.head
val bootstrapCash : dayCount:(Period -> float) -> spotDate:Date -> quotes:(Date * float) list -> discountCurve:(Date * double) list -> (Date * double) list
Full name: Script.bootstrapCash
val spotDf : Date * double
val bootstrapFutures : dayCount:(Period -> float) -> futuresStartDate:Date option -> quotes:seq<Date * float> -> discountCurve:(Date * double) list -> (Date * float) list
Full name: Script.bootstrapFutures
val futuresStartDate : Date option
val quotes : seq<Date * float>
union case Option.Some: Value: 'T -> Option<'T>
val d : Date
module Seq
from Microsoft.FSharp.Collections
val toList : source:seq<'T> -> 'T list
Full name: Microsoft.FSharp.Collections.Seq.toList
union case Option.None: Option<'T>
val bootstrapSwaps : dayCount:(Period -> double) -> spotDate:Date -> calendar:Calendar -> swapQuotes:(Date * double) list -> discountCurve:(Date * double) list -> (Date * double) list
Full name: Script.bootstrapSwaps
val swapQuotes : (Date * double) list
val swapDates : seq<Date>
val rolledSwapDates : seq<Date>
val map : mapping:('T -> 'U) -> source:seq<'T> -> seq<'U>
Full name: Microsoft.FSharp.Collections.Seq.map
val swapPeriods : Period list
val s : Date
val e : Date
val pairwise : source:seq<'T> -> seq<'T * 'T>
Full name: Microsoft.FSharp.Collections.Seq.pairwise
val accuracy : float
val spotFactor : double
val f : (double -> double)
val newDf : double
val USD : Calendar
Full name: Script.USD
field System.DayOfWeek.Saturday = 6
field System.DayOfWeek.Sunday = 0
val curveDate : System.DateTime
Full name: Script.curveDate
val spotDate : Date
Full name: Script.spotDate
val quotes : (QuoteType * float) list
Full name: Script.quotes
val spotPoints : (Date * float) list
Full name: Script.spotPoints
val choose : chooser:('T -> 'U option) -> list:'T list -> 'U list
Full name: Microsoft.FSharp.Collections.List.choose
val t : QuoteType
val q : float
val sortBy : projection:('T -> 'Key) -> list:'T list -> 'T list (requires comparison)
Full name: Microsoft.FSharp.Collections.List.sortBy
val cashPoints : (Date * float) list
Full name: Script.cashPoints
val c : Tenor
val futuresQuotes : (FuturesContract * float) list
Full name: Script.futuresQuotes
val f : FuturesContract
val c : FuturesContract
val sc : FuturesContract
Full name: Script.sc
val ec : FuturesContract
Full name: Script.ec
property List.Length: int
val futuresStartDate : Date
Full name: Script.futuresStartDate
field System.DayOfWeek.Wednesday = 3
val futuresEndDate : System.DateTime
Full name: Script.futuresEndDate
val endContract : System.DateTime * float
Full name: Script.endContract
val futuresPoints : (Date * float) list
Full name: Script.futuresPoints
val append : source1:seq<'T> -> source2:seq<'T> -> seq<'T>
Full name: Microsoft.FSharp.Collections.Seq.append
val q1 : float
val c2 : FuturesContract
val swapPoints : (Date * float) list
Full name: Script.swapPoints
val s : Tenor
val discountFactors : seq<Date * double>
Full name: Script.discountFactors
val sortBy : projection:('T -> 'Key) -> source:seq<'T> -> seq<'T> (requires comparison)
Full name: Microsoft.FSharp.Collections.Seq.sortBy
val printfn : format:Printf.TextWriterFormat<'T> -> 'T
Full name: Microsoft.FSharp.Core.ExtraTopLevelOperators.printfn
val iter : action:('T -> unit) -> source:seq<'T> -> unit
Full name: Microsoft.FSharp.Collections.Seq.iter
val v : double
System.DateTime.ToString() : string
System.DateTime.ToString(provider: System.IFormatProvider) : string
System.DateTime.ToString(format: string) : string
System.DateTime.ToString(format: string, provider: System.IFormatProvider) : string
val zeroCouponRates : seq<Date * float>
Full name: Script.zeroCouponRates
val f : double
val log : value:'T -> 'T (requires member Log)
Full name: Microsoft.FSharp.Core.Operators.log
val v : float
More information