3. 量化分析工具:Python环境搭建、Pandas基础、NumPy基础、Matplotlib可视化入门
说实话,很多做艺术品拍卖的朋友一听到「编程」两个字就头大。我完全理解。当年我刚开始用Python处理拍卖数据时,也踩了不少坑。但后来我发现,只要把环境搭好,把几个核心库用熟,量化分析其实没那么玄乎。
这一章,我就带你把这套工具链捋一遍。咱们不搞花架子,直接上干货。
3.1 Python环境搭建:别让环境问题卡住你
我个人习惯用Anaconda来管理Python环境。为什么?因为它把Python解释器、常用的科学计算库都打包好了,省得你一个个去装。
装好之后,打开终端(Windows用户用Anaconda Prompt),输入:
python --version
如果看到类似 Python 3.9.x 的输出,说明环境搭好了。
conda create -n auction python=3.9 创建一个独立环境,所有拍卖相关的库都装在这个环境里,干净又清爽。
接下来,安装我们需要的三大件:
conda install pandas numpy matplotlib
嗯,就这么简单。等进度条跑完,你的量化分析工具箱就准备好了。
3.2 Pandas基础:处理拍卖数据的瑞士军刀
Pandas是我在拍卖数据分析中使用频率最高的库。说白了,它就是Excel的Python版,但比Excel灵活得多。
先看一个最简单的例子——读取拍卖记录:
import pandas as pd
# 读取CSV格式的拍卖数据
df = pd.read_csv('auction_records.csv')
# 看看前5行长什么样
print(df.head())
你会看到类似这样的输出:
| 拍品编号 | 艺术家 | 作品名称 | 成交价(USD) | 拍卖日期 |
|---|---|---|---|---|
| 001 | 齐白石 | 虾趣图 | 1200000 | 2023-05-12 |
| 002 | 毕加索 | 梦 | 8500000 | 2023-06-08 |
我刚开始用Pandas时,最常用的操作就是筛选和分组。比如,我想看看某位艺术家的所有成交记录:
# 筛选齐白石的作品
qi_baishi = df[df['艺术家'] == '齐白石']
print(qi_baishi)
再比如,我想按艺术家分组,计算每个人的平均成交价:
# 按艺术家分组,计算平均成交价
avg_price = df.groupby('艺术家')['成交价(USD)'].mean()
print(avg_price)
df[条件] 来筛选行,用 df.groupby() 来分组聚合。这两个操作能解决80%的数据处理需求。
3.3 NumPy基础:数值计算的发动机
NumPy是Pandas的底层引擎。你想想看,Pandas里那些快速的计算,背后都是NumPy在干活。
在拍卖分析中,我经常用NumPy做两件事:一是生成模拟数据,二是做统计计算。
比如,我想模拟1000次拍卖的成交价,假设它们服从正态分布:
import numpy as np
# 生成1000个模拟成交价,均值500万,标准差200万
simulated_prices = np.random.normal(loc=5000000, scale=2000000, size=1000)
# 计算统计指标
mean_price = np.mean(simulated_prices)
median_price = np.median(simulated_prices)
std_price = np.std(simulated_prices)
print(f"均值: {mean_price:.2f}")
print(f"中位数: {median_price:.2f}")
print(f"标准差: {std_price:.2f}")
为什么会这样?因为真实拍卖数据往往不完整,有时候我们需要用模拟数据来测试分析模型。NumPy的随机数生成功能在这方面特别好用。
np.random.seed(42) 来固定随机种子。这样每次运行生成的随机数都一样,方便调试和复现结果。
NumPy的数组运算也很快。比如,你想计算每件拍品的成交价相对于均值的偏离程度:
# 假设prices是一个NumPy数组
deviation = prices - np.mean(prices)
print(deviation)
这种向量化操作,比用for循环快几十倍。我在处理几万条拍卖记录时,这个性能差异特别明显。
3.4 Matplotlib可视化入门:一图胜千言
做拍卖分析,光有数字不够。你得把数据画出来,才能一眼看出趋势和异常。
Matplotlib是Python最经典的可视化库。我一般这样用:
import matplotlib.pyplot as plt
# 绘制成交价直方图
plt.hist(df['成交价(USD)'], bins=30, color='skyblue', edgecolor='black')
plt.title('拍卖成交价分布')
plt.xlabel('成交价 (USD)')
plt.ylabel('频次')
plt.show()
这张图能帮你快速判断:成交价是集中在某个区间,还是分散得很开?有没有异常的高价或低价?
再比如,我想看某位艺术家作品价格随时间的变化趋势:
# 假设数据已经按日期排序
plt.plot(df['拍卖日期'], df['成交价(USD)'], marker='o', linestyle='-', color='coral')
plt.title('齐白石作品成交价趋势')
plt.xlabel('拍卖日期')
plt.ylabel('成交价 (USD)')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
pd.to_datetime() 把日期列转成datetime类型。
下面这张SVG图,展示了本章三个工具之间的关系:
你看,整个流程很清晰:先搭好Python环境,然后用Pandas读取和处理数据,用NumPy做数值计算,最后用Matplotlib把结果画出来。每一步都有它的用处,缺一不可。
公众号:蓝海资料掘金营,微信deep3321