第三章:卫星图像因子构建

卫星图像,说白了就是给地球拍照片。但这不是普通的自拍,而是从几百公里高空往下看。我刚开始接触这个领域时,觉得挺科幻的。后来发现,这玩意儿其实已经非常成熟了。今天我就把卫星图像因子的构建流程,从头到尾捋一遍。

3.1 卫星数据获取渠道

先说说数据从哪来。卫星数据不是你想买就能买,也不是你想免费就能免费。这里有几个主流渠道:

渠道类型 代表数据源 分辨率 成本 适用场景
免费开源 Sentinel-2 (ESA) 10m 免费 大面积农作物监测
免费开源 Landsat 8/9 (USGS) 30m 免费 长期历史回测
商业付费 Maxar / Planet 0.3m - 3m 车辆计数、船舶检测
商业付费 Airbus / SPOT 1.5m 中高 港口活动监测
我的建议:刚开始做研究,先用 Sentinel-2 免费数据跑通流程。等策略验证有效了,再考虑买商业数据。我见过不少团队一上来就砸钱买高分辨率数据,结果因子没跑通,钱白花了。

获取方式也很简单。Sentinel 数据可以从 Copernicus Open Access Hub 下载,用 Python 的 sentinelhub 库就能自动化拉取。Landsat 数据则通过 USGS EarthExplorer 获取。商业数据需要签合同,通常按平方公里计价。

注意:卫星数据有重访周期。Sentinel-2 是 5 天,Landsat 是 16 天。这意味着你拿到的不是实时数据,而是几天前的快照。做高频交易的朋友,这条路走不通。

3.2 图像识别与特征提取

拿到原始图像后,不能直接用。你得从里面提取出有用的特征。我主要做三类特征提取:车辆计数、船舶检测、农作物长势。

3.2.1 车辆计数

车辆计数,说白了就是数停车场里有多少辆车。这能反映什么?零售店的客流量、工厂的开工率、甚至某个区域的消费活跃度。

具体做法是这样的:

  1. 目标检测模型:用 YOLOv8 或 Faster R-CNN 训练一个车辆检测器。我习惯用 YOLOv8,速度快,精度也够用。
  2. 图像预处理:先做几何校正,把卫星图像对齐到地图坐标。然后做辐射校正,消除大气影响。
  3. 计数逻辑:检测出每辆车后,统计数量。注意要排除阴影和误检。
# 伪代码示例:车辆计数
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} 辆车")
避坑指南:我曾经在沃尔玛停车场做过测试。结果发现,周末的车辆数比工作日少了 30%。一开始以为是模型不准,后来才发现——周末员工不开车上班,顾客也少。所以,车辆计数要结合时间戳和节假日做归一化。

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 值越高,说明植被越茂盛。

我一般这样用:

  1. 下载 Sentinel-2 的 L2A 产品(已经做过大气校正)
  2. 计算每个像素的 NDVI
  3. 按地块聚合,得到每个农田的平均 NDVI
  4. 对比历史同期,计算偏离度
一个小技巧:NDVI 的时间序列比单期数据更有价值。我习惯用过去 3 年的 NDVI 均值作为基准,然后看当前值偏离了多少。偏离超过 1 个标准差,就说明有异常。

3.3 因子合成与回测框架

特征提取完了,接下来就是合成因子。这一步很关键,因为单个特征往往不够稳定。

我常用的合成方法:

  • 标准化加权:把车辆计数、船舶数量、NDVI 都标准化到 Z-score,然后按权重相加。
  • 主成分分析:用 PCA 提取第一主成分,作为综合因子。
  • 机器学习融合:用 LightGBM 或 XGBoost 训练一个模型,把多个特征作为输入,预测未来收益率。

回测框架我推荐用 backtraderzipline。但要注意,卫星数据的频率很低(几天到几周),所以回测周期要拉长,至少 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()
重要提醒:卫星因子有滞后性。你今天看到的图像,可能是 3 天前拍的。所以回测时一定要做时间对齐,把因子值和交易日期对应好。我见过有人直接用发布日期做回测,结果因子表现特别好——其实是未来函数。

知识体系总览

下面这张图,是我自己整理的卫星图像因子构建流程。你可以把它当作路线图:

卫星图像因子构建流程 数据获取 Sentinel / Landsat / Maxar 图像预处理 几何校正 / 辐射校正 特征提取 车辆计数 船舶检测 NDVI 计算 因子合成 标准化 / PCA / ML 回测验证 免费 vs 商业 重访周期 5-16 天 消除大气和几何畸变 输出:反射率图像 核心原则 低频数据 + 长周期回测 + 时间对齐

嗯,以上就是卫星图像因子构建的完整流程。从数据获取到特征提取,再到因子合成和回测,每一步都有坑。但只要你把流程跑通了,这个因子的信息优势是很大的——毕竟,不是谁都能从太空看到你的持仓。


蓝海数据掘金营,专注资料整理