예제 #1
0
    def __init__(self,
                 risk_estimation_factor: float,
                 data_provider: DataHandler,
                 start_date: datetime,
                 end_date: datetime,
                 tickers: Sequence[Ticker],
                 number_of_trades: int,
                 time_in_the_market: float,
                 exposure: Exposure = Exposure.LONG,
                 frequency: Frequency = Frequency.DAILY,
                 seed: Optional[int] = None):
        super().__init__(risk_estimation_factor, data_provider)

        self.timer = data_provider.timer
        self.start_date = start_date
        self.end_date = end_date
        self.frequency = frequency
        scenarios_generator = ScenariosGenerator()

        self.trading_scenarios = QFDataFrame(
            columns=tickers,
            data={
                ticker: scenarios_generator.make_exposure_scenarios(
                    start_date, end_date, number_of_trades, time_in_the_market,
                    exposure, frequency, seed and seed + i)
                for i, ticker in enumerate(tickers)
            })
예제 #2
0
class TestScenariosGenerator(TestCase):
    def setUp(self):
        self.generator = ScenariosGenerator()

        self.num_of_scenarios = 100000
        self.scenarios_length = 7

    def test_make_scenarios(self):
        first_ret_value = 0.05
        second_ret_value = 0.1

        trade_rets = QFSeries([first_ret_value, second_ret_value])

        scenarios_df = self.generator.make_scenarios(trade_rets,
                                                     self.scenarios_length,
                                                     self.num_of_scenarios)

        expected_shape = (self.scenarios_length, self.num_of_scenarios)
        actual_shape = scenarios_df.shape
        self.assertAlmostEqual(expected_shape, actual_shape)

        values_count = scenarios_df.iloc[0, :].value_counts(normalize=True)

        first_return_freq = values_count[first_ret_value]
        second_return_freq = values_count[second_ret_value]

        expected_frequency = 0.5
        self.assertAlmostEqual(first_return_freq,
                               expected_frequency,
                               delta=0.01)
        self.assertAlmostEqual(second_return_freq,
                               expected_frequency,
                               delta=0.01)
예제 #3
0
    def _get_scenarios(self, num_of_scenarios: int = 2500) -> Tuple[PricesDataFrame, SimpleReturnsSeries]:
        # Generate scenarios, each of which consists of a certain number of trades, equal to the average number
        # of trades per year
        scenarios_generator = ScenariosGenerator()
        trade_returns = [trade.percentage_pnl for trade in self.trades]

        # Generate the scenarios
        scenarios_df = scenarios_generator.make_scenarios(
            trade_returns,
            scenarios_length=int(self._average_number_of_trades_per_year()),
            num_of_scenarios=num_of_scenarios
        )

        scenarios_df = scenarios_df.to_prices()

        return scenarios_df, scenarios_df.iloc[-1] / scenarios_df.iloc[0] - 1.0
예제 #4
0
def main():
    stats_factory = InitialRiskStatsFactory(max_accepted_dd=0.1,
                                            target_return=0.02)
    initial_risks_list = [0.001, 0.005, 0.01, 0.02, 0.03, 0.05, 0.1]

    scenarios_generator = ScenariosGenerator()
    scenarios_df_list = []

    nr_of_param_sets = len(initial_risks_list)
    test_start_time = time()
    print("{} parameters sets to be tested".format(nr_of_param_sets))

    param_set_ctr = 1
    for init_risk in initial_risks_list:
        start_time = time()
        ts = _create_trading_session(init_risk)
        data_handler = ts.data_handler
        alpha_model = MovingAverageAlphaModel(
            5, 20, 1.25,
            data_handler)  # Change to a different alpha model to test it
        trade_rets_values = get_trade_rets_values(ts, alpha_model)
        scenarios_df = scenarios_generator.make_scenarios(
            trade_rets_values, scenarios_length=100, num_of_scenarios=10000)

        end_time = time()
        print("{} / {} initial risk parameters tested".format(
            param_set_ctr, nr_of_param_sets))
        print("iteration time = {:5.2f} minutes".format(
            (end_time - start_time) / 60))
        param_set_ctr += 1

        scenarios_df_list.append(scenarios_df)

    print("\nGenerating stats...")
    start_time = time()

    stats = stats_factory.make_stats(initial_risks_list, scenarios_df_list)
    print(stats)

    end_time = time()
    print("iteration time = {:5.2f} minutes".format(
        (end_time - start_time) / 60))

    test_end_time = time()
    print("test duration time = {:5.2f} minutes".format(
        (test_end_time - test_start_time) / 60))
예제 #5
0
def main():
    alpha_model_type = None  # Set Alpha model that you wish to test
    stats_factory = InitialRiskStatsFactory(max_accepted_dd=0.1, target_return=0.02)
    initial_risks_list = [0.001, 0.005, 0.01, 0.02, 0.03, 0.05, 0.1]

    scenarios_generator = ScenariosGenerator()
    scenarios_df_list = []

    nr_of_param_sets = len(initial_risks_list)
    test_start_time = time()
    print("{} parameters sets to be tested".format(nr_of_param_sets))

    param_set_ctr = 1
    for init_risk in initial_risks_list:
        start_time = time()
        trade_rets_values = get_trade_rets_values(init_risk, alpha_model_type)
        scenarios_df = scenarios_generator.make_scenarios(
            trade_rets_values, scenarios_length=100, num_of_scenarios=10000
        )

        end_time = time()
        print("{} / {} initial risk parameters tested".format(param_set_ctr, nr_of_param_sets))
        print("iteration time = {:5.2f} minutes".format((end_time - start_time) / 60))
        param_set_ctr += 1

        scenarios_df_list.append(scenarios_df)

    print("\nGenerating stats...")
    start_time = time()

    stats = stats_factory.make_stats(initial_risks_list, scenarios_df_list)
    print(stats)

    end_time = time()
    print("iteration time = {:5.2f} minutes".format((end_time - start_time) / 60))

    test_end_time = time()
    print("test duration time = {:5.2f} minutes".format((test_end_time - test_start_time) / 60))
예제 #6
0
    def setUp(self):
        self.generator = ScenariosGenerator()

        self.num_of_scenarios = 100000
        self.scenarios_length = 7