一、实际应用场景描述
在时尚产业与品牌创新课程中,"奢侈品保值性"是二手市场模块的核心议题。
典型教学/实践场景包括:
- 课程作业:学生需要分析不同品牌、不同年份款式的二手流通溢价规律
- 品牌资产管理:对比"经典款"与"季节款"在二手市场的生命周期差异
- 消费者教育:帮助消费者理解"哪些因素真正影响保值率"
- 投资分析入门:以奢侈品为案例,讲解"贬值曲线"与"稀缺性溢价"
本工具尝试构建一个结构化、可审计的保值率计算模型,输入品牌、款式、购买年份,输出当前流通溢价估算值,用于课堂讨论与二手市场认知教学。
二、引入痛点(中立表述)
- 数据来源碎片化:不同平台(Vestiaire、StockX、闲鱼、The RealReal)价格差异大
- 保值率定义混乱:有人看"原价 vs 二手价",有人看"峰值 vs 当前",口径不一
- 品牌/款式粒度缺失:笼统说"Hermès 保值"掩盖了款式间巨大差异
- 教学缺乏可运行原型:学生需要一个干净代码骨架,理解"二手溢价"的变量结构
- 算法黑盒化:直接给出"保值率 87%"却不展示计算过程,无法教学审计
本工具不提供实时市场数据,而是回答:
"在给定假设数据下,如何结构化计算二手流通溢价?"
三、核心逻辑讲解
1. 保值率的核心公式
流通溢价 = 当前二手均价 − 当年购买原价
保值率 = 当前二手均价 / 当年购买原价 × 100%
当保值率 > 100% 时为"溢价",< 100% 时为"贬值"。
2. 影响保值率的关键变量(教学模型)
变量 影响方向 说明
品牌溢价系数 + 核心品牌(如 Hermès、Chanel)基础系数更高
款式类型 +/− 经典款 > 季节款 > 联名款(生命周期差异)
购买年份 − 持有时间越长,贬值越多(但有地板效应)
稀缺性 + 限量款、停产款有稀缺溢价
成色 − 磨损、老化显著降低价值
市场热度 +/− 某品牌某时期可能突然流行或遇冷
3. 贬值曲线模型(教学简化)
采用指数衰减 + 地板值模型:
当前价值 = 原价 × (品牌系数 + 款式系数)
× e^(−年数 × 衰减率)
× 稀缺性乘数
× 成色系数
× 市场热度系数
地板值:某些经典款不会低于原价的某个比例(如 60%)。
4. 关键假设(必须显式声明)
- 品牌/款式系数来自公开二手市场研究报告的教学整理
- 未接入实时交易数据,使用假设参数
- 不同平台价格差异可达 20–40%,本工具取"教学中位值"
- 输出为估算参考值,不可作为买卖决策依据
四、代码模块化(注释清晰)
目录结构:
luxury_resale_calc/
├── models.py # 数据结构与品牌/款式数据库
├── depreciation.py # 贬值曲线计算
├── premium_calc.py # 流通溢价与保值率计算
├── formatter.py # 结果格式化输出
├── main.py # CLI 入口 + demo
└── README.md
"models.py"
"""
models.py
定义奢侈品保值率计算的数据结构与内置数据库。
所有品牌/款式系数均为教学示例,来源于公开研究报告整理。
"""
from dataclasses import dataclass
from typing import Dict, Optional
@dataclass
class ResaleInput:
brand: str # 品牌名(英文)
model: str # 款式名
purchase_year: int # 购买年份
purchase_price: float # 当年购买原价
condition: str = "excellent" # 成色:excellent/good/fair/poor
is_limited: bool = False # 是否限量款
platform: str = "median" # 平台:vestiaire/stockx/realreal/median
@dataclass
class BrandModelData:
"""品牌×款式的教学级系数数据"""
brand_multiplier: float # 品牌基础系数
model_type: str # classic / seasonal / collaboration
scarcity_factor: float # 稀缺性乘数
annual_decay_rate: float # 年衰减率
# 内置教学数据库(品牌 × 款式 → 系数)
# 数据来源:公开市场研究报告的教学整理,非实时交易数据
BRAND_MODEL_DB: Dict[str, Dict[str, BrandModelData]] = {
"hermes": {
"birkin": BrandModelData(
brand_multiplier=1.35, model_type="classic",
scarcity_factor=1.25, annual_decay_rate=0.02,
),
"kelly": BrandModelData(
brand_multiplier=1.20, model_type="classic",
scarcity_factor=1.15, annual_decay_rate=0.03,
),
"evelyne": BrandModelData(
brand_multiplier=0.85, model_type="seasonal",
scarcity_factor=1.00, annual_decay_rate=0.08,
),
},
"chanel": {
"classic_flap": BrandModelData(
brand_multiplier=1.15, model_type="classic",
scarcity_factor=1.10, annual_decay_rate=0.04,
),
"boy_bag": BrandModelData(
brand_multiplier=0.90, model_type="seasonal",
scarcity_factor=1.05, annual_decay_rate=0.07,
),
},
"louis_vuitton": {
"neverfull": BrandModelData(
brand_multiplier=0.80, model_type="classic",
scarcity_factor=1.00, annual_decay_rate=0.06,
),
"speedy": BrandModelData(
brand_multiplier=0.85, model_type="classic",
scarcity_factor=1.00, annual_decay_rate=0.06,
),
},
"gucci": {
"dionysus": BrandModelData(
brand_multiplier=0.70, model_type="seasonal",
scarcity_factor=1.00, annual_decay_rate=0.12,
),
},
}
# 款式类型修正系数
MODEL_TYPE_MULTIPLIER: Dict[str, float] = {
"classic": 1.10, # 经典款抗跌
"seasonal": 0.85, # 季节款贬值快
"collaboration": 0.75, # 联名款波动大
}
# 成色系数
CONDITION_MULTIPLIER: Dict[str, float] = {
"excellent": 1.00,
"good": 0.85,
"fair": 0.65,
"poor": 0.40,
}
# 市场热度系数(教学假设,可调整)
MARKET_HEAT: Dict[str, float] = {
"hermes": 1.08,
"chanel": 1.05,
"louis_vuitton": 0.98,
"gucci": 0.92,
"default": 1.00,
}
def lookup_model_data(brand: str, model: str) -> Optional[BrandModelData]:
"""查找品牌×款式数据,未找到返回 None"""
brand = brand.lower().strip()
model = model.lower().strip()
return BRAND_MODEL_DB.get(brand, {}).get(model)
def get_model_type(brand: str, model: str) -> str:
data = lookup_model_data(brand, model)
return data.model_type if data else "seasonal"
def get_market_heat(brand: str) -> float:
return MARKET_HEAT.get(brand.lower().strip(), MARKET_HEAT["default"])
"depreciation.py"
"""
depreciation.py
实现贬值曲线模型(指数衰减 + 地板值)。
"""
import math
from .models import (
lookup_model_data, MODEL_TYPE_MULTIPLIER,
CONDITION_MULTIPLIER, MARKET_HEAT
)
def calc_current_value(input_: "ResaleInput") -> float:
"""
基于指数衰减模型估算当前二手价值。
"""
data = lookup_model_data(input_.brand, input_.model)
if data is None:
# 未知款式:使用中性参数
data = _default_brand_data()
years_held = 2025 - input_.purchase_year # 假设当前为 2025 年
years_held = max(0, years_held)
# 1. 品牌 × 款式基础系数
base = data.brand_multiplier * MODEL_TYPE_MULTIPLIER.get(
data.model_type, 0.85
)
# 2. 指数衰减
decay = math.exp(-data.annual_decay_rate * years_held)
# 3. 稀缺性乘数
scarcity = data.scarcity_factor
if input_.is_limited:
scarcity *= 1.15
# 4. 成色系数
condition = CONDITION_MULTIPLIER.get(
input_.condition.lower(), 0.70
)
# 5. 市场热度
heat = MARKET_HEAT.get(input_.brand.lower().strip(), 1.00)
# 综合计算
current_value = input_.purchase_price * base * decay * scarcity * condition * heat
# 地板值:经典款不低于原价的 55%
floor = input_.purchase_price * 0.55 if data.model_type == "classic" else input_.purchase_price * 0.30
return max(floor, current_value)
def _default_brand_data():
"""未知款式的默认参数"""
from .models import BrandModelData
return BrandModelData(
brand_multiplier=0.75,
model_type="seasonal",
scarcity_factor=1.00,
annual_decay_rate=0.10,
)
"premium_calc.py"
"""
premium_calc.py
计算流通溢价与保值率。
"""
from .depreciation import calc_current_value
def calc_premium(input_: "ResaleInput") -> dict:
"""
计算二手流通溢价与保值率。
"""
current_value = calc_current_value(input_)
original_price = input_.purchase_price
premium = current_value - original_price
retention_rate = (current_value / original_price * 100) if original_price > 0 else 0
return {
"original_price": original_price,
"current_estimated_value": round(current_value, 2),
"premium": round(premium, 2),
"retention_rate_pct": round(retention_rate, 2),
"purchase_year": input_.purchase_year,
"years_held": 2025 - input_.purchase_year,
}
"formatter.py"
"""
formatter.py
格式化输出结果。
"""
def print_report(result: dict, brand: str, model: str) -> None:
print("\n" + "=" * 52)
print(f" 奢侈品二手保值率报告(教学演示)")
print(f"=" * 52)
print(f"\n 品牌: {brand.title()}")
print(f" 款式: {model.title()}")
print(f" 购买年份: {result['purchase_year']}")
print(f" 持有年数: {result['years_held']} 年")
print(f" 购买原价: ¥{result['original_price']:,.0f}")
print(f" 预估当前价值: ¥{result['current_estimated_value']:,.0f}")
premium = result['premium']
if premium >= 0:
print(f" 流通溢价: +¥{premium:,.0f} ✨")
else:
print(f" 流通贬值: −¥{abs(premium):,.0f}")
rate = result['retention_rate_pct']
print(f" 保值率: {rate:.1f}%")
if rate >= 100:
tier = "溢价级(投资级)"
elif rate >= 80:
tier = "强保值级"
elif rate >= 60:
tier = "一般保值级"
elif rate >= 40:
tier = "弱保值级"
else:
tier = "高折旧级"
print(f" 保值等级: {tier}")
print(f"\n{'=' * 52}")
print(" 说明:")
print(" - 本结果为参数化估算,非实时交易数据")
print(" - 不同平台价格差异可达 20–40%")
print(" - 实际交易需参考多个平台近期成交价")
print(" - 不构成任何买卖建议")
print(f"{'=' * 52}\n")
"main.py"
"""
main.py
CLI 入口,内置三组教学演示数据。
运行:python main.py
"""
from models import ResaleInput
from premium_calc import calc_premium
from formatter import print_report
def run_demo():
# 三组演示案例
cases = [
ResaleInput(
brand="hermes", model="birkin",
purchase_year=2018, purchase_price=85_000,
condition="excellent", is_limited=False,
),
ResaleInput(
brand="chanel", model="classic_flap",
purchase_year=2020, purchase_price=52_000,
condition="good", is_limited=False,
),
ResaleInput(
brand="gucci", model="dionysus",
purchase_year=2019, purchase_price=18_000,
condition="fair", is_limited=False,
),
]
for case in cases:
result = calc_premium(case)
print_report(result, case.brand, case.model)
if __name__ == "__main__":
run_demo()
五、README.md
# Luxury Resale Premium Calculator(教学演示)
一个轻量级 Python 工具,用于估算奢侈品手袋的二手流通溢价与保值率。
## 定位与边界
- 目的:将"保值率"从模糊概念转化为可审计的计算模型
- 非实时交易数据工具,不替代平台查价
- 数据来源:公开市场研究报告的教学整理
- 不同平台价格差异可达 20–40%,本工具取教学中位值
- **不构成任何买卖建议**
## 环境
- Python ≥ 3.8(仅标准库)
## 安装与运行
bash
git clone <repo-url>
cd luxury_resale_calc
python main.py
## 模块说明
| 文件 | 职责 |
|---|---|
| `models.py` | 数据结构、品牌×款式系数数据库、成色/热度系数 |
| `depreciation.py` | 指数衰减贬值曲线 + 地板值 |
| `premium_calc.py` | 流通溢价与保值率计算 |
| `formatter.py` | 终端格式化输出 |
| `main.py` | CLI 入口与演示案例 |
## 如何调整
### 添加新品牌/款式
在 `models.py` 的 `BRAND_MODEL_DB` 中添加:
python
"dior": {
"book_tote": BrandModelData(
brand_multiplier=0.75,
model_type="seasonal",
scarcity_factor=1.00,
annual_decay_rate=0.09,
),
}
### 修改当前年份
编辑 `depreciation.py` 中的 `2025` 为实际年份。
### 调整成色标准
修改 `models.py` 中的 `CONDITION_MULTIPLIER`。
## 保值等级参考
| 保值率 | 等级 | 说明 |
|---|---|---|
| ≥ 100% | 溢价级 | 市场价高于原价 |
| 80–99% | 强保值 | 贬值有限 |
| 60–79% | 一般保值 | 正常消费级 |
| 40–59% | 弱保值 | 明显贬值 |
| < 40% | 高折旧 | 接近残值 |
## 许可证
MIT(教学用途,自行承担使用风险)
六、核心知识点卡片(中立、去营销)
卡片 1 · 指数衰减模型(Exponential Decay)
- 公式:
"V(t) = V₀ × e^(−λt)"
- 应用场景:资产折旧、用户流失、药物代谢
- 教学要点:λ(衰减率)决定贬值速度,不同品类差异大
- Python 映射:
"math.exp()" + 参数化 λ
卡片 2 · 多因子乘法模型
- 核心思路:各因子作为乘数,而非加数
- 优势:某个因子为 0 时结果自然归零(符合直觉)
- 教学对比:加法模型 vs 乘法模型的结果差异
卡片 3 · 地板值(Floor Value)
- 概念:资产不会无限贬值,存在下限
- 奢侈品中:经典款地板 ≈ 原价 55%,季节款 ≈ 30%
- 工程实现:
"max(floor, computed_value)"
卡片 4 · 教学级数据库设计
- 用 Python dict 嵌套结构模拟关系型数据
- 键名标准化(
".lower().strip()")
- 未命中时的默认值处理(graceful degradation)
七、总结
这个程序的核心价值不在于"算出某包现在值多少钱",而在于三点:
1. 把"保值率"从玄学变成可拆解、可审计的计算模型
2. 展示如何用指数衰减 + 多因子乘法构建一个透明的贬值曲线
3. 为课程提供一个"从品牌知识到数学建模"的最小可运行原型
对全栈工程师而言,这是典型的领域模型 + 数学函数 + CLI 工具组合;对技术博主而言,重点应放在建模思路、参数选择逻辑、边界声明与教学延伸,而非提供"权威保值率"。
利用AI解决实际问题,如果你觉得这个工具好用,欢迎关注长安牧笛!