【发布时间】:2019-01-14 14:48:59
【问题描述】:
背景
我正在尝试将 Black-Litterman 模型作为我已经实现的 Markowitz model 的子类来实现。 Markowitz 模型的主要思想是:循环遍历date_list,在每个date 上使用移动平均方法估计预期收益mu 和协方差矩阵sigma,然后计算均值方差使用均值方差优化器mean_variance(mu, sigma) 的投资组合。从概念上讲,Markowitz 模型是这样的
class Markowitz(object):
def __init__(self, params):
self.price_data = ...
self.date_list = ...
def estimate_mu_and_sigma(self, date):
mu = ...
sigma = ...
return mu, sigma
@staticmethod
def mean_variance_optimiser(mu, sigma):
w = ...
return w
def back_test(self):
for date in self.date_list:
mu, sigma = self.estimate_mu_and_sigma(date)
w = Markowitz.mean_variance_optimiser(mu, sigma)
# do some other stuff
pass
Black-Litterman 和 Markowitz 之间的唯一区别是 BL 对 mu 和 sigma 使用的估计方法与 Markowitz 不同,但随后的均值方差优化过程是相同的。自然我想继承Markowitz 来获得一个BL 模型。问题是在BL中,mu和sigma的估计需要额外的参数。不仅如此,这组附加参数还动态地依赖于date,所以我不能只覆盖Markowitz.back_test 给它附加参数。其实BL模型是这样的:
class BlackLitterman(Markowitz):
def __init__(self, params, more_parms):
super().__init__(params)
self.some_auxiliary_data = ...
def estimate_mu_and_sigma(self, date, dynamic_params):
mu = ...
sigma = ...
return mu, sigma
def back_test(self, more_params):
for date in self.date_list:
dynamic_params = ... # depends both on date and more params
mu, sigma = self.estimate_mu_and_sigma(date, dynamic_params)
w = Markowitz.mean_variance_optimiser(mu, sigma)
# do some other stuff
pass
当我尝试这个时,IDE 已经抱怨 BlackLitterman.estimate_mu_and_sigma 覆盖 Markowtiz.estimate_mu_and_sigma 且签名不一致。此外,这实际上并没有重用 back_test 中的可重用代码。
谁能告诉我如何更优雅地继承Markowitz?谢谢!
【问题讨论】:
标签: python oop inheritance overriding