Project Record
NFT Rarity Value Scoring
Interpretable NFT marketplace screener combining trait rarity, listing prices, trait floors, and liquidity confidence.
Executive Summary
NFT marketplaces are noisy. Prices often reflect visibility, hype, and thin order books as much as the underlying attributes of the asset. I explored this problem by collecting OpenSea-style collection metadata, extracting trait tables, joining listed prices, and comparing token rarity against collection and trait-level floors.
The resulting case study is a cleaner version of that prototype: an interpretable scoring model for screening NFTs by rarity-adjusted value. The goal is not to automate buying decisions, but to rank candidates for review using transparent signals: how rare the traits are, how expensive the listing is relative to comparable assets, how deep the floor is, and how reliable the market evidence looks.
This demonstrates trait-level feature engineering, marketplace data normalization, information-content scoring, and decision-model design under sparse, noisy pricing data.
Problem
Raw rarity is not enough. A token can have uncommon traits but still be overpriced relative to similar listings; another can sit near the collection floor while carrying traits that rarely appear. NFT collections also have sparse listings, stale prices, and uneven trait premiums, so a useful screener needs to combine metadata and market depth rather than sort by rarity alone.
The practical question is: among currently listed assets, which tokens look attractive after adjusting for trait rarity, collection floor, trait-specific floors, and confidence in the available market data?
Prototype Baseline
The original exploration used OpenSea metadata and sale/listing data to build collection-level trait tables, scrape buy-now listing prices, and inspect floor-price ladders across traits. A simple baseline represented each NFT by the OpenSea trait_count values attached to its metadata:
where is the number of tokens in the collection sharing token ‘s trait value in slot . The baseline rarity rank was the Euclidean distance to the zero vector:
Smaller means the token’s trait counts are closer to zero across attributes, so the token is rarer under this count-vector view. This was useful for exploration, but it treats raw counts as the scoring unit and does not separate rarity from market price.
Model
A cleaner model starts with trait frequency. For attribute and trait value , define
where is the collection size and is the number of NFTs with that trait value.
Use information content as the trait rarity signal:
For NFT , with trait values , the weighted rarity score is
where down-weights noisy or low-signal trait categories. Convert this raw score into a percentile so it is easier to compare within a collection:
Price cheapness is measured against both the collection floor and relevant trait floors. If is the current listing price and is the collection floor, define
For the trait-floor comparison, let be a robust aggregate of the active floors for token ‘s traits:
The final value score combines rarity, price discount, trait-floor comparison, and liquidity confidence:
where is a confidence term based on listing depth, recent sale depth, and stale-price risk. Higher means the item is rarer and cheaper relative to comparable market evidence, subject to data-quality controls.
Implementation
The pipeline starts by building a collection trait table from token metadata. Each row is a token; each trait category becomes a structured column. From that table, the engine computes trait frequencies, information-content rarity, and percentile ranks for every asset in the collection.
Current listings are joined by token name or token id. The joined table supports collection-floor calculation, token-level price comparison, and trait-specific floor analytics. For each (attribute, trait) pair, the engine records the number of NFTs with that trait, number of active listings, the lowest listed prices, and the gap between the first few listings:
where is the cheapest active listing for the trait and is the fourth cheapest. This gives a simple estimate of floor depth: a trait with a low first listing but a steep ladder may be meaningfully different from a trait with many nearby listings.
Historical sale data adds market context. The prototype used z-score filtering to remove extreme sale-price outliers and rolling means over recent sales to smooth ETH and USD price trends. These signals feed the confidence term rather than the main rarity score, because thin NFT markets make overfitted price prediction unreliable.
The output is a ranked review queue. Each candidate includes the overall score plus a breakdown of rarity percentile, listing discount, trait-floor comparison, listing depth, and confidence. That decomposition matters: reviewers can see whether an item ranks highly because it is genuinely rare, simply cheap, or supported by a thin and fragile market signal.
Trade-offs
Trait floors are unstable when only a few items are listed. Rare traits are also not automatically desirable traits; the model measures statistical scarcity, not taste. Marketplace data can be incomplete, stale, or distorted by temporary listing behavior.
The score is therefore a screening layer, not an execution engine. It is best used to prioritize human review: find assets whose rarity and price relationship looks unusual, then inspect the collection context, visual appeal, owner behavior, and recent market activity before making any decision.