
通过整合市场交易、政策、天气及供应链多源数据,采用ARIMA与LSTM模型融合,构建动态价格波动预警体系,实现价格异常的提前识别与风险提示,辅助企业优化采购与库存策略。
数据来源需覆盖内外部驱动因素:
模型选择上,ARIMA擅长捕捉历史价格的趋势、季节性(线性关系,如季节性波动);LSTM能处理非线性关系与长期依赖(如突发政策或灾害对价格的影响)。两者结合提升预测精度。
预警逻辑基于“预测值与阈值对比”:通过模型预测未来价格,结合历史阈值(如3倍标准差、移动平均线),当预测价格超出阈值时触发预警;同时结合孤立森林算法,识别突发异常(如政策突然调整或极端天气)。
| 模型类型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| ARIMA | 自回归积分移动平均模型 | 适合线性时间序列,捕捉趋势/季节性 | 历史价格波动规律明显(如季节性) | 对非线性关系处理能力弱 |
| LSTM | 长短期记忆网络 | 深度学习模型,处理非线性、长期依赖 | 价格波动复杂,受多因素(政策、天气)影响 | 训练数据量大,解释性较弱 |
import pandas as pd
import numpy as np
from statsmodels.tsa.arima.model import ARIMA
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
import requests
# 数据获取(假设API接口)
def get_market_data():
url = "https://api.yaochang.com/prices"
res = requests.get(url)
return pd.DataFrame(res.json())
# 数据清洗(IQR法处理异常值,线性插值处理缺失值)
def preprocess_data(data):
data['price'].interpolate(method='linear', inplace=True)
Q1 = data['price'].quantile(0.25)
Q3 = data['price'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
data = data[(data['price'] >= lower_bound) & (data['price'] <= upper_bound)]
data['date'] = pd.to_datetime(data['date'])
data.set_index('date', inplace=True)
data = data.resample('D').mean() # 每日均值
return data
# 特征工程(政策数据量化,天气数据转化为干旱指数)
def feature_engineering(data):
# 政策数据:从药监部门爬取政策文件,用TF-IDF提取关键词,量化为影响因子(0-1)
policy_data = pd.read_csv('policy.csv')
policy_keywords = policy_data['keyword'].tolist()
data['policy_score'] = data['policy_text'].apply(lambda x:
sum(1 for word in policy_keywords if word in x.lower()) / len(policy_keywords))
# 天气数据:从气象局API获取,计算干旱指数(0-1)
weather_data = pd.read_csv('weather.csv')
data['weather_index'] = weather_data['dryness_index']
return data[['price', 'policy_score', 'weather_index']]
# 模型训练(ARIMA+LSTM融合)
def train_model(data):
# ARIMA部分
arima_model = ARIMA(data['price'], order=(5,1,2))
arima_result = arima_model.fit()
# LSTM部分(简化)
X = data[['price', 'policy_score', 'weather_index']].values
y = data['price'].shift(-1).values # 预测下一期
X, y = X[:-1], y[:-1]
model = Sequential()
model.add(LSTM(50, return_sequences=True, input_shape=(X.shape[1], X.shape[2])))
model.add(LSTM(50))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')
model.fit(X, y, epochs=10, batch_size=32)
return arima_result, model
# 预警逻辑(加权平均融合,阈值判断)
def risk_alert(data, arima_model, lstm_model):
arima_pred = arima_model.forecast()
lstm_pred = lstm_model.predict(X[-1].reshape(1, -1))[0]
avg_pred = 0.6 * arima_pred + 0.4 * lstm_pred # 加权平均(ARIMA60%,LSTM40%)
threshold = data['price'].std() * 3 # 3倍标准差阈值
if avg_pred > data['price'].mean() + threshold:
return "价格异常预警:预测价格将大幅上涨,建议调整采购/库存策略"
else:
return "价格正常,无需预警"
“针对中药材价格波动风险,我们构建了多源数据驱动的供应链风险预警模型。数据来源包括市场交易数据(药市实时报价)、政策文件(药监部门调控政策)、种植区域天气数据(干旱指数)以及内部供应链数据(库存水平)。模型采用传统时间序列模型(ARIMA)与深度学习模型(LSTM)融合,ARIMA捕捉历史价格的趋势和季节性,LSTM处理政策、天气等非线性影响。预警逻辑基于预测值与3倍标准差的阈值对比,当预测价格超出阈值时触发预警,同时结合孤立森林算法识别突发异常,提前提示企业调整采购或库存策略。”