跳过正文
  1. 文章/

写一个艺术品估价算法:真正决定拍卖价格的是什么

· loading · loading ·
仁才德
作者
仁才德
居住在韩国首尔的领导者和软件工程师

过去几周我在做两个相关的项目。第一个是复现 2024 年 Scientific Reports 上 Lee 等人的论文 “Social signals predict contemporary art prices better than visual features, particularly in emerging markets”,它用 590 位在世艺术家的 34,200 条拍卖记录训练了一个 XGBoost 模型。第二个是搭建 Art Evaluator,一个 Django + Expo 平台,核心是一张连接艺术家、拥有者和拍卖记录的知识图谱。说白了,就是你想拿那种模型做点正经事时必须先铺好的数据管道。

两个项目最后绕回的都是同一个问题:一件艺术品能卖多少钱,真的可以预测吗?答案是可以,但靠看作品本身不行。管用的特征几乎全是社会性的。

为什么艺术品难估价
#

动手写代码之前,我花了几天读评估师和拍卖行到底怎么定价。要考虑的因素很多,而且大多没法干净地量化。来源——谁拥有过它、在哪展出过、被哪些图录收录。归属和真伪:经艺术家基金会确认的真品,比只是"传为某人所作"的作品贵好几个数量级。艺术家的声誉,由个展、双年展、博物馆收藏和批评界反响一点点垒起来。再加上品相和修复史、在艺术家作品体系里的稀缺程度,还有媒介——布面油画通常好过纸本,纸本又好过版画。被 MoMA、Tate 或卢浮宫收藏,等于盖上了一枚二级市场信得过的章。时机也算数:五年前的可比案例已经过时了。

苏富比的专家还会谈"情感价值":藏家的渴望、竞价大战的氛围、个人的共鸣。这种东西能把落槌价推到任何理性估算之外。你没法直接建模它,但可以借拍卖行的预估价间接捕到它的轮廓。

实务中占主导的估值方法是可比销售分析:找同一位艺术家相似作品的近期拍卖结果,再按差异调整。XGBoost 干的本质上就是这件事,只是规模大得多,用的特征也多到任何人类评估师都没法手工跟踪。

论文的核心论点
#

Lee 等人的论点很反直觉:作品的视觉内容几乎解释不了价格。他们只用视觉特征(颜色、构图、边缘密度、ResNet18 嵌入)的模型,R² 大约 0.055,比直接猜均值强不了多少。

而只用艺术家层面"社会性"特征(职业阶段、展览履历、过往拍卖价格、ArtFacts 排名)的模型能到 R² ≈ 0.73。再把拍卖行的预售估价加进特征,能升到 0.92。

换句话说,作品本身几乎无关紧要。要紧的是谁做的,以及市场对这个人已经说过什么。

论文的第二个论点是,这个差距在新兴市场还会进一步拉大。他们说的新兴市场,指美国、英国、法国、德国这四个既有核心之外的一切。在那些市场里,社会信号更管用,专家预估反而更不准,留给算法预测创造价值的空间也就更大。

复现论文
#

任务本身很直接:以单人开发的 MVP 复现这篇论文。不上生产,没有实时数据管道。忠实的重新实现、原型级的代码,加一份写清结论的报告。

数据
#

论文以补充材料的形式提供了清洗好的 CSV:

文件行数内容
Df_mloutfull.csv86,221原始数据集,500+ 列
df_for_ml_improved_up_to_2012.csv34,200主清洗数据集,1996–2012
df_for_ml_improved_old_market.csv29,853仅既有市场
df_for_ml_improved_new_market.csv4,346仅新兴市场
transactions.csv114,283含图片链接的原始拍卖记录

全部加起来大约 5 GB,轻松塞进内存。这个规模的数据集,XGBoost 在笔记本 CPU 上五分钟内就能训练完,核心模型根本不需要 GPU。这个体量的表格数据,梯度提升树的训练成本约等于零——要是这几年一直泡在神经网络的世界里,这件事很容易忘。

特征
#

模型用 38 个特征,分三类。

关于艺术家(30 个):

  • 人口属性:年龄、性别、教育程度、是否名校。
  • 职业:ArtFacts 排名、个展、群展、双年展参与、获奖。
  • 收藏:个人和公共收藏数量。
  • 价格历史:艺术家最近 5 次和 10 次销售的均值、中位数、最高、最低。
  • 面积调整后的价格历史(每平方英寸价格)。
  • 地理:艺术家工作和居住地,编码为按国家的标志位。
  • 匹配标志:作品的题材是否与艺术家典型题材一致?销售国家是否一致?

关于市场(8 个):

  • 拍卖行等级(1–4)。
  • 当年该国家/地区的价格水平(最低、平均、中位、最高)。

关于作品本身(非视觉):

  • 宽度、高度、平方英寸面积。
  • 媒介类别(绘画、版画、摄影、雕塑、其他)。

注意这份清单里缺了什么:任何关于作品实际视觉内容的信息。那部分只在单独的消融实验里出现。

训练/测试拆分
#

按时间拆,不是随机拆。2011 年 5 月之前的全部进训练集(约 80%,约 27,360 条),之后的进测试集(约 20%,约 6,840 条)。随机拆分会通过艺术家的价格历史特征泄漏未来信息:把同一位艺术家的记录随机撒在训练集和测试集里,测试集的行就已经通过滚动窗口"看过"彼此的价格,R² 会被人为抬高。

这种事看穿了觉得理所当然,第一次搭的时候却很容易漏掉。

模型
#

XGBoost 回归,预测 log10(price_usd)。在留出的验证切片上搜索 max_depthlearning_rate。两个模型变体:

  1. 不用专家预估。 目标 R² ≈ 0.73。
  2. 使用专家预估。 目标 R² ≈ 0.92。

“使用预估"的变体把拍卖行预售的低估和高估作为额外特征。这两个数字单独拿出来用,就能达到 R² ≈ 0.90。社会特征叠上去再多 0.02。绝对值不大,但这 0.02 才是模型在专家已知信息之外真正做出的预测贡献。

我瞄准的目标
#

我没打算超过论文。目标是在所有条件下把 R² 控制在他们数值的 ±0.03 之内。头条数字(仅元数据约 0.73,加预估约 0.92)的可复现性应该不错:XGBoost 固定种子后是确定性的,特征定义也清楚。我预计会漂移的地方有两处:视觉特征消融,PCA 维数或图像预处理的小差异都会让结果晃动;还有新兴市场那一刀,只有 4,346 条记录,噪声下限本来就高。

为什么视觉特征几乎没用
#

这是我觉得最有意思的结果。论文的视觉流水线为每张图片提取 8,971 个数字:

  • GIST 描述子(960 维):整体空间布局。
  • 方向梯度直方图(HOG)(2,915 维):边缘结构。
  • 颜色直方图(4,096 维):调色板分解。
  • ResNet18 特征(1,000 维):高层级预训练嵌入。
  • 色彩饱和度(1 维):鲜艳度标量。
  • 复杂度(1 维):边缘密度标量。

全部用 PCA 压缩后喂给 XGBoost,得到 R² ≈ 0.055。只用颜色是 0.056,边缘结构 0.029,神经网络嵌入 0.009,基本等于零。

干净利落的解释是:拍卖价格是在艺术家层面、而不是单件作品层面定下来的。同一位艺术家的两幅画,不管画布上是什么,都会卖出相近的价钱,因为被定价的是签名。

读过拍卖图录注释的人会立刻明白这为什么成立。那些文字几乎全花在来源、展览史和可比销售上,对作品本身几乎不着一笔。

如果认真对待这个 5%,结论就是作品的美学内容和它的市场价值几乎脱钩。市场在奖励的东西,不管是什么,都不在画布上。一个能在像素层面理解艺术的模型,预测价格反而会输给一个只认识艺术家简历的模型。

Phase 3 是有条件的
#

论文的图片链接列指向的是 2012 年还有效的 URL,到 2026 年大多已经死了。我写的计划在第 8 天就安排了这项风险检查:随机抽 100 个 URL,看有几个还活着。要是一半以上都没了,视觉阶段整个跳过,把原因写进报告。

反正视觉特征只解释约 5% 的价格方差。为了确认一个这么小的数字,去和链接腐烂搏斗两个星期,划不来。把死链的调查结果写进报告,继续往前走,才是正解。

既有市场 vs 新兴市场
#

论文为既有市场(美国、英国、法国、德国)和新兴市场(其余 19 个国家)分别训练模型。核心结果:

特征集既有市场 R²新兴市场 R²
仅视觉0.0530.056
元数据(社会信号)0.6670.750
元数据 + 预估0.9160.859

有两点跳出来。第一,社会信号在新兴市场更管用,而不是更不管用。我原以为既有市场数据更厚,社会特征的表现应该更好,结果正好相反。

第二,新兴市场的专家预估更不准——加入预估后的 0.916 对 0.859,差距就在这。在既有市场,算法预测得和背靠几十年可比数据的苏富比专家硬碰硬;在新兴市场,那位专家手里的数据薄得多,算法能补的缺口也就大得多。

真要把这种模型拿去商业化,能赚回饭钱的地方是新兴市场。

该说清楚的局限
#

这是论文复现,不是生产系统。它没有实时数据管道,模型用 1996–2012 的拍卖数据训练完就再也不更新了。没有部署,产出是 notebooks 和一份报告,不是预测 API。没有漂移检测,训练完的模型不知道市场什么时候变了。数据集是冻结的:加密艺术、NFT、新冠之后的市场变化,在训练数据里根本不存在。要是想预测 K Auction 或首尔拍卖的价格,还需要拍卖行专属特征,可能还得给韩国市场单独训一个模型——这些都没做。

模型反映的也只是历史模式。如果当代艺术市场在 2015 年前后发生过结构性变化(确实有人这么论证:艺博会崛起为一级市场的主要场地,新一代藏家入场),那 1996–2012 的规律未必还能外推。

从论文到平台
#

读完论文,我看第二个项目的眼光变了。Art Evaluator 最初的定位是艺术展览的众筹市场:艺术家提前为即将举办的展览锁定资金,投资者则比拍卖市场通常允许的时点更早接触到新兴艺术家。

产品表层刻意做得简单。艺术家发布需要资金的展览(场地、日期、预计参展作品)。投资者按分级金额($100、$500、$1k、$5k)支持特定展览,作品售出后分享收益。艺术家和投资者之间的大部分聊天由 AI agent 接手,双方都不必在线,对话也不会断。韩国画廊隔着 14 个小时时差和美国藏家谈事情的时候,这一点格外有用。

一旦"资产是艺术家而不是作品"这件事沉淀下来,数据模型也得跟着改。要抓住的是:每件作品被谁拥有过、在哪展出过、可比作品卖了多少钱、还有谁也收藏这位艺术家。所有权链条、机构认可、拍卖可比案例、藏家网络——这正是知识图谱的用武之地。

Django 后端(apps/artworks/models.py)建模四个基本类型:

  • Artist:创作作品的人。
  • AuctionRecord:带价格、日期、拍卖行的历史销售记录。
  • OwnershipRecord:谁在哪段时间持有了什么。
  • ScrapeLog:数据本身的来源记录,每条记录从哪来都可以审计。

移动端(Expo + React Native + @shopify/react-native-skia)把这一切渲染成一张力导向图。useGraphData 请求 Django 的 /api/graph/ 端点,useForceLayout 每个 tick 在 JS 里跑一遍 d3-force 仿真,GraphCanvas 再用 Skia 把结果画出来。时间范围滑块可以在年份间拖动,看着网络一点点长出来:哪些藏家什么时候入场,哪些艺术家被哪家博物馆相中,哪些作品在 2008 年低谷期换了主人。

每种节点有自己的形状和颜色:

节点类型形状颜色
艺术家菱形红色
作品圆角矩形蓝色
收藏者绿色
经销商橙色
博物馆紫色
遗产管理蓝绿
拍卖行六边形灰色

形状不是装饰。缩小到几百个节点的时候,不用等标签渲染,光看轮廓就知道那是什么实体。被一圈圆围住的菱形,是一位有藏家网络的艺术家;连着一堆菱形的六边形,是一家代理多位艺术家的拍卖行。市场的结构一眼就能读出来。

第二个标签页把同样的数据放到 vis-timeline 时间轴上:持有期是水平条,销售是点事件。同一张图,换个镜头。想看的是"谁在什么时候持有了什么"的先后顺序、而不是某一时刻的网络形状时,就用它。

Art Evaluator 本身不是价格预测工具,它是垫在预测工具下面的数据层。想给 Lee 等人那样的模型喂上鲜活的当前数据、而不是冻结在 2012 年的 CSV,需要的就是这套结构。

把估价做成一个游戏
#

我还没动手做、却最感兴趣的部分,是把艺术品估价变成游戏。

Lee 等人的论文把拍卖行预售估价当特征用,R² 因此大涨。那些预估之所以值钱,是因为它们是受过训练的专家的聚合判断——这些人看过成千上万件可比作品,而且对结果有切身利害。但拍卖行专家是一种又窄又贵的资源:全球就几百位,只做具体的委托案,够不着那条还没人委托的艺术家长尾。

我反复回到的问题是:能不能从一个更宽、更便宜的判断池里,合成出一个可比的信号?

粗略的设计:

  • 给用户看一件作品:图片、尺寸、年份、艺术家名字、简短履历。
  • 问他们这件作品拍卖会卖多少钱。
  • 让他们选一个价格区间,或者直接猜落槌价。
  • 提交之后揭晓真实成交价。
  • 用类似 Brier 分数的方式,随时间给他们打准确度评级。
  • 提供排行榜、每日连胜、手感火热徽章。
  • 用历史准确度给每位用户未来的预测加权。

本质上这是一个艺术品价格的预测市场,套着猜价游戏的壳。循环和 Geoguessr 或 chess.com 的谜题评分一样:可重复、可打分、有反馈,能练出真本事。猜得准的人在排行榜上爬升,他们未来的猜测在聚合信号里的权重也更大。

真正的价值在模型那一侧。这些猜测的加权聚合,可以和社会信号并排喂给 XGBoost。如果群体的准确度加权中位数和落槌价相关性够好,你就为那些没有真实预估的作品造出了近似的"合成拍卖行预估”。而这恰恰补在 Lee 等人的模型最缺帮助的位置——艺术家长尾。

冷启动的角度也说得通。模型在价格历史丰厚的艺术家身上训练得很好,在只有三笔销售的艺术家身上一塌糊涂。三笔销售加一千个群体猜测,至少有东西可用了。众包估价,就是在给底层数据覆盖不到的情形制造训练信号。

游戏化在这里之所以关键,是因为让群体可靠的唯一办法,是把参与做得足够好玩,让人反复来玩。一次性的问卷只能从随手点过的人那里收到噪声。每日连胜加排行榜加校准徽章,能让同一个人在一年里认认真真做出 500 次预测。数量,再加上自我筛选(猜得准的留下来,猜不准的觉得无聊走人),才是把噪声变成信号的方式。

动手之前还有几个设计问题要想清楚。给用户看多少东西——只有图片和履历,还是连可比销售也给?上下文越多猜测越有依据,但过了某个点,用户就只是在复读你已经展示的内容。价格反馈给到什么粒度?揭示精确落槌价、一个区间,还是只告诉他们有没有落在 ±20% 之内?太精细会训练出锚定具体数字的用户,太模糊又没法校准。还有刷榜问题:玩家会扎堆猜自己认识的艺术家,猜 Banksy 基本是常识题而不是技能题。解法大概是像 Duolingo 选课那样强制随机抽样,再给隐去艺术家姓名的"盲猜"轮单设一个榜。最后是事后偏见,躲不掉——用户一旦知道某件 Basquiat 卖了 1.1 亿美元,就再也无法当作不知道。让这个循环保持诚实的,是源源不断的新作品供给,而这种供给每周是有限的。

游戏化的框架还把平台的两半拧在了一起。众筹一侧奖励的是展览财务表现好时的投资者;猜价一侧奖励任何会准确叫价的人,不管掏没掏钱。两者是同一个想法的两种形态:把群体的集体判断变成可交易的信号——一个交易资本,一个交易注意力。真正练出准头的玩家,最终可以带着可验证的叫价准确度记录,“毕业"到投资者那一侧。这个过滤器,比"认识对的画廊主"强多了。

我带走的几件事
#

预售估价非常厉害。拍卖行常因定价不透明挨骂,但他们的预估单凭自己就能捕捉接近 90% 的价格方差。专家在做什么且不论,做得是真好。可与此同时,作品本身在统计上几乎无关紧要——如果你是出于审美喜欢艺术,这个结论并不好受。市场定价的不是你眼睛看到的东西,而是别人已经为相邻作品掏过的钱。

建模层面,有两个习惯物有所值。按时间拆分是评估价格模型唯一诚实的方式,随机拆分给出的漂亮 R² 到了真实生产环境就露馅。梯度提升树在这里依然是正确的工具:论文里 XGBoost 赢了所有神经网络基线,这种规模、这种工程化程度的表格数据,没有理由去够 transformer。

商业上的观察也有两条。有意思的机会在新兴市场,那里专家定价最薄,算法预测能补的缺口最大。以及,群体是一个被低估的数据来源。Lee 等人模型里最大的单一特征就是拍卖行预估;如果校准过的群体能为艺术家长尾产出可比的信号,那是实打实的机会——既是模型输入,本身也能是个产品。

两个项目最后比我计划的更互补。论文复现教会我什么在预测价格,平台工作教会我要用上这些知识需要什么样的数据结构,游戏化的想法则把两头接起来:知识图谱供给作品和历史销售,猜价游戏产出群体推导的预估特征,模型把这个特征和社会信号一起消化,为那些原本对它不可见的艺术家给出预测。

这些都还没做完。论文复现是一个附带书面报告、能跑的原型;平台是一个填了种子数据的演示;众包猜价游戏眼下只存在于你刚读完的这份设计笔记里。但贯穿其中的想法足够一致,正确的形状在我看来已经相当清楚:给艺术家定价,而不是给作品定价;聚合群体,而不是只依赖专家;把估价当成市场共同产出的东西,而不是专家自上而下交下来的结论。

有时间的话,下一个要做的就是这个版本。