Rebalancing Triggers: When to Adjust Your Portfolio

I’ve been thinking about when to actually pull the trigger on rebalancing. There seem to be two main schools of thought:

  1. Calendar-based: Rebalance annually (or quarterly/monthly)
  2. Threshold-based: Rebalance when allocation drifts beyond a set percentage

My Current Setup

I target a 70/30 stocks/bonds allocation. I’ve been using a 5% absolute threshold—if stocks drift to 75% or bonds drift to 35%, I rebalance.

Tracking Drift in Beancount

Here’s my query to check current allocation vs target:

SELECT 
  root(account, 3) AS asset_class,
  sum(value(position)) AS current_value
WHERE account ~ 'Assets:Investments'
GROUP BY asset_class

Then I manually calculate the percentages and compare to targets.

The Research

Most studies suggest threshold-based with 5% bands captures most of the benefit while minimizing transaction costs. But calendar-based is simpler to implement and behaviorally easier to maintain.

My Questions

  1. What threshold do you use? 5%? 10%? Relative or absolute?
  2. How often do you check allocation (even if not rebalancing)?
  3. Does anyone have a Beancount query that calculates drift automatically?

Would love to build an automated alert system that tells me when rebalancing is needed.

I use a hybrid approach: check monthly, but only rebalance if drift exceeds 5%.

Why Hybrid Works

  • Calendar-only: You might rebalance when drift is only 1-2%, wasting transaction costs
  • Threshold-only: You might go years without checking, missing opportunities
  • Hybrid: Regular monitoring catches drift early, but you only act when meaningful

My Python Script for Drift Alerts

I run this monthly:

import subprocess
import json

# Run bean-query to get allocation
result = subprocess.run(
    ['bean-query', 'main.beancount', '-f', 'json',
     'SELECT root(account, 4) as class, sum(value(position)) as value '
     'WHERE account ~ "Assets:Investments"'],
    capture_output=True, text=True
)

# Parse and calculate percentages
data = json.loads(result.stdout)
total = sum(row['value'] for row in data)
for row in data:
    pct = row['value'] / total * 100
    # Alert if drift > 5%
    if abs(pct - target[row['class']]) > 5:
        print(f"ALERT: {row['class']} at {pct:.1f}%, target is {target[row['class']]}%")

Transaction Cost Consideration

Remember: every rebalance in a taxable account creates a taxable event. I only rebalance taxable accounts when:

  1. I’m also harvesting losses, OR
  2. Drift exceeds 10%

For tax-advantaged accounts, 5% threshold is fine.

From a CPA perspective, I want to highlight the relative vs absolute threshold distinction, which has tax implications.

Absolute vs Relative Thresholds

Absolute threshold (5%):

  • Target: 70% stocks
  • Rebalance if: stocks < 65% OR stocks > 75%

Relative threshold (20% of target):

  • Target: 70% stocks
  • Rebalance if: stocks < 56% OR stocks > 84%
  • This is 20% below or above 70%

Why It Matters

In a bull market, absolute thresholds trigger more often. If stocks grow from 70% to 75%, you’ll sell (taxable event).

Relative thresholds are more forgiving—you’d need stocks to hit 84% before selling.

My Recommendation

For taxable accounts: use relative thresholds of 20-25% to minimize tax events.

For tax-advantaged accounts: use absolute thresholds of 5% since there’s no tax cost.

Tracking Historical Drift

I record allocation snapshots monthly:

2026-02-01 custom "allocation-snapshot"
  stocks: 73.2%
  bonds: 26.8%
  drift-from-target: 3.2%

This lets me look back and see how often I would have rebalanced under different threshold rules.

I want to share my experience with cash flow rebalancing—using new contributions to rebalance rather than selling.

The Concept

Instead of selling winners to buy losers (triggering taxes), direct new money to underweight asset classes.

Example:

  • Target: 70% stocks / 30% bonds
  • Current: 75% stocks / 25% bonds
  • Instead of selling 5% stocks, direct next 3 months of contributions entirely to bonds

Beancount Implementation

I track which class needs contributions:

2026-02-15 * "Monthly investment - REBALANCING contribution"
  ; Normally split 70/30, but directing 100% to bonds this month
  Assets:Investments:Taxable:BND  5.2 BND {96.15 USD}
  Assets:Bank:Checking            -500.00 USD
  rebalancing-target: "bonds"

Limitations

Cash flow rebalancing works great when:

  • Contributions are large relative to portfolio
  • Drift is modest (under 10%)

It fails when:

  • Portfolio is large relative to contributions
  • Markets move fast (2020, 2022)

For large portfolios, you eventually need to sell. But for those of us in accumulation phase, this approach can defer taxes for years.