首页 > 解决方案 > 具有调用和最小化其他函数的函数的 Python 类

问题描述

我试图在一个试图最小化另一个函数的类中编写一个函数。

编写和调用它的正确方法是什么?我被卡住了,我不知道该怎么做。


import pandas as pd
import scipy.optimize as sco

class Optimisation:
    def __init__(self, rf, expected_return, cov):
 
        self.rf = rf
        self.expected_return = expected_return
        self.cov = cov

    def calculate_negative_sharpe(self):
        self.portfolio_return = np.sum(expected_returns * weights) * 252
        self.portfolio_std = np.sqrt(np.dot(self.weights.T, np.dot(self.cov, self.weights))) * np.sqrt(252)
        self.sharpe_ratio = (self.portfolio_return - self.rf) / self.portfolio_std
        return -self.sharpe_ratio



    def max_sharpe_ratio(expected_returns, cov, rf):
        num_assets = len(expected_returns)
        args = (expected_returns, cov, rf)
        constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})
        bound = (0.0,1.0)
        bounds = tuple(bound for asset in range(num_assets))
        result = sco.minimize(calculate_negative_sharpe, num_assets*[1./num_assets,], args=args, method='SLSQP', bounds=bounds, constraints=constraints)
        return result

opt = Optimisation(rf, er, cov)
result = opt.max_sharpe_ratio()
print(result)


还是应该像

import pandas as pd
import scipy.optimize as sco

class Optimisation:
    def __init__(self, rf, expected_return, cov):
 
        self.rf = rf
        self.expected_return = expected_return
        self.cov = cov

    def calculate_negative_sharpe(self):
        self.portfolio_return = np.sum(expected_returns * weights) * 252
        self.portfolio_std = np.sqrt(np.dot(self.weights.T, np.dot(self.cov, self.weights))) * np.sqrt(252)
        self.sharpe_ratio = (self.portfolio_return - self.rf) / self.portfolio_std
        return -self.sharpe_ratio



    def max_sharpe_ratio(self):
        self.num_assets = len(self/expected_returns)
        self.args = (self.expected_returns, self.cov, self.rf)
        self.constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})
        self.bound = (0.0,1.0)
        self.bounds = tuple(self.bound for asset in range(self.num_assets))
        self.result = sco.minimize(self.calculate_negative_sharpe, self.num_assets*[1./self.num_assets,], args=self.args, method='SLSQP', bounds=self.bounds, constraints=self.constraints)
        return self.result

opt = Optimisation(rf, er, cov)
result = opt.max_sharpe_ratio()
print(result)

我的目标是返回一个我可以打印或保存的结果数据框。

标签: pythonclassoptimizationscipycompiler-optimization

解决方案


推荐阅读