Functional Weave
Code in Python

invest.dividend-yield@1.0.0

vectors.json

8,523 bytes · view raw

[
 {
  "name": "quarterly payer at 250p: 22p trailing is 8.8%, 6p a quarter forward is 9.6%",
  "args": [
   {
    "minor": 250,
    "currency": "GBP"
   },
   [
    {
     "minor": 5,
     "currency": "GBP"
    },
    {
     "minor": 6,
     "currency": "GBP"
    },
    {
     "minor": 5,
     "currency": "GBP"
    },
    {
     "minor": 6,
     "currency": "GBP"
    }
   ],
   {
    "minor": 6,
    "currency": "GBP"
   },
   4
  ],
  "expect": {
   "trailingAnnual": {
    "minor": 22,
    "currency": "GBP"
   },
   "forwardAnnual": {
    "minor": 24,
    "currency": "GBP"
   },
   "trailingBasisPoints": 880,
   "forwardBasisPoints": 960
  }
 },
 {
  "name": "after a dividend cut the forward yield halves while the trailing yield has not moved",
  "args": [
   {
    "minor": 1000,
    "currency": "GBP"
   },
   [
    {
     "minor": 10,
     "currency": "GBP"
    },
    {
     "minor": 10,
     "currency": "GBP"
    },
    {
     "minor": 10,
     "currency": "GBP"
    },
    {
     "minor": 10,
     "currency": "GBP"
    }
   ],
   {
    "minor": 5,
    "currency": "GBP"
   },
   4
  ],
  "expect": {
   "trailingAnnual": {
    "minor": 40,
    "currency": "GBP"
   },
   "forwardAnnual": {
    "minor": 20,
    "currency": "GBP"
   },
   "trailingBasisPoints": 400,
   "forwardBasisPoints": 200
  }
 },
 {
  "name": "a special dividend lifts the trailing yield only",
  "args": [
   {
    "minor": 2000,
    "currency": "GBP"
   },
   [
    {
     "minor": 30,
     "currency": "GBP"
    },
    {
     "minor": 50,
     "currency": "GBP"
    },
    {
     "minor": 30,
     "currency": "GBP"
    }
   ],
   {
    "minor": 30,
    "currency": "GBP"
   },
   2
  ],
  "expect": {
   "trailingAnnual": {
    "minor": 110,
    "currency": "GBP"
   },
   "forwardAnnual": {
    "minor": 60,
    "currency": "GBP"
   },
   "trailingBasisPoints": 550,
   "forwardBasisPoints": 300
  }
 },
 {
  "name": "fractions of a penny: 11.8p twice a year on 1,234.56p, given per 100 shares",
  "args": [
   {
    "minor": 123456,
    "currency": "GBP"
   },
   [
    {
     "minor": 1180,
     "currency": "GBP"
    },
    {
     "minor": 1180,
     "currency": "GBP"
    }
   ],
   {
    "minor": 1180,
    "currency": "GBP"
   },
   2
  ],
  "expect": {
   "trailingAnnual": {
    "minor": 2360,
    "currency": "GBP"
   },
   "forwardAnnual": {
    "minor": 2360,
    "currency": "GBP"
   },
   "trailingBasisPoints": 191,
   "forwardBasisPoints": 191
  }
 },
 {
  "name": "a third of a basis point rounds down",
  "args": [
   {
    "minor": 3,
    "currency": "GBP"
   },
   [
    {
     "minor": 1,
     "currency": "GBP"
    }
   ],
   {
    "minor": 1,
    "currency": "GBP"
   },
   1
  ],
  "expect": {
   "trailingAnnual": {
    "minor": 1,
    "currency": "GBP"
   },
   "forwardAnnual": {
    "minor": 1,
    "currency": "GBP"
   },
   "trailingBasisPoints": 3333,
   "forwardBasisPoints": 3333
  }
 },
 {
  "name": "half a basis point rounds up",
  "args": [
   {
    "minor": 20000,
    "currency": "GBP"
   },
   [
    {
     "minor": 1,
     "currency": "GBP"
    }
   ],
   {
    "minor": 1,
    "currency": "GBP"
   },
   1
  ],
  "expect": {
   "trailingAnnual": {
    "minor": 1,
    "currency": "GBP"
   },
   "forwardAnnual": {
    "minor": 1,
    "currency": "GBP"
   },
   "trailingBasisPoints": 1,
   "forwardBasisPoints": 1
  }
 },
 {
  "name": "a quarter of a basis point rounds down to zero",
  "args": [
   {
    "minor": 40000,
    "currency": "GBP"
   },
   [
    {
     "minor": 1,
     "currency": "GBP"
    }
   ],
   {
    "minor": 0,
    "currency": "GBP"
   },
   1
  ],
  "expect": {
   "trailingAnnual": {
    "minor": 1,
    "currency": "GBP"
   },
   "forwardAnnual": {
    "minor": 0,
    "currency": "GBP"
   },
   "trailingBasisPoints": 0,
   "forwardBasisPoints": 0
  }
 },
 {
  "name": "no dividends in the last year and none declared",
  "args": [
   {
    "minor": 500,
    "currency": "GBP"
   },
   [],
   {
    "minor": 0,
    "currency": "GBP"
   },
   4
  ],
  "expect": {
   "trailingAnnual": {
    "minor": 0,
    "currency": "GBP"
   },
   "forwardAnnual": {
    "minor": 0,
    "currency": "GBP"
   },
   "trailingBasisPoints": 0,
   "forwardBasisPoints": 0
  }
 },
 {
  "name": "monthly payer in dollars",
  "args": [
   {
    "minor": 2500,
    "currency": "USD"
   },
   [
    {
     "minor": 10,
     "currency": "USD"
    },
    {
     "minor": 10,
     "currency": "USD"
    },
    {
     "minor": 10,
     "currency": "USD"
    },
    {
     "minor": 10,
     "currency": "USD"
    },
    {
     "minor": 10,
     "currency": "USD"
    },
    {
     "minor": 10,
     "currency": "USD"
    },
    {
     "minor": 10,
     "currency": "USD"
    },
    {
     "minor": 10,
     "currency": "USD"
    },
    {
     "minor": 10,
     "currency": "USD"
    },
    {
     "minor": 10,
     "currency": "USD"
    },
    {
     "minor": 10,
     "currency": "USD"
    },
    {
     "minor": 10,
     "currency": "USD"
    }
   ],
   {
    "minor": 11,
    "currency": "USD"
   },
   12
  ],
  "expect": {
   "trailingAnnual": {
    "minor": 120,
    "currency": "USD"
   },
   "forwardAnnual": {
    "minor": 132,
    "currency": "USD"
   },
   "trailingBasisPoints": 480,
   "forwardBasisPoints": 528
  }
 },
 {
  "name": "a yield above 100% is reported, not capped",
  "args": [
   {
    "minor": 100,
    "currency": "GBP"
   },
   [
    {
     "minor": 150,
     "currency": "GBP"
    }
   ],
   {
    "minor": 150,
    "currency": "GBP"
   },
   1
  ],
  "expect": {
   "trailingAnnual": {
    "minor": 150,
    "currency": "GBP"
   },
   "forwardAnnual": {
    "minor": 150,
    "currency": "GBP"
   },
   "trailingBasisPoints": 15000,
   "forwardBasisPoints": 15000
  }
 },
 {
  "name": "a price of zero is an error",
  "args": [
   {
    "minor": 0,
    "currency": "GBP"
   },
   [
    {
     "minor": 1,
     "currency": "GBP"
    }
   ],
   {
    "minor": 1,
    "currency": "GBP"
   },
   1
  ],
  "expectError": "price must be whole minor units greater than zero"
 },
 {
  "name": "a negative price is an error",
  "args": [
   {
    "minor": -100,
    "currency": "GBP"
   },
   [
    {
     "minor": 1,
     "currency": "GBP"
    }
   ],
   {
    "minor": 1,
    "currency": "GBP"
   },
   1
  ],
  "expectError": "price must be whole minor units greater than zero"
 },
 {
  "name": "a fractional price is an error",
  "args": [
   {
    "minor": 99.5,
    "currency": "GBP"
   },
   [
    {
     "minor": 1,
     "currency": "GBP"
    }
   ],
   {
    "minor": 1,
    "currency": "GBP"
   },
   1
  ],
  "expectError": "price must be whole minor units greater than zero"
 },
 {
  "name": "a negative dividend is an error",
  "args": [
   {
    "minor": 100,
    "currency": "GBP"
   },
   [
    {
     "minor": -1,
     "currency": "GBP"
    }
   ],
   {
    "minor": 1,
    "currency": "GBP"
   },
   1
  ],
  "expectError": "dividends must be whole minor units, 0 or more"
 },
 {
  "name": "a fractional dividend is an error: give amounts per lot instead",
  "args": [
   {
    "minor": 100,
    "currency": "GBP"
   },
   [
    {
     "minor": 11.8,
     "currency": "GBP"
    }
   ],
   {
    "minor": 1,
    "currency": "GBP"
   },
   1
  ],
  "expectError": "dividends must be whole minor units, 0 or more"
 },
 {
  "name": "a dividend in another currency is an error",
  "args": [
   {
    "minor": 100,
    "currency": "GBP"
   },
   [
    {
     "minor": 1,
     "currency": "USD"
    }
   ],
   {
    "minor": 1,
    "currency": "GBP"
   },
   1
  ],
  "expectError": "currency mismatch: GBP and USD"
 },
 {
  "name": "zero payments a year is an error",
  "args": [
   {
    "minor": 100,
    "currency": "GBP"
   },
   [
    {
     "minor": 1,
     "currency": "GBP"
    }
   ],
   {
    "minor": 1,
    "currency": "GBP"
   },
   0
  ],
  "expectError": "paymentsPerYear must be a whole number from 1 to 52"
 },
 {
  "name": "53 payments a year is an error",
  "args": [
   {
    "minor": 100,
    "currency": "GBP"
   },
   [
    {
     "minor": 1,
     "currency": "GBP"
    }
   ],
   {
    "minor": 1,
    "currency": "GBP"
   },
   53
  ],
  "expectError": "paymentsPerYear must be a whole number from 1 to 52"
 },
 {
  "name": "fractional payments a year is an error",
  "args": [
   {
    "minor": 100,
    "currency": "GBP"
   },
   [
    {
     "minor": 1,
     "currency": "GBP"
    }
   ],
   {
    "minor": 1,
    "currency": "GBP"
   },
   2.5
  ],
  "expectError": "paymentsPerYear must be a whole number from 1 to 52"
 }
]