第三章:卫星图像因子构建
卫星图像,说白了就是给地球拍照片。但这不是普通的自拍,而是从几百公里高空往下看。我刚开始接触这个领域时,觉得挺科幻的。后来发现,这玩意儿其实已经非常成熟了。今天我就把卫星图像因子的构建流程,从头到尾捋一遍。
3.1 卫星数据获取渠道
先说说数据从哪来。卫星数据不是你想买就能买,也不是你想免费就能免费。这里有几个主流渠道:
| 渠道类型 | 代表数据源 | 分辨率 | 成本 | 适用场景 |
|---|---|---|---|---|
| 免费开源 | Sentinel-2 (ESA) | 10m | 免费 | 大面积农作物监测 |
| 免费开源 | Landsat 8/9 (USGS) | 30m | 免费 | 长期历史回测 |
| 商业付费 | Maxar / Planet | 0.3m - 3m | 高 | 车辆计数、船舶检测 |
| 商业付费 | Airbus / SPOT | 1.5m | 中高 | 港口活动监测 |
获取方式也很简单。Sentinel 数据可以从 Copernicus Open Access Hub 下载,用 Python 的 sentinelhub 库就能自动化拉取。Landsat 数据则通过 USGS EarthExplorer 获取。商业数据需要签合同,通常按平方公里计价。
3.2 图像识别与特征提取
拿到原始图像后,不能直接用。你得从里面提取出有用的特征。我主要做三类特征提取:车辆计数、船舶检测、农作物长势。
3.2.1 车辆计数
车辆计数,说白了就是数停车场里有多少辆车。这能反映什么?零售店的客流量、工厂的开工率、甚至某个区域的消费活跃度。
具体做法是这样的:
- 目标检测模型:用 YOLOv8 或 Faster R-CNN 训练一个车辆检测器。我习惯用 YOLOv8,速度快,精度也够用。
- 图像预处理:先做几何校正,把卫星图像对齐到地图坐标。然后做辐射校正,消除大气影响。
- 计数逻辑:检测出每辆车后,统计数量。注意要排除阴影和误检。
# 伪代码示例:车辆计数
from ultralytics import YOLO
model = YOLO('yolov8n.pt') # 加载预训练模型
results = model('parking_lot_satellite.jpg')
vehicle_count = 0
for box in results[0].boxes:
if box.cls in [2, 3, 5, 7]: # car, motorcycle, bus, truck
vehicle_count += 1
print(f"检测到 {vehicle_count} 辆车")
3.2.2 船舶检测
船舶检测的逻辑和车辆类似,但难点不一样。船在海面上,背景复杂,还有波浪和云层干扰。
我常用的方法是:
- SAR 图像:合成孔径雷达图像,不受云层影响。Sentinel-1 提供免费 SAR 数据。
- 变化检测:对比两期图像,找出新增或离开的船只。这能反映港口吞吐量的变化。
- AIS 数据辅助:船舶自动识别系统数据可以用来验证卫星检测结果。
举个例子。我做过一个港口活动指数:
# 船舶检测结果示例
port_activity = {
'date': '2024-03-15',
'total_ships': 47,
'cargo_ships': 23,
'container_ships': 12,
'tankers': 8,
'others': 4
}
这个指数和港口上市公司的营收有很强的相关性。你想想看,如果卫星图像显示港口里船越来越少,那这家公司的财报大概率不会好看。
3.2.3 农作物长势
农作物长势监测,用的是多光谱图像。不同波段的反射率能反映植物的健康状况。
核心指标是 NDVI(归一化植被指数):
NDVI = (NIR - Red) / (NIR + Red)
其中 NIR 是近红外波段,Red 是红波段。NDVI 值越高,说明植被越茂盛。
我一般这样用:
- 下载 Sentinel-2 的 L2A 产品(已经做过大气校正)
- 计算每个像素的 NDVI
- 按地块聚合,得到每个农田的平均 NDVI
- 对比历史同期,计算偏离度
3.3 因子合成与回测框架
特征提取完了,接下来就是合成因子。这一步很关键,因为单个特征往往不够稳定。
我常用的合成方法:
- 标准化加权:把车辆计数、船舶数量、NDVI 都标准化到 Z-score,然后按权重相加。
- 主成分分析:用 PCA 提取第一主成分,作为综合因子。
- 机器学习融合:用 LightGBM 或 XGBoost 训练一个模型,把多个特征作为输入,预测未来收益率。
回测框架我推荐用 backtrader 或 zipline。但要注意,卫星数据的频率很低(几天到几周),所以回测周期要拉长,至少 3 年以上。
# 回测框架伪代码
class SatelliteFactorStrategy(bt.Strategy):
def __init__(self):
self.factor = self.datas[0].factor # 卫星因子数据
def next(self):
if self.factor[0] > self.factor[-1]:
self.buy()
else:
self.sell()
知识体系总览
下面这张图,是我自己整理的卫星图像因子构建流程。你可以把它当作路线图:
嗯,以上就是卫星图像因子构建的完整流程。从数据获取到特征提取,再到因子合成和回测,每一步都有坑。但只要你把流程跑通了,这个因子的信息优势是很大的——毕竟,不是谁都能从太空看到你的持仓。