Skip to content

Commit

Permalink
Update volume limits
Browse files Browse the repository at this point in the history
Updates volume limiting to support
multiple asset denominations.

Previously, all volume limits were in
dollars. This approximation worked for
v1 pools where all assets were worth
~1 dollar, but will not work for v2.

Coingecko volumes are now returned
in the base currency for each pair,
and volume limits for trades in the
opposite direction are computed using
the current price at each tick in the
volume limited arb pipeline.
  • Loading branch information
nagakingg committed Aug 16, 2023
1 parent 7cb5a07 commit 995aa7b
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 11 deletions.
5 changes: 5 additions & 0 deletions changelog.d/20230728_150932_nagakingg_vol_mult_update.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
Added
-----
- Add volume limiting in multiple denominations. Previously, volume
limiting was only in USD. This update allows for volume limiting
across multiple asset types (e.g., in v2 pools).
21 changes: 13 additions & 8 deletions curvesim/network/coingecko.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@
# pylint: disable=redefined-outer-name
import asyncio
from datetime import datetime, timedelta, timezone
from itertools import combinations

import numpy as np
import pandas as pd

from curvesim.utils import get_pairs

from .http import HTTP
from .utils import sync

Expand Down Expand Up @@ -113,17 +114,21 @@ def pool_prices(coins, vs_currency, days, chain="mainnet", end=None):
qprices, qvolumes = _pool_prices_sync(coins, vs_currency, days, end)

# Compute prices by coin pairs
combos = list(combinations(range(len(coins)), 2))
combos = get_pairs(len(coins))
prices = []
volumes = []

for pair in combos:
prices.append(
qprices.iloc[:, pair[0]] / qprices.iloc[:, pair[1]]
) # divide prices
volumes.append(
qvolumes.iloc[:, pair[0]] + qvolumes.iloc[:, pair[1]]
) # sum volumes
base_price = qprices.iloc[:, pair[0]]
base_volume = qvolumes.iloc[:, pair[0]]

quote_price = qprices.iloc[:, pair[1]]
quote_volume = qvolumes.iloc[:, pair[1]]

# divide prices: (usd/base) / (usd/quote) = quote/base
prices.append(base_price / quote_price)
# sum volumes and convert to base: usd / (usd/base) = base
volumes.append((base_volume + quote_volume) / base_price)

prices = pd.concat(prices, axis=1)
volumes = pd.concat(volumes, axis=1)
Expand Down
9 changes: 6 additions & 3 deletions curvesim/pipelines/vol_limited_arb/strategy.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,14 @@ def __init__(self, metrics, vol_mult):
self.vol_mult = vol_mult

def _get_trader_inputs(self, sample): # pylint: disable=too-few-public-methods
volume_limits = _compute_volume_limits(sample.volumes, self.vol_mult)
volume_limits = _compute_volume_limits(sample, self.vol_mult)
return sample.prices, volume_limits


def _compute_volume_limits(volumes, vol_mult):
def _compute_volume_limits(sample, vol_mult):
prices = sample.prices
volumes = sample.volumes

limits = {key: volumes[key] * vol_mult[key] for key in volumes}
reversed_limits = {(j, i): lim for (i, j), lim in limits.items()}
reversed_limits = {(j, i): lim * prices[(i, j)] for (i, j), lim in limits.items()}
return {**limits, **reversed_limits}

0 comments on commit 995aa7b

Please sign in to comment.