A Python command-line tool that evaluates whether a real estate investment is financially rational by comparing its inflation-adjusted real value against its asking price and the opportunity cost of an alternative bank investment.
This tool helps you answer a simple but critical question:
Is the property worth what they're asking — in real, inflation-adjusted terms?
It does so in four steps:
- Calculates the net rental income after tax
- Discounts all future cash flows back to today's real value using the Fisher-adjusted rate
- Computes the opportunity cost of putting that money in a bank instead
- Outputs a clear LOGICAL / ILLOGICAL verdict on the investment
| Parameter | Description |
|---|---|
| Current asking price | The price the property is listed at today |
| Holding period (years) | How long you plan to keep the property |
| Target future sale price | The price you expect to sell for at the end |
| Monthly rental income | Expected monthly rent |
| Nominal discount rate (%) | Your required rate of return / bank interest rate |
| Inflation rate (%) | Expected average annual inflation |
| Rental tax rate (%) | Tax on rental income (only if rent > 450 exemption threshold) |
Converts the nominal interest rate into a real rate that accounts for inflation:
Where i is the annual inflation rate.
Annual Rent = Monthly Rent × 12
Rent Tax = Annual Rent × (tax_rate / 100)
K_net = Annual Rent − Rent Tax
If monthly rent is below the
TAX_EXEMPTION_THRESHOLD(450), tax rate is automatically set to 0%.
This is the main formula of the model. It computes the inflation-adjusted present value of all future cash flows:
Where:
n= holding period in yearsK_net= net annual rental income (after tax)FV_sale= target future sale pricer_real= real discount rate (from Fisher equation)
The first term is an annuity series — each year's rent is discounted separately and summed. The second term discounts the lump-sum sale price back to today.
What would happen if you invested the same amount in a bank instead?
IF asking_price ≤ V_real → ✅ LOGICAL (property is worth at least what they ask)
IF asking_price > V_real → ❌ ILLOGICAL (you're overpaying in real terms)
No external libraries required — pure Python standard library.
python valuation.pyFollow the prompts. All inputs are validated; entering a non-numeric value will prompt you to try again.
.
└── valuation.py # Main script (single file, no dependencies)
Why use the Fisher Equation? Nominal rates include inflation. If you discount future cash flows with a nominal rate, you're comparing inflated future dollars against today's prices — an unfair comparison. The Fisher equation strips out inflation so all values are expressed in the same real purchasing power.
Why discount each rent year separately? A sum received next year is worth more than the same sum received in 10 years. The annuity series (Σ) handles this by applying a progressively larger discount for each future year.
What is opportunity cost here? It's the theoretical return you give up by choosing real estate over a risk-free bank deposit. If the bank offers more, the property investment needs strong appreciation or rental yield to justify the risk.
One constant can be adjusted at the top of the script:
TAX_EXEMPTION_THRESHOLD = 450.0 # Monthly rent below this is tax-exempt