def __init__(self, scenario: str): if scenario not in self.SCENARIOS: raise NotImplementedError( f'Unknown scenario {scenario}. Choose from: {sorted(self.SCENARIOS)}' ) self.scenario = scenario self.data_dir = os.path.join(settings.SIMULATION_DIR, scenario) self.portfolio = Portfolio.read_from_file( os.path.join(self.data_dir, 'start.csv')) self.reference_portfolio = Portfolio.read_from_file( os.path.join(self.data_dir, 'start.csv'))
def _calculate_ideal_portfolio(self, input_filename: str, reference_filename: str): input_file = os.path.join(settings.TEST_DIR, input_filename) reference_file = os.path.join(settings.TEST_DIR, reference_filename) generated_file = os.path.join(settings.TMP_DIR, reference_filename) portfolio = Portfolio.read_from_file(input_file) calculator = Calculator(portfolio) calculator.calculate_ideal_portfolio() portfolio.write_to_file(generated_file) self.compare_file_with_file(generated_file, reference_file, write_first=True) os.remove(generated_file)
position for position in self.portfolio.positions if position.ideal_fraction < self.max_position ] total_ideal_fraction_under_max = sum( [position.ideal_fraction for position in positions_under_max]) # Make the redistribution for position in positions_under_max: position.ideal_fraction += position.ideal_fraction / total_ideal_fraction_under_max * total_ideal_fraction_to_redistribute # Repeat the procedure until no position is above the maximum position self._redistribute_over_max() if __name__ == '__main__': parser = argparse.ArgumentParser(description='Calculator') parser.add_argument( '--input', help='name of input portfolio CSV file. Defaults to demo.csv', default='demo.csv') parser.add_argument( '--output', help='name of output portfolio CSV file. Defaults to ideal.csv', default='ideal.csv') args = parser.parse_args() _portfolio = Portfolio.read_from_file(args.input) calculator = Calculator(_portfolio) calculator.calculate_ideal_portfolio() _portfolio.write_to_file(args.output)