; 4.2.scm
; 2024-10-06
; $Id: 4.2.scm 1.1 2024/10/26 13:59:03 s Exp $
; s , current spot rate curve
; s2, next year's spot rate curve

(use gauche.array)
(define (main args)
    ; procedure
    ; (1+s_j)^j=(1+s_i)^i*(1+f_ij)^(j-i))  p.97, forward rate formula
    ; i=1                                  p.100, ll.12-14.
    ; (1+s_j)^j=(1+s_1)^1*(1+f_1j)^(j-1)
    ; (1+s_1)^1*(1+f_1j)^(j-1)= (1+s_j)^j
    ;           (1+f_1j)^(j-1)=[(1+s_j)^j/(1+s_1)]
    ;           (1+f_1j)      =[(1+s_j)^j/(1+s_1)]^(1/(j-1))
    ;              f_1j       =[(1+s_j)^j/(1+s_1)]^(1/(j-1))-1
    (define f_1 
        (^j (- (expt (/ (expt (+ 1 (ref s j)) j) (+ 1 s_1)) (/ 1 (- j 1))) 1)))

    ; input
    (define s_percent (list 0.0 5.0 5.3 5.6 5.8 6.0 6.1))

    ; calculating
    (define s   (map (^x (/ x 100)) s_percent))
    (define s_1 (ref s 1))
    (define f   (cons 0.0 (map (^j (f_1 j)) (iota (- (length s) 2) 2))))
    (define s2_percent  (map (^x (* x 100)) f))

    ; output
    (print "4.2.scm")
    (print "current spot rate curve")
    (print "s " s_percent)
    (print "next year's spot rate curve")
    (print "s'" (map (^x (/ (round (* x 10)) 10)) s2_percent))
0)
; end