Metrics to inform choices for per-market risk parameters.
Data is sampled from on-chain oracles and the underlying feed is assumed to be driven by a Levy process of the form
P_j = P_0 * e**(mu * j * T + sig * L(j*T))
where L(j*T)
has Levy stable increments, j
is an int
for the number of update intervals that occur after the initial feed value of P_0
, and T
is the update interval of the feed.
There should be some way to assess risk to the system. A good approach is to model the underlying feed value as being driven by a stochastic process, which allows estimation of "VaR" for passive OVL holders, who act as the counterparty to all unbalanced trades.
Calculation of per-market risk metrics requires estimating distributional parameters for the underlying stochastic model. This repo aims to provide easy to access views for those parameters.
To run the project you need:
- Python >=3.7.2 local development environment
- Brownie local environment setup
- Set env variables for Etherscan API and Infura:
ETHERSCAN_TOKEN
andWEB3_INFURA_PROJECT_ID
- Local Ganache environment installed
- InfluxDB set up with local environment variables:
INFLUXDB_TOKEN
,INFLUXDB_ORG
,INFLUXDB_URL
Using Poetry for dependencies. Install with pipx
pipx install poetry
Clone the repo, then
poetry install
within the local dir.
The risk pipeline has a set of scripts to obtain data, generate and recommend risk parameters, and create helpful visualizations for analysis. Run the scripts from the base directory in a poetry shell. Start poetry shell:
poetry shell
Get coinbase data and treat it:
python scripts/risk_pipeline/data_prep/coinbase_data_prep.py --pair ETH-USD --pull_periodicity 300 --final_periodicity 600 --start_time 2022-01-01-00-00 --end_time 2022-03-01-00-00
Get risk parameters:
Data should be stored in CSV format within scripts/risk_pipeline/outputs/data/<dataname.csv>
and the column for the feed should be named "close" or "twap". To get risk parameters for a given data set, run
python scripts/risk_pipeline/risk_parameters.py --filename dataname --periodicity 600 --payoffcap 10 --short_twap 600 --long_twap 3600
To get risk parameters for a given data set and visualisations, run
python scripts/risk_pipeline/risk_pipeline.py --filename dataname --periodicity 600 --payoffcap 10 --short_twap 600 --long_twap 3600
To run, for example, the script to ingest stat parameters for historical risk analysis, do
poetry shell
brownie run influx_kv1o --network mainnet
To save on gas costs for this risk analysis, there are cron schedulers to run Brownie scripts every 10 minutes, fetching cumulative price values from SushiSwap and uploading them to InfluxDB for easy-to-access historical timeseries.
To setup the cron for e.g. fetching from SushiSwap, simply run from the base dir
poetry shell
python scripts/cron/schedule_sushi.py
which will run every 10 minutes storing new cumulative price data from all quotes in scripts/constants/quotes.json
.
% poetry cache clear --all pypi
> Delete 63 entries? (yes/no) [no] yes
% poetry lock
% poetry install
Then regenerate requirements.txt
with:
% poetry export -f requirements.txt --output requirements.txt --without-hashes