def test_add_3(self): var2 = self.input1 + self.input2 constant = 4 var3 = var2 + constant derivatives = interpret(self.tape) self.assertEqual(derivatives[0], 1) self.assertEqual(derivatives[1], 1)
def test_div_sub_combo(self): var1 = self.input1 - self.input2 var2 = self.input1 * self.input2 var3 = var1 / (2 * var2) derivatives = interpret(self.tape) self.assertEqual(derivatives[0], 1 / 18) self.assertEqual(derivatives[1], -1 / 50)
def AAAD_derivatives(): for i in range(0, aaad_option.__len__()): for j in range(0, aaad_option[i].__len__()-1): aaad_option[i][j].tape.append(TapeEntry(OperationTypeAad.INPUT, aaad_option[i][j].value)) result = BSPrice_AAAD(*aaad_option[i]) derivatives = interpret(result.tape) result.tape.clr()
def test_aaad(self): call = BSPrice_Analytical(*self.input, True) aaad_price = BSPrice_AAAD(*self.input_aaad, True) aaad_derivatives = interpret(aaad_price.tape) self.assertAlmostEqual(call['price'], aaad_price.value, places=8) self.assertAlmostEqual(call['derivatives'][0], aaad_derivatives[0], places=8) self.assertAlmostEqual(call['derivatives'][1], aaad_derivatives[1], places=8) self.assertAlmostEqual(-call['derivatives'][3], aaad_derivatives[3], places=8) self.assertAlmostEqual(call['derivatives'][4], aaad_derivatives[4], places=8)
def test_div3(self): res = self.input2 / self.input1 derivatives = interpret(self.tape) self.assertEqual(derivatives[0], -5 / 9) self.assertEqual(derivatives[1], 1 / 3)
def test_pow2(self): res = self.input2**self.input1 derivatives = interpret(self.tape) self.assertEqual(res.value, 125) self.assertEqual(derivatives[0], (5**3 * math.log(5))) self.assertEqual(derivatives[1], 75)
def test_div1(self): res = self.input1 / 5 derivatives = interpret(self.tape) self.assertEqual(derivatives[0], .2)
def test_div2(self): res = 5 / self.input1 derivatives = interpret(self.tape) self.assertEqual(derivatives[0], -5 / 9)
def test_min_3(self): res = 1 - self.input1 derivatives = interpret(self.tape) self.assertEqual(derivatives[0], -1)
def test_min_4(self): res = self.input1 - 2 derivatives = interpret(self.tape) self.assertEqual(derivatives[0], 1)
def test_pow1(self): res = self.input1**2 derivatives = interpret(self.tape) self.assertEqual(res.value, 9) self.assertEqual(derivatives[0], 6)
def test_log(self): res = self.input1.log() derivative = interpret(self.tape) self.assertEqual(res.value, math.log(3)) self.assertEqual(derivative[0], 1 / 3)
def test_pow3(self): res = 4**self.input1 derivatives = interpret(self.tape) self.assertEqual(res.value, 64) self.assertEqual(derivatives[0], 4**self.input1.value * math.log(4))
import unittest from finance.BlackScholesOptionPricer import * from finiteDifference.FiniteDifferenceFirstOrder import differentiate from automaticDifferentiation.DoubleAad import DoubleAad from automaticDifferentiation.Tape import Tape from automaticDifferentiation.TapeEntry import TapeEntry from automaticDifferentiation.OperationTypeAad import OperationTypeAad from automaticDifferentiation.TapeUtils import interpret tape = Tape() sigma_hat = DoubleAad(0.2 * math.sqrt(0.5), 0, tape) tape.append(TapeEntry(OperationTypeAad.INPUT, sigma_hat.value)) S_t = DoubleAad(20, 1, tape) tape.append(TapeEntry(OperationTypeAad.INPUT, S_t.value)) K = DoubleAad(25, 2, tape) tape.append(TapeEntry(OperationTypeAad.INPUT, K.value)) r = DoubleAad(0.05, 3, tape) tape.append(TapeEntry(OperationTypeAad.INPUT, r.value)) sigma = DoubleAad(0.2, 4, tape) tape.append(TapeEntry(OperationTypeAad.INPUT, sigma.value)) tau = DoubleAad(0.5, 5, tape) tape.append(TapeEntry(OperationTypeAad.INPUT, tau.value)) d1 = 1 / sigma_hat * ((S_t / K).log() + (r + sigma**2 / 2) * tau) interpret(tape) print(tape) asdf = 1
def test_negate(self): res = -self.input1 derivative = interpret(res.tape) self.assertEqual(-3, res.value) self.assertEqual(derivative[0], -1)
def test_normalcdf(self): res = self.input1.normalcdf() derivative = interpret(self.tape) self.assertEqual(res.value, norm.cdf(3)) self.assertEqual(derivative[0], norm.pdf(3))
def test_exp(self): res = self.input1.exp() derivative = interpret(self.tape) self.assertEqual(res.value, math.exp(3)) self.assertEqual(derivative[0], math.exp(3))
def test_div4(self): res = 1 / (2 * self.input1 * self.input2) derivatives = interpret(self.tape) self.assertEqual(derivatives[0], -1 / (45 * 2)) self.assertAlmostEqual(derivatives[1], -1 / (75 * 2), places=8)
def test_min_2(self): res = 5.0 - self.input1 - 4 - self.input2 derivatives = interpret(self.tape) self.assertEqual(derivatives[0], -1) self.assertEqual(derivatives[1], -1)
def test_mul_1(self): var1 = self.input1 * 3 var2 = var1 * self.input2 derivatives = interpret(self.tape) self.assertEqual(derivatives[0], 15) self.assertEqual(derivatives[1], 9)
def test_sqrt(self): res = self.input1.sqrt() derivatives = interpret(self.tape) self.assertEqual(res.value, math.sqrt(3)) self.assertEqual(derivatives[0], 0.5 / math.sqrt(3))
def test_mul_2(self): res = 2 * self.input1 * self.input2 * 3 derivatives = interpret(self.tape) self.assertEqual(res.value, 90) self.assertEqual(derivatives[0], 30) self.assertEqual(derivatives[1], 18)
def test_div5(self): res = 1 / (self.input1 - self.input2) derivatives = interpret(self.tape) self.assertEqual(derivatives[0], -1 / 4) self.assertEqual(derivatives[1], 1 / 4)