Imp Loss V2
Impermanent Loss
Section titled “Impermanent Loss”from uniswappy import *import numpy as npimport datetimeimport matplotlib.pyplot as plt# Instantiation Parametersn_steps = 2000 # Number of stepsstart_price = 10 # Initial price SYS/USDmu = 0.1; sigma = 0.5n_paths = 1 # Number of simulationed pathsseconds_year = 31536000
# Brownian Modelbm = BrownianModel(start_price)p_arr = bm.gen_gbms(mu, sigma, n_steps-1, n_paths).flatten()
dt = datetime.timedelta(seconds=seconds_year/n_steps)dates = [datetime.datetime.strptime("2024-09-01", '%Y-%m-%d') + k*dt for k in range(n_steps)]user_nm = 'user0'tkn1_amount = 1000tkn2_amount = p_arr[0]*tkn1_amount
tkn1_nm = 'TKN1'tkn2_nm = 'TKN2'
tkn1 = ERC20('TKN1', "0x111")tkn2 = ERC20('TKN2', "0x09")exchg_data = UniswapExchangeData(tkn0 = tkn1, tkn1 = tkn2, symbol="LP", address="0x011")
factory = UniswapFactory("pool factory", "0x2")lp = factory.deploy(exchg_data)Join().apply(lp, user_nm, tkn1_amount, tkn2_amount)
lp.summary()Exchange TKN1-TKN2 (LP)
Reserves: TKN1 = 1000.0, TKN2 = 10000.0
Liquidity: 3162.2776601683795
out = AddLiquidity().apply(lp, tkn1, user_nm, 10)lp.summary()
dL = lp.get_last_liquidity_deposit()iLoss = UniswapImpLoss(lp, dL)Exchange TKN1-TKN2 (LP)
Reserves: TKN1 = 1010.0, TKN2 = 10100.0
Liquidity: 3193.900436770063
tkn1_init_amt = iLoss.get_init_amt(tkn1)tkn2_init_amt = iLoss.get_init_amt(tkn2)tkn1_hold_amt = iLoss.hold_value(tkn1)tkn2_hold_amt = iLoss.hold_value(tkn2)
print(f'Initial {tkn1.token_name} amount: {tkn1_init_amt:.2f}, Initial {tkn2.token_name} amount: {tkn2_init_amt:.2f}')print(f'Hold {tkn1.token_name} amount: {tkn1_hold_amt:.2f}, Hold {tkn2.token_name} amount: {tkn2_hold_amt:.2f}')Initial TKN1 amount: 10.00, Initial TKN2 amount: 100.00
Hold TKN1 amount: 20.00, Hold TKN2 amount: 200.00
Simulate AMM
Section titled “Simulate AMM”arb = CorrectReserves(lp, x0 = p_arr[0])TKN_amt = TokenDeltaModel(100)pTKN1_TKN2_arr = [];
for k in range(n_steps):
# ***************************** # ***** Random Swapping ****** # ***************************** Swap().apply(lp, tkn1, user_nm, TKN_amt.delta()) Swap().apply(lp, tkn2, user_nm, p_arr[k]*TKN_amt.delta())
# ***************************** # ***** Rebalance ****** # ***************************** arb.apply(p_arr[k])
# ***************************** # ******* Data Capture ******** # ***************************** pTKN1_TKN2_arr.append(LPQuote().get_price(lp, tkn1))
lp.summary()Exchange TKN1-TKN2 (LP)
Reserves: TKN1 = 1771.3573494134228, TKN2 = 18219.61113048574
Liquidity: 4952.847449768049
n_steps = 1000alphas = np.linspace(0, 5, num=n_steps)alpha_deltas = alphas-1
imp_loss = np.array([iLoss.calc_iloss(alpha) for alpha in alphas])
m0 = 10; m1 = 100fig, (lp_ax) = plt.subplots(nrows=1, sharex=True, sharey=False, figsize=(12, 5))fig.suptitle(f'Impermanent Loss: Uni V2', fontsize=20)lp_ax.plot(100*alphas[m0:-m1]-100, 100*imp_loss[m0:-m1], label = f'Uni V2')lp_ax.set_xlabel("Price Chg (%)", fontsize=12)lp_ax.set_ylabel("Impermanent Loss (%)", fontsize=14)lp_ax.legend(fontsize=10, facecolor="lightgray", loc='lower right')<matplotlib.legend.Legend at 0x146ff0fa0>
Calculate Imp. Loss
Section titled “Calculate Imp. Loss”tkn1_hold_amt = iLoss.hold_value(tkn1)tkn2_hold_amt = iLoss.hold_value(tkn2)tkn1_pos_amt = iLoss.current_position_value(tkn1)tkn2_pos_amt = iLoss.current_position_value(tkn2)
print(f'{tkn1.token_name} hold amt: {tkn1_hold_amt:.2f}, {tkn2.token_name} hold amt: {tkn2_hold_amt:.2f}')print(f'{tkn1.token_name} position amt: {tkn1_pos_amt:.2f}, {tkn2.token_name} position amt: {tkn2_pos_amt:.2f}')print(f'Start price: {p_arr[0]:.2f}, End price: {p_arr[1]:.2f}')TKN1 hold amt: 19.72, TKN2 hold amt: 202.86
TKN1 position amt: 22.51, TKN2 position amt: 231.57
Start price: 10.00, End price: 9.91
iloss_calc = iLoss.apply(fees = False)returns_calc = iLoss.apply(fees = True)
print(f'Imp Loss: {100*iloss_calc:.2f}%, returns: {100*returns_calc:.2f} %')Imp Loss: -0.01%, returns: 14.15 %