nfTlWNl rn Ѻq$³*%yNk9SVBŹ!SOY˯ID Ѻq$³*%yNk9S8jnM/=uRqCO&oAY\QN#]>\*]MpWmI\٨z#t`W _#1Iķխ}`[W">/m6a7{K]}eЄe#2 ` d$knV)=} Ѻq$³*%yNk9SVBŹ!S_+b_#1Iķխ}`[W">/m6}jLck-=&oAY\QN#]>oagaZ unM_#1Iķխ}`[W">/m6snTs;wƖR8㑇KR5RSB)̪.JU~wV]~,Jٺʚ@lwWNmpOVi&$:A{ 좢E)ٛ">3mSZQyۉC)z6u W [u)2aRe.pO )_A[:#edo.J=q7oqlx2n먞GBN3CI5O~]D,*&vה) ĢQ$3(jħQV7ò9AX5l,,c& &!jܦ .^KMLϽuEPp>6Cr ĢQ$3J4U-|5\t#q7ck.ȶo^H. G\[gx[.`xC=/.O!"&3 I]C63 ĢQ$3U-UAF4]WYj;Ȭ[P.HA󰷗H)ʤy 1`*U 3Elvaw~[++ܶ'Q |v)NGCX~mrkc `;%cPGs aܳ,6NpZcnKH(Qױ5+0ᯱz̳I"ES4r8|=B;Np7J8'?ZmIy7q/gr\"ES4r8|=B;Np7J8ś_תIBTmJ_|7iQw|qu~D4 o!3ʖ˫ם[ 6SқHZ&ihEnyE (Sz%QJkٌa[g}$G"5 D OУ!|Z ̳BX=`vNkJgKo76|ՂYa+!_2b"GPNBwFԭTOAQgJ\w[ļS⾻-9:iA{ļxGe,z{6̎ඩ ̱°Xrb&BfDBۢ$@/)*+?Mwkk}6Rlk孶Yڷۦb}@-m 8buy{Οܰ8G}bo;mU0J.[Ao5.O4XztQ8bfsm*#O;(iClФ㴟-e2ERb4YW@HkDG?鲍>_ʟ-RNj+fKJȏ-\$JNCH_(\}TOiG7s>@:a7*QL'JƲRY&@tݍ\`\뗬xV1x/Ҩ{mYe,<{dP^`d%ޢbϵx.stQ8bf5n0`RR=dk*ـWv$qVf8mcghty*fHjzD {|N/Y7U[cMC)ܷoLV%qu/%b*-r%&_qg;*(n.DL_U<*oQps5b9& gwɩtDwe3c$Ҽ*FlO9R'Tط˫3|}6 C5v X-ZB;!)`}r0F*^:$?\:vnoWAK)wNHL z'Ve3k?9 o$Ku?=D4鞣$JHfるfE4ZU/(e#P$!Yt≗jf>zSȲ1C'CuA OTdlW\ .I U4N_bHSTwJv!8!wSu*zgg&3*<4 DFyagŁ&C-J;3q\e&> %2Vh8& dWZyf3\d'wT2_+!2qC9X=Ltkܴ|c +WTz2S= ι)LÃ虞I9irĠY[!Epfd_rdq}6// UGp#}4Zscounted security. * * @param mixed $settlement The security's settlement date. * The security settlement date is the date after the issue date when the security * is traded to the buyer. * @param mixed $maturity The security's maturity date. * The maturity date is the date when the security expires. * @param mixed $discount The security's discount rate * @param mixed $redemption The security's redemption value per $100 face value * @param mixed $basis The type of day count to use. * 0 or omitted US (NASD) 30/360 * 1 Actual/actual * 2 Actual/360 * 3 Actual/365 * 4 European 30/360 * * @return float|string Result, or a string containing an error */ public static function priceDiscounted( $settlement, $maturity, $discount, $redemption, $basis = FinancialConstants::BASIS_DAYS_PER_YEAR_NASD ) { $settlement = Functions::flattenSingleValue($settlement); $maturity = Functions::flattenSingleValue($maturity); $discount = Functions::flattenSingleValue($discount); $redemption = Functions::flattenSingleValue($redemption); $basis = ($basis === null) ? FinancialConstants::BASIS_DAYS_PER_YEAR_NASD : Functions::flattenSingleValue($basis); try { $settlement = SecurityValidations::validateSettlementDate($settlement); $maturity = SecurityValidations::validateMaturityDate($maturity); SecurityValidations::validateSecurityPeriod($settlement, $maturity); $discount = SecurityValidations::validateDiscount($discount); $redemption = SecurityValidations::validateRedemption($redemption); $basis = SecurityValidations::validateBasis($basis); } catch (Exception $e) { return $e->getMessage(); } $daysBetweenSettlementAndMaturity = Functions::scalar(DateTimeExcel\YearFrac::fraction($settlement, $maturity, $basis)); if (!is_numeric($daysBetweenSettlementAndMaturity)) { // return date error return $daysBetweenSettlementAndMaturity; } return $redemption * (1 - $discount * $daysBetweenSettlementAndMaturity); } /** * PRICEMAT. * * Returns the price per $100 face value of a security that pays interest at maturity. * * @param mixed $settlement The security's settlement date. * The security's settlement date is the date after the issue date when the * security is traded to the buyer. * @param mixed $maturity The security's maturity date. * The maturity date is the date when the security expires. * @param mixed $issue The security's issue date * @param mixed $rate The security's interest rate at date of issue * @param mixed $yield The security's annual yield * @param mixed $basis The type of day count to use. * 0 or omitted US (NASD) 30/360 * 1 Actual/actual * 2 Actual/360 * 3 Actual/365 * 4 European 30/360 * * @return float|string Result, or a string containing an error */ public static function priceAtMaturity( $settlement, $maturity, $issue, $rate, $yield, $basis = FinancialConstants::BASIS_DAYS_PER_YEAR_NASD ) { $settlement = Functions::flattenSingleValue($settlement); $maturity = Functions::flattenSingleValue($maturity); $issue = Functions::flattenSingleValue($issue); $rate = Functions::flattenSingleValue($rate); $yield = Functions::flattenSingleValue($yield); $basis = ($basis === null) ? FinancialConstants::BASIS_DAYS_PER_YEAR_NASD : Functions::flattenSingleValue($basis); try { $settlement = SecurityValidations::validateSettlementDate($settlement); $maturity = SecurityValidations::validateMaturityDate($maturity); SecurityValidations::validateSecurityPeriod($settlement, $maturity); $issue = SecurityValidations::validateIssueDate($issue); $rate = SecurityValidations::validateRate($rate); $yield = SecurityValidations::validateYield($yield); $basis = SecurityValidations::validateBasis($basis); } catch (Exception $e) { return $e->getMessage(); } $daysPerYear = Helpers::daysPerYear(Functions::scalar(DateTimeExcel\DateParts::year($settlement)), $basis); if (!is_numeric($daysPerYear)) { return $daysPerYear; } $daysBetweenIssueAndSettlement = Functions::scalar(DateTimeExcel\YearFrac::fraction($issue, $settlement, $basis)); if (!is_numeric($daysBetweenIssueAndSettlement)) { // return date error return $daysBetweenIssueAndSettlement; } $daysBetweenIssueAndSettlement *= $daysPerYear; $daysBetweenIssueAndMaturity = Functions::scalar(DateTimeExcel\YearFrac::fraction($issue, $maturity, $basis)); if (!is_numeric($daysBetweenIssueAndMaturity)) { // return date error return $daysBetweenIssueAndMaturity; } $daysBetweenIssueAndMaturity *= $daysPerYear; $daysBetweenSettlementAndMaturity = Functions::scalar(DateTimeExcel\YearFrac::fraction($settlement, $maturity, $basis)); if (!is_numeric($daysBetweenSettlementAndMaturity)) { // return date error return $daysBetweenSettlementAndMaturity; } $daysBetweenSettlementAndMaturity *= $daysPerYear; return (100 + (($daysBetweenIssueAndMaturity / $daysPerYear) * $rate * 100)) / (1 + (($daysBetweenSettlementAndMaturity / $daysPerYear) * $yield)) - (($daysBetweenIssueAndSettlement / $daysPerYear) * $rate * 100); } /** * RECEIVED. * * Returns the amount received at maturity for a fully invested Security. * * @param mixed $settlement The security's settlement date. * The security settlement date is the date after the issue date when the security * is traded to the buyer. * @param mixed $maturity The security's maturity date. * The maturity date is the date when the security expires. * @param mixed $investment The amount invested in the security * @param mixed $discount The security's discount rate * @param mixed $basis The type of day count to use. * 0 or omitted US (NASD) 30/360 * 1 Actual/actual * 2 Actual/360 * 3 Actual/365 * 4 European 30/360 * * @return float|string Result, or a string containing an error */ public static function received( $settlement, $maturity, $investment, $discount, $basis = FinancialConstants::BASIS_DAYS_PER_YEAR_NASD ) { $settlement = Functions::flattenSingleValue($settlement); $maturity = Functions::flattenSingleValue($maturity); $investment = Functions::flattenSingleValue($investment); $discount = Functions::flattenSingleValue($discount); $basis = ($basis === null) ? FinancialConstants::BASIS_DAYS_PER_YEAR_NASD : Functions::flattenSingleValue($basis); try { $settlement = SecurityValidations::validateSettlementDate($settlement); $maturity = SecurityValidations::validateMaturityDate($maturity); SecurityValidations::validateSecurityPeriod($settlement, $maturity); $investment = SecurityValidations::validateFloat($investment); $discount = SecurityValidations::validateDiscount($discount); $basis = SecurityValidations::validateBasis($basis); } catch (Exception $e) { return $e->getMessage(); } if ($investment <= 0) { return ExcelError::NAN(); } $daysBetweenSettlementAndMaturity = DateTimeExcel\YearFrac::fraction($settlement, $maturity, $basis); if (!is_numeric($daysBetweenSettlementAndMaturity)) { // return date error return Functions::scalar($daysBetweenSettlementAndMaturity); } return $investment / (1 - ($discount * $daysBetweenSettlementAndMaturity)); } }