Skip to content

Commit

Permalink
Aave cash management (#1136)
Browse files Browse the repository at this point in the history
- Create shortcut functions to manage lending based strategies
  • Loading branch information
miohtama authored Jan 17, 2025
1 parent 98d3c4f commit 96b4531
Show file tree
Hide file tree
Showing 77 changed files with 912 additions and 259 deletions.
2 changes: 1 addition & 1 deletion notebooks/momentum/defi-bluechip-momentum.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,7 @@
" # Calculate how much dollar value we want each individual position to be on this strategy cycle,\n",
" # based on our total available equity\n",
" portfolio = position_manager.get_current_portfolio()\n",
" portfolio_target_value = portfolio.get_total_equity() * value_allocated_to_positions\n",
" portfolio_target_value = portfolio.calculate_total_equity() * value_allocated_to_positions\n",
" alpha_model.calculate_target_positions(position_manager, portfolio_target_value)\n",
"\n",
" # Shift portfolio from current positions to target positions\n",
Expand Down

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion notebooks/rsi-momentum/v12-small-timeframe.ipynb

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

28 changes: 14 additions & 14 deletions notebooks/rsi-momentum/v16-small-timeframe-grid-shifted.ipynb

Large diffs are not rendered by default.

22 changes: 11 additions & 11 deletions notebooks/rsi-momentum/v19-new-style-grid-search.ipynb

Large diffs are not rendered by default.

Large diffs are not rendered by default.

22 changes: 11 additions & 11 deletions notebooks/rsi-momentum/v21-shifted-candle-grid-search.ipynb

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion notebooks/rsi-momentum/v27-momentum-factor-bug-fix.ipynb

Large diffs are not rendered by default.

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion notebooks/rsi-momentum/v29-trading-fee-increased.ipynb

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions strategies/base-memex.py
Original file line number Diff line number Diff line change
Expand Up @@ -306,7 +306,7 @@ def decide_trades(
# Calculate how much dollar value we want each individual position to be on this strategy cycle,
# based on our total available equity
portfolio = position_manager.get_current_portfolio()
portfolio_target_value = portfolio.get_total_equity() * parameters.allocation
portfolio_target_value = portfolio.calculate_total_equity() * parameters.allocation - position_manager.get_pending_redemptions()

# Select max_assets_in_portfolio assets in which we are going to invest
# Calculate a weight for ecah asset in the portfolio using 1/N method based on the raw signal
Expand Down Expand Up @@ -385,7 +385,7 @@ def decide_trades(
Pairs meeting volatility inclusion criteria: {volatility_included_pair_count}
Pairs meeting TVL inclusion criteria: {tvl_included_pair_count}
Signals created: {signal_count}
Total equity: {portfolio.get_total_equity():,.2f} USD
Total equity: {portfolio.calculate_total_equity():,.2f} USD
Cash: {position_manager.get_current_cash():,.2f} USD
Redemption queue: {position_manager.get_pending_redemptions():,.2f} USD
Investable equity: {alpha_model.investable_equity:,.2f} USD
Expand Down
4 changes: 2 additions & 2 deletions strategies/eth-btc-usdc-credit.py
Original file line number Diff line number Diff line change
Expand Up @@ -329,7 +329,7 @@ def decide_trades(
alpha_model.normalise_weights()
alpha_model.update_old_weights(state.portfolio, portfolio_pairs=volatile_pairs)
portfolio = position_manager.get_current_portfolio()
portfolio_target_value = portfolio.get_total_equity() * parameters.allocation
portfolio_target_value = portfolio.calculate_total_equity() * parameters.allocation
alpha_model.calculate_target_positions(position_manager, portfolio_target_value)

trades = []
Expand All @@ -339,7 +339,7 @@ def decide_trades(
#
rebalance_trades = alpha_model.generate_rebalance_trades_and_triggers(
position_manager,
min_trade_threshold=parameters.rebalance_threshold * portfolio.get_total_equity(),
min_trade_threshold=parameters.rebalance_threshold * portfolio.calculate_total_equity(),
)

if len(rebalance_trades) > 0:
Expand Down
4 changes: 2 additions & 2 deletions strategies/eth-btc-usdc-low-fee.py
Original file line number Diff line number Diff line change
Expand Up @@ -273,11 +273,11 @@ def decide_trades(
alpha_model.normalise_weights()
alpha_model.update_old_weights(state.portfolio)
portfolio = position_manager.get_current_portfolio()
portfolio_target_value = portfolio.get_total_equity() * parameters.allocation
portfolio_target_value = portfolio.calculate_total_equity() * parameters.allocation
alpha_model.calculate_target_positions(position_manager, portfolio_target_value)
trades = alpha_model.generate_rebalance_trades_and_triggers(
position_manager,
min_trade_threshold=parameters.rebalance_threshold * portfolio.get_total_equity(),
min_trade_threshold=parameters.rebalance_threshold * portfolio.calculate_total_equity(),
)

#
Expand Down
2 changes: 1 addition & 1 deletion strategies/eth-btc-usdc-size-risk.py
Original file line number Diff line number Diff line change
Expand Up @@ -273,7 +273,7 @@ def decide_trades(
# Calculate how much dollar value we want each individual position to be on this strategy cycle,
# based on our total available equity
portfolio = position_manager.get_current_portfolio()
portfolio_target_value = portfolio.get_total_equity() * parameters.allocation
portfolio_target_value = portfolio.calculate_total_equity() * parameters.allocation

#
# Do 1/N weighting
Expand Down
4 changes: 2 additions & 2 deletions strategies/eth-btc-usdc.py
Original file line number Diff line number Diff line change
Expand Up @@ -334,11 +334,11 @@ def decide_trades(
alpha_model.normalise_weights()
alpha_model.update_old_weights(state.portfolio)
portfolio = position_manager.get_current_portfolio()
portfolio_target_value = portfolio.get_total_equity() * parameters.allocation
portfolio_target_value = portfolio.calculate_total_equity() * parameters.allocation
alpha_model.calculate_target_positions(position_manager, portfolio_target_value)
trades = alpha_model.generate_rebalance_trades_and_triggers(
position_manager,
min_trade_threshold=parameters.rebalance_threshold * portfolio.get_total_equity(),
min_trade_threshold=parameters.rebalance_threshold * portfolio.calculate_total_equity(),
)

#
Expand Down
4 changes: 2 additions & 2 deletions strategies/matic-eth-usdc.py
Original file line number Diff line number Diff line change
Expand Up @@ -266,11 +266,11 @@ def decide_trades(
alpha_model.normalise_weights()
alpha_model.update_old_weights(state.portfolio)
portfolio = position_manager.get_current_portfolio()
portfolio_target_value = portfolio.get_total_equity() * parameters.allocation
portfolio_target_value = portfolio.calculate_total_equity() * parameters.allocation
alpha_model.calculate_target_positions(position_manager, portfolio_target_value)
trades = alpha_model.generate_rebalance_trades_and_triggers(
position_manager,
min_trade_threshold=parameters.rebalance_threshold * portfolio.get_total_equity(),
min_trade_threshold=parameters.rebalance_threshold * portfolio.calculate_total_equity(),
)

#
Expand Down
2 changes: 1 addition & 1 deletion strategies/pancake-momentum-v2.py
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,7 @@ def decide_trades(
weights = normalise_weights(weight_by_1_slash_n(alpha_signals))

portfolio = position_manager.get_current_portfolio()
portfolio_target_value = portfolio.get_total_equity() * value_allocated_to_positions
portfolio_target_value = portfolio.calculate_total_equity() * value_allocated_to_positions

# Shift portfolio from current positions to target positions
# determined by the alpha signals (momentum)
Expand Down
2 changes: 1 addition & 1 deletion strategies/spot-and-short-momentum-4.py
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ def decide_trades(
# Calculate how much dollar value we want each individual position to be on this strategy cycle,
# based on our total available equity
portfolio = position_manager.get_current_portfolio()
portfolio_target_value = portfolio.get_total_equity() * value_allocated_to_positions
portfolio_target_value = portfolio.calculate_total_equity() * value_allocated_to_positions
alpha_model.calculate_target_positions(position_manager, portfolio_target_value)

signal_df = format_signals(alpha_model)
Expand Down
2 changes: 1 addition & 1 deletion strategies/spot-and-short-momentum-grid-3.py
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ def decide_trades(
# Calculate how much dollar value we want each individual position to be on this strategy cycle,
# based on our total available equity
portfolio = position_manager.get_current_portfolio()
portfolio_target_value = portfolio.get_total_equity() * value_allocated_to_positions
portfolio_target_value = portfolio.calculate_total_equity() * value_allocated_to_positions
alpha_model.calculate_target_positions(position_manager, portfolio_target_value)

signal_df = format_signals(alpha_model)
Expand Down
2 changes: 1 addition & 1 deletion strategies/spot-and-short-momentum-grid.py
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ def decide_trades(
# Calculate how much dollar value we want each individual position to be on this strategy cycle,
# based on our total available equity
portfolio = position_manager.get_current_portfolio()
portfolio_target_value = portfolio.get_total_equity() * value_allocated_to_positions
portfolio_target_value = portfolio.calculate_total_equity() * value_allocated_to_positions
alpha_model.calculate_target_positions(position_manager, portfolio_target_value)

signal_df = format_signals(alpha_model)
Expand Down
2 changes: 1 addition & 1 deletion strategies/spot-and-short-momentum-tuned.py
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ def decide_trades(
# Calculate how much dollar value we want each individual position to be on this strategy cycle,
# based on our total available equity
portfolio = position_manager.get_current_portfolio()
portfolio_target_value = portfolio.get_total_equity() * value_allocated_to_positions
portfolio_target_value = portfolio.calculate_total_equity() * value_allocated_to_positions
alpha_model.calculate_target_positions(position_manager, portfolio_target_value)

signal_df = format_signals(alpha_model)
Expand Down
2 changes: 1 addition & 1 deletion strategies/spot-and-short-momentum.py
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ def decide_trades(
# Calculate how much dollar value we want each individual position to be on this strategy cycle,
# based on our total available equity
portfolio = position_manager.get_current_portfolio()
portfolio_target_value = portfolio.get_total_equity() * value_allocated_to_positions
portfolio_target_value = portfolio.calculate_total_equity() * value_allocated_to_positions
alpha_model.calculate_target_positions(position_manager, portfolio_target_value)

signal_df = format_signals(alpha_model)
Expand Down
4 changes: 2 additions & 2 deletions strategies/test_only/base-memecoin-index.py
Original file line number Diff line number Diff line change
Expand Up @@ -311,7 +311,7 @@ def decide_trades(
# Calculate how much dollar value we want each individual position to be on this strategy cycle,
# based on our total available equity
portfolio = position_manager.get_current_portfolio()
portfolio_target_value = portfolio.get_total_equity() * parameters.allocation
portfolio_target_value = portfolio.calculate_total_equity() * parameters.allocation

# Select max_assets_in_portfolio assets in which we are going to invest
# Calculate a weight for ecah asset in the portfolio using 1/N method based on the raw signal
Expand Down Expand Up @@ -392,7 +392,7 @@ def decide_trades(
- meeting volatility inclusion criteria: {volatility_included_pair_count}
- meeting TVL inclusion criteria: {tvl_included_pair_count}
Signals created: {signal_count}
Total equity: {portfolio.get_total_equity():,.2f} USD
Total equity: {portfolio.calculate_total_equity():,.2f} USD
Cash: {position_manager.get_current_cash():,.2f} USD
Investable equity: {alpha_model.investable_equity:,.2f} USD
Accepted investable equity: {alpha_model.accepted_investable_equity:,.2f} USD
Expand Down
2 changes: 1 addition & 1 deletion strategies/test_only/defi-bluechip-momentum-trailing-sl.py
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ def decide_trades(
# Calculate how much dollar value we want each individual position to be on this strategy cycle,
# based on our total available equity
portfolio = position_manager.get_current_portfolio()
portfolio_target_value = portfolio.get_total_equity() * value_allocated_to_positions
portfolio_target_value = portfolio.calculate_total_equity() * value_allocated_to_positions
alpha_model.calculate_target_positions(position_manager, portfolio_target_value)

# Shift portfolio from current positions to target positions
Expand Down
2 changes: 1 addition & 1 deletion strategies/test_only/defi-bluechip-momentum.py
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ def decide_trades(
# Calculate how much dollar value we want each individual position to be on this strategy cycle,
# based on our total available equity
portfolio = position_manager.get_current_portfolio()
portfolio_target_value = portfolio.get_total_equity() * value_allocated_to_positions
portfolio_target_value = portfolio.calculate_total_equity() * value_allocated_to_positions
alpha_model.calculate_target_positions(position_manager, portfolio_target_value)

# Added for tests
Expand Down
6 changes: 3 additions & 3 deletions strategies/test_only/enzyme-polygon-eth-btc-rsi.py
Original file line number Diff line number Diff line change
Expand Up @@ -347,7 +347,7 @@ def decide_trades(
#

portfolio = position_manager.get_current_portfolio()
portfolio_target_value = portfolio.get_total_equity() * parameters.allocation
portfolio_target_value = portfolio.calculate_total_equity() * parameters.allocation

# Use alpha model and construct a portfolio of two assets
alpha_model.select_top_signals(2)
Expand Down Expand Up @@ -385,15 +385,15 @@ def decide_trades(
#
trades += alpha_model.generate_rebalance_trades_and_triggers(
position_manager,
min_trade_threshold=parameters.rebalance_threshold * portfolio.get_total_equity(),
min_trade_threshold=parameters.rebalance_threshold * portfolio.calculate_total_equity(),
)

if len(trades) == 0 and alpha_model.has_any_signal():
# Be noisy if our risk parameters are too tight
# and we starting to lose positions because of it
position_manager.log(
f"Generated zero trades even though trade signals: {list(alpha_model.signals.values())}\n" +
f"Total equity: {portfolio.get_total_equity()}\n" +
f"Total equity: {portfolio.calculate_total_equity()}\n" +
f"Rebalance threshold: {parameters.rebalance_threshold}\n",
level=logging.WARNING,
)
Expand Down
2 changes: 1 addition & 1 deletion strategies/test_only/ethereum-memecoin-vol-basket.py
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,7 @@ def decide_trades(
# Calculate how much dollar value we want each individual position to be on this strategy cycle,
# based on our total available equity
portfolio = position_manager.get_current_portfolio()
portfolio_target_value = portfolio.get_total_equity() * parameters.allocation
portfolio_target_value = portfolio.calculate_total_equity() * parameters.allocation

#
# Do 1/N weighting
Expand Down
4 changes: 2 additions & 2 deletions strategies/test_only/memecoin_index.py
Original file line number Diff line number Diff line change
Expand Up @@ -292,7 +292,7 @@ def decide_trades(
# Calculate how much dollar value we want each individual position to be on this strategy cycle,
# based on our total available equity
portfolio = position_manager.get_current_portfolio()
portfolio_target_value = portfolio.get_total_equity() * parameters.allocation
portfolio_target_value = portfolio.calculate_total_equity() * parameters.allocation

# Select max_assets_in_portfolio assets in which we are going to invest
# Calculate a weight for ecah asset in the portfolio using 1/N method based on the raw signal
Expand Down Expand Up @@ -359,7 +359,7 @@ def decide_trades(
Pairs total: {strategy_universe.data_universe.pairs.get_count()}
Pairs meeting volume inclusion criteria: {len(volume_inclusion_criteria_pairs)}
Signals created: {signal_count}
Total equity: {portfolio.get_total_equity():,.2f} USD
Total equity: {portfolio.calculate_total_equity():,.2f} USD
Cash: {position_manager.get_current_cash():,.2f} USD
Investable equity: {alpha_model.investable_equity:,.2f} USD
Accepted investable equity: {alpha_model.accepted_investable_equity:,.2f} USD
Expand Down
2 changes: 1 addition & 1 deletion strategies/test_only/pancake-momentum-weekly.py
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,7 @@ def decide_trades(
# Calculate how much dollar value we want each individual position to be on this strategy cycle,
# based on our total available equity
portfolio = position_manager.get_current_portfolio()
portfolio_target_value = portfolio.get_total_equity() * value_allocated_to_positions
portfolio_target_value = portfolio.calculate_total_equity() * value_allocated_to_positions
alpha_model.calculate_target_positions(position_manager, portfolio_target_value)

# Shift portfolio from current positions to target positions
Expand Down
2 changes: 1 addition & 1 deletion strategies/test_only/pancakeswap_v2_main_loop.py
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ def __call__(self, ts: pd.Timestamp, universe: Universe, state: State, debug_det
# but we also have a minimum liquidity floor related to our portfolio size.
# With high value portfolio, we will no longer invest in tokens with less liquidity.
# TODO: Fix QSTrader to pass this information directly.
portflio_value = state.portfolio.get_total_equity()
portflio_value = state.portfolio.calculate_total_equity()
liquidity_threshold = max(min_liquidity_threshold, portflio_value * portfolio_base_liquidity_threshold)

# Expose how many candles we evaluated to the testing
Expand Down
Loading

0 comments on commit 96b4531

Please sign in to comment.