我正在为金融工具定价,每个金融工具对象都需要一个日计数器作为属性。有 4 种日计数器,它们的两种方法都有不同的实现,year_fraction
并且day_count
. 金融工具的这一天数计数器属性在定价时用于其他类,以了解如何适当地折现曲线等。但是,所有的天数计数方法都是静态的,无非是应用一些公式。
因此,尽管我在网上阅读的所有内容都告诉我不要使用静态方法而只使用模块级函数,但我看不到一种方法可以很好地绕过正确的 DayCounter 而不实现这样的东西
class DayCounter:
__metaclass__ = abc.ABCMeta
@abc.abstractstaticmethod
def year_fraction(start_date, end_date):
raise NotImplementedError("DayCounter subclass must define a year_fraction method to be valid.")
@abc.abstractstaticmethod
def day_count(start_date, end_date):
raise NotImplementedError("DayCounter subclass must define a day_count method to be valid.")
class Actual360(DayCounter):
@staticmethod
def day_count(start_date, end_date):
# some unique formula
@staticmethod
def year_fraction(start_date, end_date):
# some unique formula
class Actual365(DayCounter):
@staticmethod
def day_count(start_date, end_date):
# some unique formula
@staticmethod
def year_fraction(start_date, end_date):
# some unique formula
class Thirty360(DayCounter):
@staticmethod
def day_count(start_date, end_date):
# some unique formula
@staticmethod
def year_fraction(start_date, end_date):
# some unique formula
class ActualActual(DayCounter):
@staticmethod
def day_count(start_date, end_date):
# some unique formula
@staticmethod
def year_fraction(start_date, end_date):
# some unique formula
因此,在某个特定工具的定价引擎中,将工具作为参数传递,我可以根据需要使用工具的日计数器属性。
我是否遗漏了 Python 中更惯用/风格上可接受的东西,或者这似乎适合用于仅静态方法的类?
示例:
我有一个 FxPricingEngine 类,它有一个__init__
传递 FxInstrument 和后续underlying_instrument
属性的方法。然后,为了使用Value
我的定价引擎的方法,我需要使用特定日期计数器对曲线进行折扣。我有一个YieldCurve
带有discount
我传递的方法的类,self.underlying_instrument.day_counter.year_fraction
以便我可以应用正确的公式。实际上,这些类所要做的就是为独特的实现提供一些逻辑组织。