• Welcome to AppraisersForum.com, the premier online  community for the discussion of real estate appraisal. Register a free account to be able to post and unlock additional forums and features.

Weighted Average for Reconciliation of Sales Approach.

Weighted average based on comps that are more similar as a "percentage" may not be the most accurate of conclusions. What if you have the smallest (or largest) house sold in the subdivision in the past year, but can only bracket it by using sales outside the subdivision? The most similar sales are more likely to have larger adjustments. What if you have a pool or workshop and you have to go distances for these features for bracketing purposes, but the most similar sales have more adjustments. What if all the sales in the subdivision have a pool or workshop and your sale does not? What if the most similar sale with regard to quality and/or condition is a much smaller or larger home? You should weight comparable sales based on the most similar sales not the least amount of adjustments.
I find that for a "typical" suburban home. The weighted average function in my software is usually pretty close . But when it comes to properties with unique features or rural properties. Not so much
 
Because basing your opinion value on something reasonably thought it is better than putting a randomly chosen number in there. The weighted average give more weight to comps that are more similar (as a percentage) and less to those that aren't. Then it spits out a number, et voila. A logically thought out final reconciliation.
Nobody logically thought it out; it is not reasonably thought out; it was a shortcut to let the software do it. rote auto fill. If an appraiser does that, they need to disclose it. It is the kind of thinking that leads users and lenders to conclude they do not need an appraiser since anyone can click on software, and the computer reconciles. The computer did it . nd

Those of us who base our relocation on market-driven factors such as which comps are the most similar to the subject, which might share a key high-value feature, feater, in addition, to, which ones needed fewer adjustments also into account sale date, market conditions, etc. We are not putting in a random number.


This profession is fast headed toward the dumpster if the choices people see are a random number, which they have no idea why they're selecting or, or let the software do. it is fine to run software as a second value check, but by relying on it, especially rote reliance - you are inviting your own imminent replacement.
 
So if I do it without software. Is that a more valid number
If you're reconciling to a comp(s) that have the most relevant features to that of the subject well....yeah.

The software can't analyze the differences and similarities like a human can. The weighted average may or may not be the correct value indication.

I know you know this....maybe that was a rhetorical question.
 
There will be a day when AI can think like an appraiser. It won't happening soon.
 
Just one more brick in the wall. If appraisers are simply using averages, weighted or not, it's one more argument for using computer generated numbers.
I see final opinion of value being 425,200, for example. That, to me, implies such a level of accuracy I wonder how well that could be defended. I always thought the computer figured it out and not the Appraiser.
Unfortunately, there seems to be a significant number of appraisers that don't understand the difference between accuracy and precision. I've seen appraisers report numbers that claim accuracy to the $1 level...based on comps' sales prices that are reported to the nearest $1,000. Pretty sad.
 
Do any of the SFREP users know if Appraise-It Pro has a Weighted Average feature for the sales approach reconciliation?
ACI and Alamode do.

I know this post is years old and I don't know if Appraise-It does it natively now, but I saw this post and thought it would be fun to try and get a script developed that will calculate a weighted average. The weights are based on gross/net adjustments (lower get more weight supposedly). No guarantees as to the accuracy and i'm no expert in the way this works but it appears to produce credible results in an addendum and the code looks legit. It also demonstrates the possibilities of being able to interact with appraisal software with such a generous and an open API.

Anway, here is the Lua script. Just copy and save it to notebook, save as Whatever.LUA so you can access it from Tools----->Script------>Whatever.
(I named mine Weighted Average.LUA).

-- Script Begin

-- Replace 'YourComparableType' with the actual comparable type you want to work with. (SaleComparables, ListingComparables, Rental Comparables)

local comparableType = 'SalesComparables'

-- Function to get the requested adjustment for a comparable
function GetAdjustment(compIndex, adjustmentName)
local adjustmentText = Pro.TextField(comparableType, compIndex, adjustmentName).Text
local adjustmentValue = tonumber(adjustmentText) or 0
return adjustmentValue
end

-- Function to calculate the weighted average of adjusted sale prices
function CalculateWeightedAverage()
local totalWeightedSalePrice = 0
local totalWeight = 0
local numComparables = Pro.GetCompCount(comparableType)
local lowestGrossAdjustmentComp, lowestNetAdjustmentComp
local lowestGrossAdjustment = math.huge
local lowestNetAdjustment = math.huge

-- Details for all comparables
local allComparablesDetails = {}

for i = 1, numComparables do
local grossAdjustment = GetAdjustment(i, "GrossAdjustmentPercentage")
local netAdjustment = GetAdjustment(i, "NetAdjustmentPercentage")
local adjustedSalePrice = GetAdjustment(i, "AdjustedSalePriceAmount")

-- Find comparables with the lowest gross and net adjustments
if grossAdjustment < lowestGrossAdjustment then
lowestGrossAdjustment = grossAdjustment
lowestGrossAdjustmentComp = i
end

if netAdjustment < lowestNetAdjustment then
lowestNetAdjustment = netAdjustment
lowestNetAdjustmentComp = i
end

-- Calculate the weight for the comparable
local weight = 1 / (grossAdjustment + netAdjustment + 1) -- Adding 1 to avoid division by zero

-- Accumulate the total weighted sale price
totalWeightedSalePrice = totalWeightedSalePrice + (adjustedSalePrice * weight)
totalWeight = totalWeight + weight

-- Store details for all comparables
table.insert(allComparablesDetails, {
ComparableIndex = i,
GrossAdjustment = grossAdjustment,
NetAdjustment = netAdjustment,
AdjustedSalePrice = adjustedSalePrice,
Weight = weight
})
end

-- Calculate the weighted average
local weightedAverage = totalWeightedSalePrice / totalWeight

return weightedAverage, lowestGrossAdjustmentComp, lowestNetAdjustmentComp, allComparablesDetails
end

-- Temporary variable to store the combined text
local combinedText = ""

-- Function to add text to the addendum
function addToAddendum(text)
combinedText = combinedText .. text .. "\n"
end

-- Calculate the weighted average of adjusted sale prices
local weightedAverage, lowestGrossAdjustmentComp, lowestNetAdjustmentComp, allComparablesDetails = CalculateWeightedAverage()

-- Output the result to the addendum
addToAddendum(string.format("Weighted Average Based on Gross/Net Adjustments of Comparable Adjusted Sale Prices: $%.2f", weightedAverage))
addToAddendum("\nSummary:")
addToAddendum(string.format("Comparable with lowest gross adjustment: Comparable #%d (Gross Adjustment: %.2f%%)", lowestGrossAdjustmentComp, GetAdjustment(lowestGrossAdjustmentComp, "GrossAdjustmentPercentage")))
addToAddendum(string.format("Comparable with lowest net adjustment: Comparable #%d (Net Adjustment: %.2f%%)", lowestNetAdjustmentComp, GetAdjustment(lowestNetAdjustmentComp, "NetAdjustmentPercentage")))

-- Add details for the comparables with the lowest adjustments
addToAddendum("\nDetails for Comparables with Lowest Adjustments:")
addToAddendum("--------------------------------------------------")

-- Comparable with lowest gross adjustment
addToAddendum(string.format("Comparable #%d:", lowestGrossAdjustmentComp))
addToAddendum(string.format("Gross Adjustment: %.2f%%", GetAdjustment(lowestGrossAdjustmentComp, "GrossAdjustmentPercentage")))
addToAddendum(string.format("Net Adjustment: %.2f%%", GetAdjustment(lowestGrossAdjustmentComp, "NetAdjustmentPercentage")))
addToAddendum(string.format("Adjusted Sale Price: $%.2f", GetAdjustment(lowestGrossAdjustmentComp, "AdjustedSalePriceAmount")))
addToAddendum("-------------------------------")

-- Comparable with lowest net adjustment
addToAddendum(string.format("Comparable #%d:", lowestNetAdjustmentComp))
addToAddendum(string.format("Gross Adjustment: %.2f%%", GetAdjustment(lowestNetAdjustmentComp, "GrossAdjustmentPercentage")))
addToAddendum(string.format("Net Adjustment: %.2f%%", GetAdjustment(lowestNetAdjustmentComp, "NetAdjustmentPercentage")))
addToAddendum(string.format("Adjusted Sale Price: $%.2f", GetAdjustment(lowestNetAdjustmentComp, "AdjustedSalePriceAmount")))
addToAddendum("-------------------------------")

-- Add details for all comparables
addToAddendum("\nDetails for All Comparables:")
addToAddendum("--------------------------------------------------")

for _, comparableDetails in ipairs(allComparablesDetails) do
addToAddendum(string.format("Comparable #%d:", comparableDetails.ComparableIndex))
addToAddendum(string.format("Gross Adjustment: %.2f%%", comparableDetails.GrossAdjustment))
addToAddendum(string.format("Net Adjustment: %.2f%%", comparableDetails.NetAdjustment))
addToAddendum(string.format("Adjusted Sale Price: $%.2f", comparableDetails.AdjustedSalePrice))
addToAddendum(string.format("Weight: %.4f", comparableDetails.Weight))
addToAddendum("-------------------------------")
end

-- Write the combined text to a temporary file
local filePath = os.tmpname()
local file = io.open(filePath, 'w')
file:write(combinedText)
file:close()

-- Add the file contents to a word processing addendum
local useFormWithHeader = true
Pro.InsertWordProcessingDocument(useFormWithHeader, filePath)

-- Delete the temporary file
os.remove(filePath)
 
Oh, yea, forgot to mention. You have to drag the .lua file into your \Documents\My Appraise-It\Data\Scripts folder in order to see it in the menu of the Appraise-It report window.
 
Find a Real Estate Appraiser - Enter Zip Code

Copyright © 2000-, AppraisersForum.com, All Rights Reserved
AppraisersForum.com is proudly hosted by the folks at
AppraiserSites.com
Back
Top