El clásico Volumen neto El indicador opera en las barras OHLCV, no en las operaciones en bruto.
- La subida se registra cuando el cierre de la barra es mayor que la apertura
- El downtick se registra cuando el cierre de la barra es inferior a la apertura
- El volumen con signo (direccional) es positivo en las subidas y negativo en las bajadas
- El volumen neto es la suma acumulada de los volúmenes firmados
Permítanme ilustrar el concepto con un ejemplo utilizando barras de 5 minutos.
| datetime | open() | close() | tick | volume() | sign_volume | net_volume |
|----------|--------:|--------:|-----:|---------:|------------:|-----------:|
| 09:30:00 | 62.35 | 62.48 | 1 | 95611 | 95611 | 95611 |
| 09:35:00 | 62.42 | 62.97 | 1 | 50887 | 50887 | 146498 |
| 09:40:00 | 62.94 | 62.82 | -1 | 45114 | -45114 | 101384 |
| 09:45:00 | 62.90 | 62.30 | -1 | 24267 | -24267 | 77117 |
| 09:50:00 | 62.29 | 61.45 | -1 | 72576 | -72576 | 4541 |
| 09:55:00 | 61.45 | 61.43 | -1 | 28622 | -28622 | -24081 |
| 10:00:00 | 61.48 | 61.98 | 1 | 28092 | 28092 | 4011 |
| 10:05:00 | 62.00 | 62.02 | 1 | 42849 | 42849 | 46860 |
La siguiente consulta SQL obtiene las operaciones en bruto, calcula las barras OHLCV, clasifica las barras por la dirección del precio ( tick
), y finalmente suma los volúmenes firmados.
SELECT *, SUM(signed_volume) AS net_volume FROM (
SELECT symbol, datetime, open(), close(),
CASE
WHEN close()>open() THEN 1
WHEN close()<open() THEN -1
ELSE 0
END AS tick,
volume(),
tick*volume() AS signed_volume
FROM atsd_trade WHERE symbol = 'NTAP.US'
AND datetime BETWEEN '2021-02-26' AND '2021-02-27'
GROUP BY exchange, class, symbol, PERIOD(5 minute)
) WITH ROW_NUMBER(symbol ORDER BY datetime) > 0
El volumen neto sobre barras OHLCV es sensible al periodo de la barra.
Tal vez pueda estabilizarlo utilizando vwap y/o ajustando la condición de tic para que se necesite un movimiento de precio mayor para provocar un cambio en el volumen neto.
WHEN vwap()>prev_vwap THEN 1
WHEN vwap()<prev_vwap THEN -1
ELSE 0
WHEN close()>open()*1.001 THEN 1
WHEN close()<open()*0.999 THEN -1
ELSE 0
Dirección comercial (comprar o vender) no forma parte de Volumen neto cálculo. Además, no es lo mismo que la dirección de la orden. En los libros de órdenes limitadas, una operación se clasifica como COMPRA cuando una orden de compra entrante coincide instantáneamente con una orden de venta permanente. Si la orden de compra entrante no es casada, se coloca en el libro de órdenes, y la operación se clasificará como VENTA cuando una orden de venta posterior la tome. En otras palabras, como mencionó @user47399, la dirección de la operación == dirección de la orden del tomador de liquidez. Durante las subastas, cuando no se utiliza el libro de órdenes limitadas, la dirección de la operación se basa en los números de orden asignados por la bolsa. De las dos órdenes participantes en la subasta, la dirección de la operación se deduce de la última orden. Para determinar correctamente la dirección de la operación se necesita acceder al registro completo de órdenes o a un feed de operaciones en el que los registros estén preclasificados por la bolsa.
Las operaciones de compra pueden ser operaciones a la baja y las de venta pueden ser operaciones al alza. En el ejemplo siguiente, la operación de compra 3657601171 es una operación a la baja, mientras que la operación de venta 3657602494 es una operación al alza.
| datetime | price | quantity | side | prev_price | tick | trade_num |
|----------------------------|-------:|---------:|------|-----------:|-----:|-----------:|
| 2021-02-26 11:01:43.482121 | 35.251 | 1 | B | | 0 | 3657600807 |
| 2021-02-26 11:01:47.289811 | 35.243 | 90 | B | 35.251 | -1 | 3657601171 |
| 2021-02-26 11:01:47.289811 | 35.243 | 10 | B | 35.243 | 0 | 3657601172 |
| 2021-02-26 11:01:51.535774 | 35.242 | 11 | B | 35.243 | -1 | 3657601628 |
| 2021-02-26 11:01:59.153104 | 35.270 | 1 | S | 35.242 | 1 | 3657602494 |
| 2021-02-26 11:01:59.153104 | 35.260 | 1 | S | 35.270 | -1 | 3657602495 |
| 2021-02-26 11:01:59.153104 | 35.252 | 11 | S | 35.260 | -1 | 3657602496 |
| 2021-02-26 11:01:59.682744 | 35.252 | 79 | S | 35.252 | 0 | 3657602528 |
| 2021-02-26 11:01:59.682744 | 35.252 | 21 | S | 35.252 | 0 | 3657602529 |
SELECT * FROM (
SELECT datetime, price, quantity, side, LAG(price) AS prev_price,
CASE
WHEN price>prev_price THEN 1
WHEN price<prev_price THEN -1
ELSE 0
END AS tick, trade_num
FROM atsd_trade WHERE symbol = '-- redacted
AND datetime BETWEEN '2021-02-26 11:01:40' AND '2021-02-26 11:02:00'
) --WHERE (side = 'B' AND tick = -1 OR side = 'S' AND tick = 1)
Para que los resultados sean significativos, el volumen neto calculado sobre las operaciones brutas tendría que agrupar las cantidades por la hora exacta de la operación (y el número de orden), de modo que las operaciones simultáneas desencadenadas por la misma orden se traten como una sola operación.
Por ejemplo, ¿cómo clasificaría las operaciones de VENTA 3657602494, 3657602495, 3657602496, todas originadas por la misma orden de VENTA y registradas al mismo tiempo? Creo que debería tratarse como una subida de 13 lotes.