0

我需要帮助建模以下情况:

金融工具总是有价格的。但是,某些金融工具(更确切地说是某些类型)也具有所谓的“干净”价格,这是一个取决于(除其他外)价格的属性,在这种情况下,价格也称为“脏”价格。有一个计算器服务可以计算价格(或脏价)和净价。如何最好地从概念上模拟这种情况?

我考虑了两种选择:

  1. 金融工具有价格

    FinancialInstrument
      + price: Price
    

    其中 Price 是具有两个派生类的超类型:DirtyPrice 和 CleanPrice。CleanPrice 取决于 DirtyPrice

    CleanPrice
      + dirty: DirtyPrice
    

    然后,计算器服务将计算 FinancialInstrument 的价格:

    CalculatorService
      + compute_price(FinancialInstrument, ...): Price
    
  2. FinancialInstrument 是具有两个派生的超类型:PlainFinancialInstrument(仅具有价格属性)和具有干净价格和脏价格的 CleanPriceFinancialInstrument。

                           FinancialInstrument
                             + price: double
    
    PlainFinancialInstrument                   CleanPriceFinancialInstrument
                                                 + clean_price: double
    

    然后,Calculator 服务将有两种方法来计算 PlainSecurity 的价格或 CleanPriceSecurities 的干净和肮脏价格:

    CalculatorService
       + compute_price(PlainFinancialInstrument, ...): double
       + compute_price(CleanPriceFinancialInstrument, ...): pair<double, double>
    

两种选择的权衡是什么?还有其他选择吗?

谢谢。

4

2 回答 2

2

我不清楚您是在问如何对通过您的示例指定的抽象问题进行建模,还是在尝试在现实世界环境中对金融工具定价的业务概念进行建模。我认为是后者,因为你很具体,所以我会对此发表评论。但是,在这种情况下,我怀疑您的两种方法中的任何一种都足以满足您的任务需求。我已经在那个领域工作了几年。

我不确定您在哪个业务领域工作。在我以前工作的领域(银行),清洁和肮脏价格之间的区别是一个简单的商业概念。例如,对于按摊销成本估值的债券,净价格是不考虑应计和递延的贴现现金流的价值,肮脏价格是净价格和应计/递延的总和。在我所知道的所有情况下,干净价格是脏价格与金融工具(简称 FI)的一些关键数据的一些简单功能之间的差价,干净价格和脏价格都只是相关的关键数据对于某些(但不是全部)类型的金融工具。

另一方面,取决于 GAAP 和业务领域,您是否需要提供干净价格或肮脏价格或两者都提供的问题可能还取决于金融工具被分配到哪个账簿,例如银行账簿/交易账簿。对于您通常只想检索脏价格的交易账簿,干净的价格在银行账簿中是相关的。

更糟糕的是,FI 可能会被重新分配,从而导致一组不同的关键数据变得相关。如果这与您的上下文相关,您应该确保您的设计考虑到此类更改的后果。

就个人而言,我将从以下概述的方法开始:

  • 为金融工具创建一个抽象类/接口

  • 对于每种类型的 FI,定义一个子类

  • 创建一个可能与您范围内的任何可能的 FI 相关的所有关键数据的列表 - 在您的示例中:清洁价格和肮脏价格,并且可能一个代表差异的关键数字。另外创建一个虚拟价格指标条目。

  • 对于这些关键人物中的每一个,使用与 KF 相关的方法创建一个关键人物接口。例如计算、更新——这取决于你的整体模型。再次以您的示例为例:一个干净的价格接口,一个肮脏的价格接口,一个增量接口和一个价格接口。可能有必要定义它们必须更新的顺序。价格接口的方法集必须是干净和脏价格接口的子集

  • 对于每种类型的 FI,为与该 FI 类型相关的所有关键指标接口创建一个特定的实现(类),当然要考虑重用。根据这些实现中的关键值或 FI 类型,严格避免 if/else 或 switch 语句,如果事实证明这是必要的,则需要额外的类定义。现在,当您实例化表示 FI 的类时,使用工厂模式来创建关键图形接口的实例。也就是说,你决定FI实例创建使用哪种方法来计算,FI实例然后知道如何计算FI的关键值。工厂模式的一个很好的特点是,您可以另外考虑您正在计算的书籍以及其他参数,即使在运行时也可以在必要时进行。

  • 然后你调用的计算器服务将调用价格键figue接口的方法来计算价格,但接口指向的实例由FI实例提供,因为工厂只是将价格接口映射到清洁价格接口或肮脏的价格接口,具体取决于在该特定上下文中该特定 FI 的正确性。

如果您按照建议在 FI 实例中使用相关关键指标和关键指标计算接口实现的列表,您甚至可以在重新分配 FI 的情况下在运行时更新/交换它,而无需删除/重新创建 FI 实例。

希望我没有让您的问题比实际情况更复杂。

问候,

托马斯

于 2011-11-20T18:44:58.680 回答
0

您需要单独的计算器服务吗?如果没有怎么办:

class FinancialInstrument {
    private price: Double;

    public getPrice {
       // calculate the price
       // presumably sets the private price?  Dunno
       this.price= // etc. .....
       return this.price;
    } 

class CleanFinancialInstrument extends FinancialInstrument {
    private cleanPrice: Double;

    public getPrice {
       //override FinancialInstrument.getPrice() as required
    }

    public getDirtyPrice {
       //do you need this? Dunno
       return this.getPrice();
    }

    public getCleanPrice {
       this.cleanPrice = //... etc.
       return this.dirtyPrice;
    }
}

如果您不缓存价格,您甚至可能不需要本地私有变量。

调用者可以简单地在任何实例(FinancialInstrument 或 CleanFinancialInstrument)上调用 getPrice(),而不必担心它是哪种类型。

hth。

于 2011-11-20T18:20:27.510 回答