uruba/financalc

一个轻量级、简单且易于使用的PHP库,用于根据各种输入数据计算年金(例如,抵押贷款)

v0.3.14 2016-02-15 18:17 UTC

README

一个轻量级、简单且易于使用的PHP库,用于计算年金(例如,抵押贷款)和其他金融工具。

Composer package Build Status Code Climate Scrutinizer Code Quality codecov.io

需求

  • PHP 5.4+
  • BCMath模块

可选

  • PHPUnit (用于测试)

功能

  • 简单利息计算器
  • 简单贴现计算器
  • 年金现值和未来值计算器
  • 债务摊销计算器
  • 债券公允价值计算器
  • 债券到期收益率(YTM)计算器
  • 债券久期计算器
  • 股息折现模型(DDM)计算器
  • 股票/股份的投资比率计算器

更多功能即将推出——包括贴现证券计算器(注意:现在可以通过简单贴现计算器进行计算)、债券估值久期股票定价... 也正在考虑其他优化和改进。当前热点想法

  • 在计算器结果数组的getter中使用反射以提高新计算器类的实现效率和减少错误(这已经通过使用属性名称的辅助数组来解决)
  • 用于确定与计算工具相关事件的精确日期的时间函数(通过TimeSpan对象和在适用类中的适当getter方法实现)
  • 能够创建未填充的计算器对象(然后可以通过setter进行填充),从而避免了通过构造函数传递所有数据的需要,从而提供了更大的灵活性
  • 支持各种计息惯例(这从一开始就被考虑,但尚未实现)
  • 更好的模块化,具有简单易懂的工作流程(类似于插件系统)
  • 反序列化器(作为I/O包的一部分)
  • 通过缓存避免永久使用反射

请记住,这是一个ALPHA版本,包含不完整的功能。代码库在退出alpha阶段的过程中可能会发生重大变化。

学习曲线

将库文件放入您的目录结构中

只需将所有文件复制到合适的位置,例如专门的 "vendor" 或 "lib" 目录(这样就不会使您的目录层次结构变得混乱)。不需要其他任何东西。

或者,您可以通过Composer作为包获取库。它托管在 Packagist

将其包含到您的项目中

初始化非常简单。只需在主目录中包含 init.php 文件即可!

// replace the example Composer-bound path with yours
require_once 'vendor/uruba/financalc/init.php';

或者,如果您使用Composer,您可以使用其 autoload.php 文件。

require_once 'vendor/autoload.php';

实例化

您有两种选择来实例化适当的类以获取结果

工厂方法

由于库自动跟踪预定义的工厂方法(包含在命名空间 FinanCalc\Calculators\Factories 的成员类中),因此使用它们非常简单直接。

从主 FinanCalc 对象(您可以通过调用其静态方法 getInstance() 获取其实例)中,您必须调用 getFactory() 方法,该方法接受类型为 string 的工厂类名称作为参数(您可以在 src/calculators/factories 目录中找到所有包含的工厂类)。

此方法为您生成最终的计算器对象,您可以调用适当的方法来检索您的结果(如下一章所述)或通过其setter更改输入参数。

use FinanCalc\FinanCalc;

...

$annuityCalculatorFactory = FinanCalc
    ::getInstance()
    ->getFactory('DebtAmortizatorFactory')
    ->newYearlyDebtAmortization(
        40000,
        6,
        0.12);

直接实例化

第二个选项是直接通过调用其构造函数并传递适当的参数来实例化你选择的计算器类(你可以在src/calculators目录中找到所有包含的计算器类)。

use FinanCalc\Calculators\DebtAmortizator;
use FinanCalc\Utils\Time\TimeUtils;

...

$annuityCalculatorDirect = new DebtAmortizator(
                                       40000,
                                       6,
                                       TimeSpan::asDuration(1),
                                       0.12);

获取结果

有三种方式可以检索计算结果的原始数据

直接访问的结果对象

通过调用适当的getter方法检索结果非常简单。每个实现了CalculatorAbstract接口的计算器类都有一个getter方法getResult(),它允许你根据先前传递给给定计算器类构造函数/工厂方法的参数获取表示计算结果的适当对象(从版本0.3.0开始,此中间步骤不再需要,如果您是从早期版本升级,请更新代码并删除对getResult()方法的调用)

我们将以我们的AnnuityCalculator为例来演示这个过程——一步一步,一天一天

  1. 步骤是实例化适当的计算器类,无论是通过构造函数还是通过工厂方法(有关更多信息,请参阅上一章)

    use FinanCalc\FinanCalc;
    
    ...
    
    // Instantiation by a factory method 
    // – 
    // in our case we calculate a yearly-compounded annuity
    // with a duration of 5 periods (here years),
    // 100000 money units paid out per period
    // and a compounding interest rate of 0.15 (i.e., 15%)
    $annuityCalculatorObject = FinanCalc
                                    ::getInstance()
                                    ->getFactory('AnnuityCalculatorFactory')
                                    ->newYearlyAnnuity(
                                        100000, 
                                        5, 
                                        0.15);
  2. 步骤是利用适当的getter方法获取所需值(有关可用getter方法的详细列表,请参阅参考章节)

    // get the present value of the annuity in arrears
    // (as a string)
    $PV = $annuityCalculatorObject->getPresentValue(
                        new AnnuityPaymentTypes(AnnuityPaymentTypes::IN_ARREARS)
                    );
    // get the future value of the annuity in arrears
    // (as a string)
    $FV = $annuityCalculatorObject->getFutureValue(
                        new AnnuityPaymentTypes(AnnuityPaymentTypes::IN_ARREARS)
                    );

至此,过程结束,您现在可以按需使用获得的结果。

序列化输出

如果您想获取结果的序列化对象表示,可以使用在基抽象类中实现的内置方法getSerializedResult(SerializerInterface $serializer),所有计算器类都从该类继承。您只需传递一个序列化对象(即实现SerializerInterface接口的任何类的对象)即可。

我们将再次使用XMLSerializer在崇高的AnnuityCalculator上演示这个过程

  1. 步骤相同——通过构造函数或通过工厂方法实例化适当的计算器类(有关更多信息,请参阅上一章)

    use FinanCalc\FinanCalc;
    use FinanCalc\Utils\Serializers\XMLSerializer;
    
    ...
    
    // Instantiation by a factory method
    // –
    // in our case we calculate a yearly-compounded annuity
    // with a duration of 5 periods (here years),
    // 100000 money units paid out per period
    // and a compounding interest rate of 0.15 (i.e., 15%)
    $annuityCalculatorObject = FinanCalc
                                    ::getInstance()
                                    ->getFactory('AnnuityCalculatorFactory')
                                    ->newYearlyAnnuity(
                                        100000,
                                        5,
                                        0.15);
  2. 步骤是获取序列化结果对象

    $result = $annuityCalculatorObject->getSerializedResult(new XMLSerializer());
  3. 现在我们得到了目标格式的全面结果对象表示。在我们的例子中,它看起来像这样

    <?xml version="1.0" encoding="UTF-8"?>
    <root>
      <annuitySinglePaymentAmount>100000</annuitySinglePaymentAmount>
      <annuityNoOfCompoundingPeriods>5</annuityNoOfCompoundingPeriods>
      <annuityInterest>0.15</annuityInterest>
      <annuityPeriodLength>
        <years>1.00000000</years>
        <months>12.00000000</months>
        <days>360.00000000</days>
      </annuityPeriodLength>
      <annuityPresentValue>
        <in_advance>385497.83</in_advance>
        <in_arrears>335215.53</in_arrears>
      </annuityPresentValue>
      <annuityFutureValue>
        <in_advance>775373.79</in_advance>
        <in_arrears>674238.12</in_arrears>
      </annuityFutureValue>
    </root>

注意:XML输出中“根”元素的名字可以通过配置属性serializers_root_elem_name自定义。将来,它将根据结果对象的类型自动分配。

您可以通过实现SerializerInterface轻松创建自己的序列化类。以下是一个序列化器的最小示例(在本演示案例中为YAML格式的输出)—— FinanCalc-YAMLSerializer

数组

您还可以以数组的形式获取结果的表示。这种表示主要用于将计算器对象的属性传递给序列化器。因此,输出应等效,除了语义表示外。它还使您能够轻松实现自己的序列化类,然后传递数组作为它们的参数。

让我们再次以我们的AnnuityCalculator为例来演示这个过程

  1. 步骤相同——通过构造函数或通过工厂方法实例化适当的计算器类(有关更多信息,请参阅上一章)

    use FinanCalc\FinanCalc;
    
    ...
    
    // Instantiation by a factory method
    // –
    // in our case we calculate a yearly-compounded annuity
    // with a duration of 5 periods (here years),
    // 100000 money units paid out per period
    // and a compounding interest rate of 0.15 (i.e., 15%)
    $annuityCalculatorObject = FinanCalc
                                    ::getInstance()
                                    ->getFactory('AnnuityCalculatorFactory')
                                    ->newYearlyAnnuity(
                                        100000,
                                        5,
                                        0.15);
  2. 步骤是获取结果数组

    $result = $annuityCalculatorObject->getResultAsArray();
  3. 结果数组看起来像这样(“var_export”表示形式)

    array (
      'annuitySinglePaymentAmount' => '100000',
      'annuityNoOfCompoundingPeriods' => '5',
      'annuityInterest' => '0.15',
      'annuityPeriodLength' =>
      array (
        'years' => '1.00000000',
        'months' => '12.00000000',
        'days' => '360.00000000',
      ),
      'annuityPresentValue' =>
      array (
        'in_advance' => '385497.83',
        'in_arrears' => '335215.53',
      ),
      'annuityFutureValue' =>
      array (
        'in_advance' => '775373.79',
        'in_arrears' => '674238.12',
      ),
    )

配置

当前配置功能非常有限,因此没有太多可以调整的地方。

默认配置值目前可以在"constants/Defaults.php"文件中找到,但将来将有可能使用易于访问的JSON(或PHP)配置文件。

测试

该库包含一个名为 "test" 的子目录,其中包含所有基本测试。为了让您放心,您可以随意在自己的环境中运行它们(前提是您已经安装了PHPUnit),并确保一切正常。

测试用例示例直接改编自布拉格经济大学开设的名为 "4ST608 - 金融与保险数学导论" 的大学课程,该课程由RNDr. Tomáš Cipra, DrSc. 教授讲授,所有荣誉归他所有。

参考

在这里,您可以找到每种普通计算器的文档。

如果没有特别说明,设置器/构造函数的参数类型以及获取器返回值类型默认为String。

AnnuityCalculator

namespace FinanCalc\Calculators

  • __construct($annuitySinglePaymentAmount, $annuityNoOfCompoundingPeriods, TimeSpan $annuityPeriodLength, $annuityInterest)
    • $annuitySinglePaymentAmount = 'K' – 每笔支付的金额(大于零的数字)
    • $annuityNoOfCompoundingPeriods = 'n' – 利息复利的期数数量;如果 'n = 0',则年金视为永续年金
    • $annuityPeriodLength = 以TimeSpan对象表示的单个周期长度
    • $annuityInterest = 'i'单个支付期的利率,通过该利率未付余额被乘以(即,通常小于1且大于0的小数)
设置器
  • setAnnuitySinglePaymentAmount($annuitySinglePaymentAmount) – 设置K
  • setAnnuityNoOfCompoundingPeriods($annuityNoOfCompoundingPeriods) – 设置n
  • setAnnuityPeriodLength(TimeSpan $annuityPeriodLength) – 设置每个复利周期的长度,单位为天
  • setAnnuityInterest($annuityInterest) – 设置i
获取器
  • getAnnuitySinglePaymentAmount() – 获取K
  • getAnnuityNoOfCompoundingPeriods() – 获取n
  • getAnnuityPeriodLength() – 以TimeSpan对象获取每个复利周期的长度
  • getAnnuityPeriodLengthInYears() – 以年为单位获取每个复利周期的长度
  • getAnnuityPeriodLengthInMonths() – 以月为单位获取每个复利周期的长度
  • getAnnuityPeriodLengthInDays() – 以天为单位获取每个复利周期的长度
  • getAnnuityInterest() – 获取i
  • getAnnuityLengthInYears() – 获取年金的年数
  • getAnnuityLengthInMonths() – 获取年金的月数
  • getAnnuityLengthInDays() – 获取年金的日数
  • getAnnuityEndDate(DateTime $startDate) – 根据作为参数传入的起始日期获取年金的结束日期,作为DateTime对象
  • getAnnuityPresentValue(AnnuityPaymentTypes $annuityType) – 获取年金的现值
    • AnnuityPaymentTypes $annuityType = 确定支付是在每个年金周期的开始还是结束时进行[永续年金为可选]
  • getAnnuityPresentValueInAdvance() – 简写为 getAnnuityPresentValue(new AnnuityPaymentTypes(AnnuityPaymentTypes::IN_ADVANCE))
  • getAnnuityPresentValueInArrears() – 简写为 getAnnuityPresentValue(new AnnuityPaymentTypes(AnnuityPaymentTypes::IN_ARREARS))
  • getAnnuityFutureValue(AnnuityPaymentTypes $annuityType) – 获取年金的未来值
    • AnnuityPaymentTypes $annuityType = 确定支付是在每个年金周期的开始还是结束时进行[永续年金为可选]
  • getAnnuityFutureValueInAdvance() – 简写为 getAnnuityFutureValue(new AnnuityPaymentTypes(AnnuityPaymentTypes::IN_ADVANCE))
  • getAnnuityFutureValueInArrears() – 简写为 getAnnuityFutureValue(new AnnuityPaymentTypes(AnnuityPaymentTypes::IN_ARREARS))
  • getAnnuityValue(AnnuityPaymentTypes $annuityPaymentType, AnnuityValueTypes $annuityValueType) – 获取年金的现值或未来值
    • 年金支付类型 $annuityPaymentType = 确定支付是在每期年金开始时还是结束时进行 [永续年金为可选]
    • 年金价值类型 $annuityValueType = 确定结果是年金的现值还是未来值
  • getResultAsArray(array $propResultArray = null) – 获取相关属性值的数组,您可以通过可选参数指定(例如,如果您只想指定其子集)
  • getSerializedResult(SerializerInterface $serializer) – 根据传递的 SerializerInterface 对象获取序列化结果

年金计算器工厂 (年金计算器的工厂对象)

命名空间 FinanCalc\Calculators\Factories

  • newYearlyAnnuity($annuitySinglePaymentAmount, $annuityNoOfCompoundingPeriods, $annuityInterest)
  • newMonthlyAnnuity($annuitySinglePaymentAmount, $annuityNoOfCompoundingPeriods, $annuityInterest)
  • newDailyAnnuity($annuitySinglePaymentAmount, $annuityNoOfCompoundingPeriods, $annuityInterest)
  • newPerpetuity($annuitySinglePaymentAmount, $annuityInterest)

年金支付类型

命名空间 FinanCalc\Constants

  • IN_ADVANCE = 1
  • IN_ARREARS = 2

年金价值类型

命名空间 FinanCalc\Constants

  • PRESENT_VALUE = 1
  • FUTURE_VALUE = 2

DebtAmortizator

namespace FinanCalc\Calculators

  • __construct($debtPrincipal, $debtNoOfCompoundingPeriods, TimeSpan $debtPeriodLength, $debtInterest)
    • $debtPrincipal = 'PV' – 债务本金(大于零的数字)
    • $debtNoOfCompoundingPeriods = 'n' – 债务复利周期的数量(大于零的数字)
    • $debtPeriodLength = 债务每个复利周期的长度,以 TimeSpan 对象表示
    • $debtInterest = 'i' – 每个复利周期的利息,通过该利息乘以未偿还余额(即,通常小于 1 且大于 0 的十进制数字)
设置器
  • setDebtPrincipal($debtPrincipal) – 设置 PV
  • setDebtNoOfCompoundingPeriods($debtNoOfCompoundingPeriods) – 设置 n
  • setDebtPeriodLength(TimeSpan $debtPeriodLength) – 设置每个复利周期的长度
  • setDebtInterest($debtInterest) – 设置 i
获取器
  • getDebtDiscountFactor() – 获取债务折现因子的值 = 'v'
  • getDebtSingleRepayment() – 获取单次还款金额 = 'K'
  • getDebtPrincipal() – 获取 PV
  • getDebtNoOfCompoundingPeriods() – 获取 n
  • getDebtPeriodLength() – 获取每个复利周期的长度,以 TimeSpan 对象表示
  • getDebtPeriodLengthInYears() – 获取每个复利周期的长度(年)
  • getDebtPeriodLengthInMonths() – 获取每个复利周期的长度(月)
  • getDebtPeriodLengthInDays() – 获取每个复利周期的长度(天)
  • getDebtLengthInYears() – 获取债务的长度(年)
  • getDebtLengthInMonths() – 获取债务的长度(月)
  • getDebtLengthInDays() – 获取债务的长度(天)
  • getDebtEndDate(DateTime $startDate) – 根据作为参数传入的起始日期获取债务的结束日期,作为 DateTime 对象
  • getDebtInterest() – 获取 i
  • getDebtRepayments() – 获取表示债务中所有单个付款的 RepaymentInstance 对象的数组
  • getDebtRepaymentsAsArrays() – 获取表示债务中所有单个付款的 关联数组 的数组(即,将 RepaymentInstances 转换为数组的数组)
  • getResultAsArray(array $propResultArray = null) – 获取相关属性值的数组,您可以通过可选参数指定(例如,如果您只想指定其子集)
  • getSerializedResult(SerializerInterface $serializer) – 根据传递的 SerializerInterface 对象获取序列化结果

DebtAmortizatorFactory (DebtAmortizator 的工厂对象)

命名空间 FinanCalc\Calculators\Factories

  • newYearlyDebtAmortization($debtPrincipal, $debtNoOfPeriods, $debtInterest)
  • newMonthlyDebtAmortization($debtPrincipal, $debtNoOfPeriods, $debtInterest)
  • newDailyDebtAmortization($debtPrincipal, $debtNoOfPeriods, $debtInterest)
  • newDebtAmortizationCustomPeriodLength($debtPrincipal, $debtNoOfPeriods, $debtInterest, TimeSpan $debtSinglePeriodLength)

RepaymentInstance

命名空间 FinanCalc\Calculators\DebtAmortizator

  • getPrincipalAmount() – 获取此单次还款所覆盖的债务本金金额
  • getInterestAmount() – 获取此单次还款所覆盖的债务利息金额
  • getTotalAmount() – 获取此单个还款所覆盖的总金额(包括“本金”和“利息”部分)

BondFairValueCalculator

namespace FinanCalc\Calculators

  • __construct($bondFaceValue, $bondAnnualCouponRate, $bondVIR, $bondYearsToMaturity, $bondPaymentFrequency = 1)
    • $bondFaceValue = 'F' – 债券的面值(大于零的数字)
    • $bondAnnualCouponRate = 'c' – 债券的年票面利率(即小于1且大于0的小数数字)
    • $bondVIR = 'i' or 'VIR' – 债券的估值利率(即小于1且大于0的小数数字)
    • bondYearsToMaturity = 债券到期前的年数(大于零的数字,可以是小数数字)
    • bondPaymentFrequency = 债券支付频率(以12个月~1年的除数表示);例如:除数为2表示半年支付
设置器
  • setBondFaceValue($bondFaceValue) – 设置 F
  • setBondAnnualCouponRate($bondAnnualCouponRate) – 设置 c
  • setBondVIR($bondVIR) – 设置 i/VIR
  • setBondYearsToMaturity($bondYearsToMaturity) – 设置债券到期前的年数
  • setBondPaymentFrequency($bondPaymentFrequency) – 设置债券支付频率
获取器
  • getBondFaceValue() – 获取 F
  • getBondAnnualCouponRate() – 获取 c
  • getBondVIR() – 获取 i/VIR
  • getBondYearsToMaturity() – 获取债券到期前的年数
  • getBondPaymentFrequency() – 获取债券支付频率
  • getBondNoOfPayments() – 获取债券生命周期中的总支付次数
  • getBondFairValue() – 获取债券的公允价值 [通过估值利率计算未来现金流现值得到债券的价值]
  • getResultAsArray(array $propResultArray = null) – 获取相关属性值的数组,您可以通过可选参数指定(例如,如果您只想指定其子集)
  • getSerializedResult(SerializerInterface $serializer) – 根据传递的 SerializerInterface 对象获取序列化结果

BondFairValueCalculatorFactory (BondFairValueCalculator的工厂对象)

命名空间 FinanCalc\Calculators\Factories

  • newAnnualCouponsBond($bondFaceValue, $bondAnnualCouponRate, $bondVIR, $bondYearsToMaturity)
  • newSemiAnnualCouponsBond($bondFaceValue, $bondAnnualCouponRate, $bondVIR, $bondYearsToMaturity)
  • newQuarterlyCouponsBond($bondFaceValue, $bondAnnualCouponRate, $bondVIR, $bondYearsToMaturity)
  • newMonthlyCouponsBond($bondFaceValue, $bondAnnualCouponRate, $bondVIR, $bondYearsToMaturity)
  • newCustomCouponFrequencyBond($bondFaceValue, $bondAnnualCouponRate, $bondVIR, $bondYearsToMaturity, $bondPaymentFrequency)

BondYTMCalculator

namespace FinanCalc\Calculators

  • __construct($bondFaceValue, $bondMarketValue, $bondAnnualCouponRate, $bondYearsToMaturity, $bondPaymentFrequency = 1)
    • $bondFaceValue = 'F' – 债券的面值(大于零的数字)
    • $bondMarketValue = 'P' – 债券的市场价值(即价格)(大于零的数字)
    • $bondAnnualCouponRate = 'c' – 债券的年票面利率(即小于1且大于0的小数数字)
    • bondYearsToMaturity = 债券到期前的年数(大于零的数字,可以是小数数字)
    • bondPaymentFrequency = 债券支付频率(以12个月~1年的除数表示);例如:除数为2表示半年支付
设置器
  • setBondFaceValue($bondFaceValue) – 设置 F
  • setBondMarketValue($bondMarketValue) – 设置债券的市场价值
  • setBondAnnualCouponRate($bondAnnualCouponRate) – 设置 c
  • setBondYearsToMaturity($bondYearsToMaturity) – 设置债券到期前的年数
  • setBondPaymentFrequency($bondPaymentFrequency) – 设置债券支付频率
获取器
  • getBondFaceValue() – 获取 F
  • getBondMarketValue() – 获取债券的市场价值
  • getBondAnnualCouponRate() – 获取 c
  • getBondYearsToMaturity() – 获取债券到期前的年数
  • getBondPaymentFrequency() – 获取债券支付频率
  • getBondNoOfPayments() – 获取债券生命周期中的总支付次数
  • getApproxBondYTM() – 获取债券到期收益率的大致值(以小数形式表示)[它是债券的内部收益率]
  • getResultAsArray(array $propResultArray = null) – 获取相关属性值的数组,您可以通过可选参数指定(例如,如果您只想指定其子集)
  • getSerializedResult(SerializerInterface $serializer) – 根据传递的 SerializerInterface 对象获取序列化结果

BondYTMCalculatorFactory (BondYTMCalculator的工厂对象)

命名空间 FinanCalc\Calculators\Factories

  • newAnnualCouponsBond($bondFaceValue, $bondMarketValue, $bondAnnualCouponRate, $bondYearsToMaturity)
  • newSemiAnnualCouponsBond($bondFaceValue, $bondMarketValue, $bondAnnualCouponRate, $bondYearsToMaturity)
  • newQuarterlyCouponsBond($bondFaceValue, $bondMarketValue, $bondAnnualCouponRate, $bondYearsToMaturity)
  • newMonthlyCouponsBond($bondFaceValue, $bondMarketValue, $bondAnnualCouponRate, $bondYearsToMaturity)
  • newCustomCouponFrequencyBond($bondFaceValue, $bondMarketValue, $bondAnnualCouponRate, $bondYearsToMaturity, $bondPaymentFrequency)

BondDurationCalculator

namespace FinanCalc\Calculators

  • __construct($bondFaceValue, $bondAnnualCouponRate, $bondAnnualYield, $bondYearsToMaturity, $bondPaymentFrequency = 1)
    • $bondFaceValue = 'F' – 债券的面值(大于零的数字)
    • $bondAnnualCouponRate = 'c' – 债券的年票面利率(即小于1且大于0的小数数字)
    • $bondAnnualYield = 债券的年收益率(作为利率除以债券价值计算得出)
    • bondYearsToMaturity = 债券到期前的年数(大于零的数字,可以是小数数字)
    • bondPaymentFrequency = 债券支付频率(以12个月~1年的除数表示);例如:除数为2表示半年支付
设置器
  • setBondFaceValue($bondFaceValue) – 设置 F
  • setBondAnnualCouponRate($bondAnnualCouponRate) – 设置 c
  • setBondAnnualYield($bondAnnualYield) – 设置债券的年收益率
  • setBondYearsToMaturity($bondYearsToMaturity) – 设置债券到期前的年数
  • setBondPaymentFrequency($bondPaymentFrequency) – 设置债券支付频率
获取器
  • getBondFaceValue() – 获取 F
  • getBondAnnualCouponRate() – 获取 c
  • getBondAnnualYield() – 获取债券的年收益率
  • getBondYieldPerPaymentPeriod() – 获取每个支付期间的债券收益率
  • getBondYearsToMaturity() – 获取债券到期前的年数
  • getBondPaymentFrequency() – 获取债券支付频率
  • getBondNoOfPayments() – 获取债券生命周期中的总支付次数
  • getBondNominalCashFlows() – 获取债券的名义现金流数组(息票;在最后支付时 = 息票 + 面值)
  • getBondDiscountedCashFlows() – 获取债券的折现现金流数组(名义现金流,按债券每期的收益率进行折现)
  • getBondPresentValue() – 获取债券的现值,表示为所有债券折现现金流的和(即,getBondDiscountedCashFlows()方法返回的所有数组成员的总和)
  • getBondDuration() – 获取债券的期限(年),可以是小数
  • getResultAsArray(array $propResultArray = null) – 获取相关属性值的数组,您可以通过可选参数指定(例如,如果您只想指定其子集)
  • getSerializedResult(SerializerInterface $serializer) – 根据传递的 SerializerInterface 对象获取序列化结果

BondDurationCalculatorFactory (BondDurationCalculator的工厂对象)

命名空间 FinanCalc\Calculators\Factories

  • newAnnualCouponsBond($bondFaceValue, $bondAnnualCouponRate, $bondAnnualYield, $bondYearsToMaturity)
  • newSemiAnnualCouponsBond($bondFaceValue, $bondAnnualCouponRate, $bondAnnualYield, $bondYearsToMaturity)
  • newQuarterlyCouponsBond($bondFaceValue, $bondAnnualCouponRate, $bondAnnualYield, $bondYearsToMaturity)
  • newMonthlyCouponsBond($bondFaceValue, $bondAnnualCouponRate, $bondAnnualYield, $bondYearsToMaturity)
  • newCustomCouponFrequencyBond($bondFaceValue, $bondAnnualCouponRate, $bondAnnualYield, $bondYearsToMaturity, $bondPaymentFrequency)

SimpleDiscountCalculator

namespace FinanCalc\Calculators

  • __construct($amountDue, $annualDiscountRate, TimeSpan $time)
    • $principal = 'S' – 应付款项
    • $annualInterestRate = 'd' – 年折扣率(即,通常小于1且大于0的小数)
    • $time = (转换为年) 't' – 总时间,作为TimeSpan对象
设置器
  • setAmountDue($amountDue) – 设置S
  • setAnnualDiscountRate($annualDiscountRate) – 设置d
  • setTime(TimeSpan $time) – 设置总时间
获取器
  • getAmountDue() – 获取S
  • getAnnualDiscountRate() – 获取d
  • getTime() – 获取总时间,作为TimeSpan对象
  • getTimeInYears() – 获取总时间(年)
  • getTimeInMonths() – 获取总时间(月)
  • getTimeInDays() – 获取总时间(天)
  • getDiscountAmount() – 获取折扣金额('D')

SimpleDiscountCalculatorFactory (SimpleDiscountCalculator的工厂对象)

命名空间 FinanCalc\Calculators\Factories

  • newSimpleDiscount($amountDue, $annualDiscountRate, TimeSpan $time)

SimpleInterestCalculator

namespace FinanCalc\Calculators

  • __construct($principal, $annualInterestRate, TimeSpan $time)
    • $principal = 'P' – 主金额
    • $annualInterestRate = 'i' – 年利率(即,通常小于1且大于0的小数)
    • $time = (转换为年) 't' – 总时间,作为TimeSpan对象
设置器
  • setPrincipal($principal) – 设置P
  • setAnnualInterestRate($annualInterestRate) – 设置i
  • setTime(TimeSpan $time) – 设置总时间
获取器
  • getPrincipal() – 获取P
  • getAnnualInterestRate() – 获取i
  • getTime() – 获取总时间,作为TimeSpan对象
  • getTimeInYears() – 获取总时间(年)
  • getTimeInMonths() – 获取总时间(月)
  • getTimeInDays() – 获取总时间(天)
  • getInterestNumber() – 获取利息次数('IN')
  • getInterestDivisor() – 获取利息除数('ID')
  • getInterestAmount() – 获取利息金额('n')

SimpleInterestCalculatorFactory (SimpleInterestCalculator的工厂对象)

命名空间 FinanCalc\Calculators\Factories

  • newSimpleInterest($principal, $annualInterestRate, TimeSpan $time)

StockDividendDiscountModelCalculator

namespace FinanCalc\Calculators

  • __construct(StockDDMTypes $dividendDiscountModelType, $stockVIR, $stockAnnualDividendValue, $stockAnnualDividendsGrowth = null)
    • $dividendDiscountModelType = 根据该类型计算结果的股息折现模型类型(StockDDMTypes类型的值)
    • $stockVIR = 'i' – 股票的估值利率
    • $stockAnnualDividendsValue = 'D' – 股票年度股息的绝对值
    • $stockAnnualDividendsGrowth = 'g' – 股票年度股息的年复利增长率(即介于0和1之间的十进制数)[此值仅适用于多重增长股息折现模型]

设置器

  • setDividendDiscountModelType(StockDDMTypes $dividendDiscountModelType) – 设置股息折现模型类型
  • setStockVIR($stockVIR) – 设置i
  • setStockAnnualDividendsValue($stockAnnualDividendsValue) – 设置D
  • setStockAnnualDividendsGrowth($stockAnnualDividendsGrowth) – 设置g

获取器

  • getDividendDiscountModelType() – 获取股息折现模型类型
  • getStockVIR() – 获取i
  • getStockAnnualDividendsValue() – 获取D
  • getStockAnnualDividendsGrowth() – 获取g
  • getStockPresentValue() – 获取股票的现值(近似公允价值)
  • getResultAsArray(array $propResultArray = null) – 获取相关属性值的数组,您可以通过可选参数指定(例如,如果您只想指定其子集)
  • getSerializedResult(SerializerInterface $serializer) – 根据传递的 SerializerInterface 对象获取序列化结果

StockDividendDiscountModelCalculatorFactory (StockDividendDiscountModelCalculator的工厂对象)

命名空间 FinanCalc\Calculators\Factories

  • newZeroGrowthDividendDiscountModel($stockVIR, $stockAnnualDividendValue)
  • newMultipleGrowthDividendDiscountModel($stockVIR, $stockAnnualDividendValue, $stockAnnualDividendsGrowth)

StockDDMTypes

命名空间 FinanCalc\Constants

  • ZERO_GROWTH = 1
  • MULTIPLE_GROWTH = 2

StockInvestmentRatiosCalculator

namespace FinanCalc\Calculators

  • __construct($totalDividends, $earningsAfterTaxes, $noOfStocks)
    • $totalDividends = 一个期间的股息总和
    • $earningsAfterTaxes = 税后收入
    • $noOfStocks = 股票数量(如果是恒定的,则为总数,如果是波动的,则为平均值)

设置器

  • setTotalDividends($totalDividends) – 设置一个期间的股息总和
  • setEarningsAfterTaxes($earningsAfterTaxes) – 设置税后收入
  • setNoOfStocks($noOfStocks) – 设置股票数量

获取器

  • getTotalDividends() – 获取一个期间的股息总和
  • getEarningsAfterTaxes() – 获取税后收入
  • getNoOfStocks() – 获取股票数量
  • getDividendPerStock() – 获取每股股息(DPS)值
  • getEarningsPerStock() – 获取每股收益(EPS)值
  • getPayoutRatio() – 获取派息比率(也称为“股息派息比率”)
  • getDividendRatio() – 获取股息比率(派息比率的-1次幂)
  • getRetentionRatio() – 获取保留率(“再投资”)比率
  • getResultAsArray(array $propResultArray = null) – 获取相关属性值的数组,您可以通过可选参数指定(例如,如果您只想指定其子集)
  • getSerializedResult(SerializerInterface $serializer) – 根据传递的 SerializerInterface 对象获取序列化结果

StockInvestmentRatiosCalculatorFactory (StockInvestmentRatiosCalculator的工厂对象)

命名空间 FinanCalc\Calculators\Factories

  • newCustomStocks($totalDividends, $earningAfterTaxes, $noOfStocks)

时间值主要由TimeSpan类的单个实例表示。其概念(大致)类似于.NET Framework中相同(未限定)名称的结构

TimeSpan

命名空间 FinanCalc\Utils\Time

初始化类时,应使用其三个静态工厂方法之一(默认构造函数已声明为私有,不建议绕过此措施)。

  • asDuration($years, $months = 0, $days = 0) – 由其时间组件的数值定义的简单(四舍五入)时间长度
  • asDurationWithStartDate(DateTime $startDate, $years, $months = 0, $days = 0) – 由其时间组件的数值定义的简单(四舍五入)时间长度,同时记录其开始日期
  • asInterval(DateTime $startDate, DateTime $endDate) – 由其开始和结束日期指定的精确时间长度表示

设置器

  • setStartDate(DateTime $startDate) – 设置或重新设置开始日期
  • setEndDate(DateTime $endDate) – 设置或重新设置结束日期
  • clearStartEndDate() – 将开始和结束日期均设置为null

获取器

  • getStartDate() – 获取开始日期
  • getEndDate() – 获取结束日期
  • getYearsComponent() – 获取基础DateInterval对象的“年”组件
  • getMonthsComponent() – 获取底层 DateInterval 对象的“月份”组件
  • getDaysComponent() – 获取底层 DateInterval 对象的“日”组件
  • toYears() – 将整个时间长度(即,考虑所有组件 - 年、月和日)转换为年
  • toMonths() – 将整个时间长度(即,考虑所有组件 - 年、月和日)转换为月
  • toDays() – 将整个时间长度(即,考虑所有组件 - 年、月和日)转换为日

如果您需要一种方便的方法来转换时间单位,请随时使用为该目的构建的 TimeUtils 类的静态方法(它也在库内部使用)。它还考虑了库配置中当前设置的日历惯例(即一年中的天数)。

TimeUtils

命名空间 FinanCalc\Utils\Time

获取器

  • getYearsFromDays($numberOfDays) – 将给定的天数转换为年(考虑配置中当前设置的日历惯例)
  • getYearsFromMonths($numberOfMonths) – 将给定的月数转换为年
  • getYearsFromYears($numberOfYears) – 将给定的年数转换为年(只是一个代理方法)
  • getMonthsFromDays($numberOfDays) – 将给定的天数转换为月(考虑配置中当前设置的日历惯例)
  • getMonthsFromMonths($numberOfMonths) – 将给定的月数转换为月(只是一个代理方法)
  • getMonthsFromYears($numberOfYears) – 将给定的年数转换为月
  • getDaysFromDays($numberOfDays) – 将给定的天数转换为日(只是一个代理方法)
  • getDaysFromMonths($numberOfMonths) – 将给定的月数转换为日(考虑配置中当前设置的日历惯例)
  • getDaysFromYears($numberOfYears) – 将给定的年数转换为日(考虑配置中当前设置的日历惯例)
  • getCurrentDayCountConvention() – 获取当前日历惯例
  • isDayCountConventionValid($dayCountConvention) – 检查传入的参数是否为有效的日历惯例

免责声明

您可以根据自己的意愿使用/修改/扩展库 - 以满足您的需求。根据(非)许可协议,软件按原样提供,原作者不对由此直接或间接产生的任何损失/损害承担责任。欢迎署名,但并非必需。

注意 该库目前正在开发中,并且肯定会在开发过程中添加新功能。因此,请将其视为一个预览产品,它可能会突然且广泛地变化,这可能影响适配先前版本的库的外部代码的功能。在升级到库的新版本时,请始终探索库与您的项目的临时兼容性(通过广泛测试您正在使用库功能的代码)。

无论如何,感谢您查看FinanCalc :bowtie: