LeverageEstimate#
API documentation for tradeexecutor.utils.leverage_calculations.LeverageEstimate Python class in Trading Strategy framework.
- class LeverageEstimate[source]#
Bases:
object
Estimate token quantities and fees for a leverage position.
A helper class to make sense out of fees when doing leveraged trading on 1delta / Aave.
When increasing short, the fees are allocated to the collateral we need to borrow
Opening short
- Doing 3x ETH short
Start with 10 USDC
Deposit in Aave
ETH price is 1,500 USD/ETH
Using swap exact out method
The short should be 20 USD worth of ETH, 29.99 USD collateral
Deposit 10 USDC to Aave
- Open position with 1delta protocol contract
1delta takes inputs
1delta initiates swap for 0.0133333333333 WETH to 20 USDC (minus fees)
Uniswap v3 calls back 1delta
1delta mints out USDC aToken from USDC we received from the swap
We have now total 10 (originak deposit) + 19.99 USDC (new loan) in Aave
1delta borrows WETH for 0.0133333333333 WETH
Uniswap is happy has we have WETH we did not have at the start of the process
- Fee calculations
Token in: Borrowed ETH (no fees) 13.3333333333
Token out: 19.99 USDC (0.01 USD paid in fees)
- Final outcome
vWETH 0.0133333333
aUSDC 29.99
** Close short **
Closing 3x short as described above
- Closing position with 1delta
Assume price is
Get exact wWETH debt amount: 0.0112236255452078143 vWETH
- Start a swap process on Uniswap with WETH -> USDC for this amount
There is no WETH yet in this point
Uniswap will tell us how much USDC we will need later down the chain
- Uniswap calls 1delta fallback called with incoming WETH from the swap
Aave loan is repaid with WETH
Uniswap tells os the USDC needed to cover the swap cost
Atoken USDC colleteral is converted back to USDC to cover the cost of the swap
The amount of USDC here is fee inclusive to match 0.0112236255452078143 vWETH, so it is wWETH price + fees
Total swap cost is = (0.0112236255452078143 / 0.9995) * ETH price
Fees are 0.0005 * (0.0112236255452078143 / 0.9995) * ETH price = ETH amount * (fee / (1-fee))
- __init__(starting_reserve, leverage, borrowed_quantity, borrowed_value, additional_collateral_quantity, total_collateral_quantity, total_borrowed_quantity, borrowed_asset_price, fee_tier, lp_fees, liquidation_price=None)#
- Parameters:
starting_reserve (Decimal) –
leverage (float) –
borrowed_quantity (Decimal) –
borrowed_value (float) –
additional_collateral_quantity (Decimal) –
total_collateral_quantity (Decimal) –
total_borrowed_quantity (Decimal) –
borrowed_asset_price (float) –
fee_tier (float) –
lp_fees (float) –
liquidation_price (float | None) –
- Return type:
None
Methods
__init__
(starting_reserve, leverage, ...[, ...])close_short
(start_collateral, ...[, fee])Reduce or close short position.
open_short
(starting_reserve, leverage, ...)Get borrow and colleteral size for a loan in leverage protocol trading.
Attributes
What is the liquidation price for this position.
Amount of USDC reserve we use for this position.
What was the leverage multiplier we used.
Amount of the borrowed token we short.
What is the borrowed asset value in USD
This is the output when we buy/sell borrowed asset.
Amount of total collateral we have
What is the total borrow amount after this ooperation
What was our swap fee tier
How much fees we are going to be.
- starting_reserve: Decimal#
Amount of USDC reserve we use for this position.
Set to 0 when closing/reducing short position as the position is covered from the collateral.
- leverage: float#
What was the leverage multiplier we used.
Short open: This is the leverage the user desired.
Short close/reduce: This is the leverage remaining.
- borrowed_quantity: Decimal#
Amount of the borrowed token we short.
Positive if we increase our borrow.
Negative if we reduce or borrow.
- additional_collateral_quantity: Decimal#
This is the output when we buy/sell borrowed asset.
Positive: We are selling WETH and adding this USDC to our debt.
Negative: We are buying WETH and need to convert this much of collateral to USDC to match the cost.
- total_collateral_quantity: Decimal#
Amount of total collateral we have
Short open: This is starting reserve + additional collateral borrowed.
Short close: This is remaining collateral after converting it to cover the trade to close the short.
- liquidation_price: float | None = None#
What is the liquidation price for this position. If the price goes below this, the loan is liquidated.
- static open_short(starting_reserve, leverage, borrowed_asset_price, shorting_pair, fee=0)[source]#
Get borrow and colleteral size for a loan in leverage protocol trading.
See
calculate_sizes_for_leverage()
.Note
Short only. Stablecoin collateral only.
Example:
from tradeexecutor.strategy.lending_protocol_leverage import LeverageEstimate # Start with 10 USD starting_capital = 10.0 leverage = 3.0 eth_price = 1634.4869 # This will borrow additional # - 20 USDC as collateral # - 0.01228645 WETH estimate = LeverageEstimate.open_short( starting_capital, leverage, eth_price, fee=0.0005, ) print("Estimated amounts for the short:", estimate)
Example output:
Estimated amounts for the short: <Leverage estimate leverage: 3.0 reserve allocated (USDC): 10 borrowed (vToken): 0.01223625591615325807353339610 total collateral (aToken): 29.98999999999999999979183318 LP fees: 0.01 USD >
- Parameters:
starting_capital – How much USDC we are going to deposit
leverage (float) – How much leverage we take
token_price – What is the price of a token we short
shorting_pair (TradingPairIdentifier) –
The synthetic trading pair for the lending pool short.
With aToken and vToken.
fee (float) –
What is the trading fee for swapping the borrowed asset to collateral.
TODO: Use the fee from the trading pair.
starting_reserve (float | decimal.Decimal) –
borrowed_asset_price (float) –
- Returns:
borrow quantity, collateral quantity for the constructed loan
- Return type:
- static close_short(start_collateral, start_borrowed, close_size, borrowed_asset_price, fee=0)[source]#
Reduce or close short position.
Calculate the trade mounts needed to close a short position.
Buy back shorted tokens
Release any collateral
See
LeverageEstimate
for fee calculation example.Example:
estimate = LeverageEstimate.close_short( start_collateral=short_position.loan.collateral.quantity, start_borrowed=short_position.loan.borrowed.quantity, close_size=short_position.loan.borrowed.quantity, fee=weth_short_identifier_5bps.fee, borrowed_asset_price=1500.0, ) assert estimate.leverage == 1.0 # Reduced USDC leverage to 1.0 assert estimate.additional_collateral_quantity == pytest.approx(Decimal(-20010.00500250125062552103147)) # USDC needed to reduce from collateral to close position + fees assert estimate.borrowed_quantity == pytest.approx(Decimal(-13.33333333333333333333333333)) # How much ETH is bought to close the short assert estimate.total_collateral_quantity == pytest.approx(Decimal(9979.99499749874937427080171)) # Collateral left after closing the position assert estimate.total_borrowed_quantity == 0 # open vWETH debt left after close assert estimate.lp_fees == pytest.approx(10.005002501250626)
We assume collateral is 1:1 USD.
- __init__(starting_reserve, leverage, borrowed_quantity, borrowed_value, additional_collateral_quantity, total_collateral_quantity, total_borrowed_quantity, borrowed_asset_price, fee_tier, lp_fees, liquidation_price=None)#
- Parameters:
starting_reserve (Decimal) –
leverage (float) –
borrowed_quantity (Decimal) –
borrowed_value (float) –
additional_collateral_quantity (Decimal) –
total_collateral_quantity (Decimal) –
total_borrowed_quantity (Decimal) –
borrowed_asset_price (float) –
fee_tier (float) –
lp_fees (float) –
liquidation_price (float | None) –
- Return type:
None