def gen_event_times(self, run_time):
        decays = self.parameters['decay']
        adjacency = self.parameters['adjacency']
        baseline = self.parameters['baseline']

        hawkes_sim = SimuHawkesExpKernels(adjacency=adjacency,
                                          decays=decays,
                                          baseline=baseline,
                                          verbose=False)
        hawkes_sim.end_time = run_time
        hawkes_sim.simulate()

        # Generate Event Arrival Times
        limit_order_arrivals = hawkes_sim.timestamps[1]
        limit_order_arrivals = [('loa', time) for time in limit_order_arrivals]

        limit_order_cancellations = hawkes_sim.timestamps[2]
        limit_order_cancellations = [('loc', time)
                                     for time in limit_order_cancellations]

        market_order_arrivals = hawkes_sim.timestamps[0]
        market_order_arrivals = [('moa', time)
                                 for time in market_order_arrivals]

        # Merge into single array of event times
        event_times = limit_order_arrivals.copy()
        event_times.extend(limit_order_cancellations)
        event_times.extend(market_order_arrivals)
        event_times.sort(key=lambda x: x[1])

        return event_times
Пример #2
0
def simulate_univariate_hawkes(mu, alpha, beta, run_time, seed=None):
    """
    Simulates a univariate Hawkes based on the parameters.

    :param mu, alpha, beta: parameters of the Hawkes process
    :param run_time: End time of the simulation
    :param seed: (optional) Seed for the random process.
    :return: Hawkes event times
    """
    # this is due to tick's implementation of Hawkes process
    alpha = alpha / beta

    # Hawkes simulation
    n_nodes = 1  # dimension of the Hawkes process
    adjacency = alpha * np.ones((n_nodes, n_nodes))
    decays = beta * np.ones((n_nodes, n_nodes))
    baseline = mu * np.ones(n_nodes)
    hawkes_sim = SimuHawkesExpKernels(adjacency=adjacency,
                                      decays=decays,
                                      baseline=baseline,
                                      verbose=False,
                                      seed=seed)

    hawkes_sim.end_time = run_time
    hawkes_sim.simulate()
    event_times = hawkes_sim.timestamps[0]

    return event_times
Пример #3
0
    def test_hawkes_set_timestamps(self):
        """...Test simulation after some timestamps have been set manually
        """
        decay = 0.5
        baseline = [0.2, 0.4]
        adjacency = [[0.2, 0.1], [0, 0.3]]

        hawkes = SimuHawkesExpKernels(
            baseline=baseline, decays=decay, adjacency=adjacency,
            verbose=False, seed=1393)

        # timestamps generated by a hawkes process with the same
        # characteristics simulated up to time 10
        original_timestamps = [
            np.array([7.096244, 9.389927]),
            np.array([0.436199, 0.659153, 2.622352, 3.095093,
                      7.189881, 8.068153, 9.240032]),
        ]

        hawkes.track_intensity(1)
        hawkes.set_timestamps(original_timestamps, 10)
        hawkes.end_time = 100
        hawkes.simulate()

        # Intensity up to time 10 is known
        first_intensities = hawkes.tracked_intensity[0][:10]
        np.testing.assert_array_almost_equal(
            first_intensities,
            [0.2, 0.2447256, 0.27988282, 0.24845138, 0.23549475,
             0.27078386, 0.26749709, 0.27473586, 0.24532959, 0.22749379]
        )

        # Ensure other jumps have occured afterwards
        self.assertGreater(hawkes.n_total_jumps,
                           sum(map(len, original_timestamps)))
Пример #4
0
def SimulateExp(baseline, adjacency, decays, time):

    hawkes = SimuHawkesExpKernels(adjacency=adjacency,
                                  decays=decays,
                                  baseline=baseline,
                                  verbose=False)

    hawkes.end_time = time
    dt = 0.001  #millisecond granularity
    #hawkes.track_intensity(dt)
    print(f"Starting sim")
    hawkes.simulate()
    timestamps = hawkes.timestamps
    l = 0
    for series in timestamps:
        l += len(series)
    print(f"Simulated {l} points")
    return hawkes.timestamps
Пример #5
0
t_values = np.linspace(0, period_length)
y_values = 0.2 * np.maximum(np.sin(t_values *
                                   (2 * np.pi) / period_length), 0.2)
baselines = np.array(
    [TimeFunction((t_values, y_values), border_type=TimeFunction.Cyclic)])

decay = 0.1
adjacency = np.array([[0.5]])

hawkes = SimuHawkesExpKernels(adjacency,
                              decay,
                              baseline=baselines,
                              seed=2093,
                              verbose=False)
hawkes.track_intensity(0.1)
hawkes.end_time = 6 * period_length
hawkes.simulate()

fig, ax = plt.subplots(1, 1, figsize=(10, 4))

plot_point_process(hawkes, ax=ax)

t_values = np.linspace(0, hawkes.end_time, 1000)
ax.plot(t_values,
        hawkes.get_baseline_values(0, t_values),
        label='baseline',
        ls='--',
        lw=1)
ax.set_ylabel("$\lambda(t)$", fontsize=18)
ax.legend()
def simulate(parameters, T, adjacency, decay):
    '''
    parameters = (pi, beta, rho, u, delta00, delta01, delta10, delta11, mu1, mu2, mu3)
    '''

    pi, beta, rho, u, delta00, delta01, delta10, delta11, mu1, mu2, mu3 = parameters
    baseline = np.array([mu1, mu2, mu3])

    # Simulate Times
    hawkes_sim = SimuHawkesExpKernels(adjacency=adjacency,
                                      decays=decay,
                                      baseline=baseline,
                                      verbose=False)
    hawkes_sim.end_time = T
    hawkes_sim.simulate()

    # Generate Event Arrival Times
    limit_order_arivals = hawkes_sim.timestamps[1]
    limit_order_arivals = [('loa', time) for time in limit_order_arivals]

    limit_order_cancelations = hawkes_sim.timestamps[2]
    limit_order_cancelations = [('loc', time)
                                for time in limit_order_cancelations]

    market_order_arivals = hawkes_sim.timestamps[0]
    market_order_arivals = [('moa', time) for time in market_order_arivals]

    # Merge into single array of event times
    event_times = limit_order_arivals.copy()
    event_times.extend(limit_order_cancelations)
    event_times.extend(market_order_arivals)
    event_times.sort(key=lambda x: x[1])

    #%% initialize order book
    lob = OrderBook('XYZ', tick_size=1)

    AAPL_LOB = pd.read_csv(  # Orderbook
        '../../Data/LOBSTER_SampleFile_AAPL_2012-06-21_50/AAPL_2012-06-21_34200000_37800000_orderbook_50.csv',
        header=None)

    init = AAPL_LOB.iloc[0]
    t = 10**(-10)
    dt = 10**(-10)
    #Initial Orders
    for i in range(0, AAPL_LOB.shape[1], 4):
        if init[i + 1] > 0:
            lob.submit_limitorder(-1, init[i] / 100, init[i + 1], t)
            t += dt
    for i in range(2, AAPL_LOB.shape[1], 4):
        if init[i + 1] > 0:
            lob.submit_limitorder(1, init[i] / 100, init[i + 1], t)
            t += dt

    midprice = [lob.mid_price()]
    spread = [lob.spread()]
    time = [lob.time]

    for event in event_times:
        # simulation
        if event[0] == 'loa':  # limit order arrival
            order = gen_limitorder(lob, delta00, delta01, delta10, delta11,
                                   rho, u)
            ID = lob.submit_limitorder(*order, event[1])
        elif event[0] == 'loc':  # limit order cancellation
            # get number of sell and buy orders
            num_sells = sum(
                [len(value) for key, value in lob.sell_side.items()])
            num_buys = sum([len(value) for key, value in lob.buy_side.items()])
            # cancel random order if condition met
            if (num_sells > 5 and num_buys > 5):
                active_orders = get_active_orders(lob)
                lob.cancel_limitorder(np.random.choice(active_orders),
                                      event[1])
            else:
                continue  # if nothing happended dont collect data

        elif event[0] == 'moa':  # market order case
            order = gen_market_order(lob, beta, pi)
            lob.submit_marketorder(*order, event[1])
        else:
            raise ValueError('Invalid event type')

        midprice.append(lob.mid_price())
        spread.append(lob.spread())
        time.append(lob.time)

    Output = pd.DataFrame(index=pd.to_timedelta(time, unit='s'),
                          data={
                              'mid_price': midprice,
                              'spread': spread
                          })

    sigma5 = np.std(
        np.log(Output.resample('5s').first().mid_price).diff().dropna())
    sigma30 = np.std(
        np.log(Output.resample('30s').first().mid_price).diff().dropna())
    sigma60 = np.std(
        np.log(Output.resample('60s').first().mid_price).diff().dropna())
    meanSpread = np.mean(Output.spread)

    return (sigma5, sigma30, sigma60, meanSpread, *parameters)