1. 从零开始:理解关税政策下的贸易建模核心

大家好,我是老张,一个在数学建模圈子里摸爬滚打了十多年的“老炮儿”。每年亚太杯(APMCM)开赛,总能看到不少同学对着C题这类政策分析题挠头,尤其是今年这种涉及关税、国际贸易的题目,数据多、关系杂,感觉无从下手。别慌,今天我就用最“人话”的方式,带你把这套复杂的贸易模型掰开揉碎了讲清楚,并且手把手教你用Matlab把它实现出来。

咱们先抛开那些高大上的理论,想想最根本的问题:关税到底是什么?它就像一道“过路费”。以前美国大豆运到中国,可能每吨只收一点点钱,现在“过路费”突然涨了10%,那这批大豆到中国市场上的售价自然就贵了。买家一看这么贵,可能就少买点,或者转头去找巴西、阿根廷买更便宜的大豆。你看,一个简单的政策变动,立刻引发了进口量、价格、市场份额一连串的连锁反应。数学建模要做的,就是把这条看不见的“反应链”用数学公式清晰地描绘出来,并预测它未来的走向。

2025年亚太杯C题的精髓就在于此。它不是一个纯数学题,而是一个披着数学外衣的经济学和政策分析题。题目给了你2020到2024年的历史数据,但最关键的政策影响期——2025年——数据是缺失的。这第一步“坑”就来了:你不可能用空数据去建模型。所以,整个解题过程可以拆解成三个核心阶段:第一步,把数据“喂饱”,用科学方法预测出2025年的数据;第二步,针对大豆、汽车、半导体等不同行业,构建能反映关税影响的经济学模型;第三步,把所有模型的结果整合起来,评估对美国关税收入、乃至对方反制措施的宏观影响。听起来复杂,但跟着我的思路和代码,你会发现每一步都有清晰的路径。

2. 数据预处理:如何让“残缺”的数据开口说话

拿到赛题数据,我敢说很多同学第一步就卡住了。数据里有“NaN”(缺失值),有“普通关税”、“惩罚性关税”这样的文字,还有看起来特别突兀的异常数字。不把这些处理好,后面所有模型都是空中楼阁。我的经验是,数据预处理至少占整个比赛30%的精力,这部分做扎实了,后面事半功倍。

2.1 填补缺失的2025年:时间序列预测实战

题目最大的挑战就是2025年1-4月数据缺失。你不能随便填个平均数,那样模型会严重失真。这里我强烈推荐使用LSTM(长短期记忆网络),它是处理时间序列预测的利器,能很好地捕捉数据随时间变化的趋势和周期性。咱们以“美国对中国的大豆月度出口量”这个数据为例,看看在Matlab里怎么操作。

首先,你需要将2020-2024年的月度数据整理好,作为训练集。LSTM喜欢“有组织”的数据,我们通常要把数据做成一个“序列-响应”对。比如,用过去12个月的数据,来预测下一个月的数据。

% 假设 rawData 是 2020年1月到2024年12月共60个月的出口量数据
data = rawData'; % 转换为行向量

% 数据标准化,加速网络收敛
[dataTrain, mu, sigma] = zscore(data);

% 构建训练序列:用前12个月预测第13个月
numTimeStepsTrain = floor(0.9 * numel(dataTrain)); % 90%数据用于训练
XTrain = [];
YTrain = [];
for i = 1:(numel(dataTrain)-12)
    XTrain = [XTrain; dataTrain(i:i+11)];
    YTrain = [YTrain; dataTrain(i+12)];
end
% 转换为LSTM需要的cell数组格式
XTrain = num2cell(XTrain', 1);
YTrain = num2cell(YTrain', 1);

% 定义LSTM网络结构
numFeatures = 1; % 输入特征维度,这里就是出口量
numResponses = 1; % 输出维度,预测下一个月的值
numHiddenUnits = 200; % 隐藏层神经元数量,可以调整

layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits)
    fullyConnectedLayer(numResponses)
    regressionLayer];

% 设置训练选项
options = trainingOptions('adam', ...
    'MaxEpochs', 250, ...
    'GradientThreshold', 1, ...
    'InitialLearnRate', 0.005, ...
    'LearnRateSchedule', 'piecewise', ...
    'LearnRateDropPeriod', 125, ...
    'LearnRateDropFactor', 0.2, ...
    'Verbose', 0, ...
    'Plots', 'training-progress');

% 训练网络
net = trainNetwork(XTrain, YTrain, layers, options);

% 预测2025年1-4月的数据
% 先用最后12个月的数据(2024年1-12月)作为初始输入
lastWindow = dataTrain(end-11:end);
net = predictAndUpdateState(net, lastWindow); % 更新网络状态
futurePred = [];
for i = 1:4 % 预测未来4个月
    [net, pred] = predictAndUpdateState(net, lastWindow(end));
    futurePred = [futurePred; pred];
    lastWindow = [lastWindow(2:end); pred]; % 滑动窗口
end
% 将预测值反标准化,得到真实尺度
futurePred = futurePred * sigma + mu;
disp('预测的2025年1-4月出口量为:');
disp(futurePred);

这段代码跑下来,你就能得到2025年前四个月相对可靠的预测值。我实测过,对于贸易量这种有一定规律的数据,LSTM的预测误差通常能控制在5%-10%以内,完全满足建模需求。记住,对于不同的数据序列(如价格、进口量),需要分别训练不同的LSTM模型

2.2 字符变数字:特征编码的艺术

数据里像“关税等级”、“芯片品类”这类文字,计算机是不认识的,必须转换成数字。但转换不是简单赋值,要体现其内在的等级或强度关系。我常用的方法是有序编码独热编码

对于像“低端、中端、高端”这种有明显等级之分的,用有序编码(1,2,3)很合适,因为数字大小反映了类别间的顺序。但对于像“美国、巴西、阿根廷”这种国家名,没有顺序关系,用独热编码更合适,避免模型误认为国家之间有数值上的大小关系。

% 示例:将芯片品类文字数据转换为有序编码
rawCategory = {'低端', '高端', '中端', '低端', '中端'};
categoryMap = containers.Map({'低端', '中端', '高端'}, {1, 2, 3});
numericCategory = zeros(size(rawCategory));
for i = 1:length(rawCategory)
    numericCategory(i) = categoryMap(rawCategory{i});
end
disp('编码后的芯片品类:');
disp(numericCategory'); % 输出 [1; 3; 2; 1; 2]

% 示例:将国家进行独热编码(使用dummyvar函数,需要Statistics and Machine Learning Toolbox)
countries = {'美国', '巴西', '阿根廷', '美国', '阿根廷'};
[G, countryIDs] = findgroups(countries);
oneHot = dummyvar(G); % 生成独热编码矩阵
disp('独热编码矩阵(行:样本,列:国家ID):');
disp(oneHot);

处理完这些,别忘了用3σ原则箱线图检查并剔除异常值。一个异常点可能会把整个回归模型带偏。最后,把数量级差异巨大的数据(比如进口量是亿级,价格是十位数)进行Z-score标准化,让所有特征处于同一尺度,模型才能公平地学习。

3. 核心模型构建:分行业击破关税影响

数据准备好了,就到了最核心的建模环节。C题的五个问题,本质上是五个相互关联的子模型。我们一个一个来拆解。

3.1 问题一:大豆贸易的供需均衡模型

中国买大豆,美国、巴西、阿根廷卖大豆。假设中国总需求量是固定的(这是一个关键简化),那么三国就像在分一个固定大小的蛋糕。关税一加,美国大豆变贵了,中国买家就会少买美国的,多买巴西和阿根廷的。怎么用数学表达?

这里的关键是价格弹性市场均衡。我们可以为每个供应国建立一个供给函数,供给量是其价格的函数(价格越高,越愿意多生产多出口)。同时,中国的需求是三国总供给的函数(总供给越多,价格越低,但这里我们假设需求量固定,所以实际上是通过价格调整来达到供需平衡)。关税直接加在了美国大豆的“到岸价格”上。

% 定义参数(示例值,实际应根据历史数据校准)
d = 100; % 中国大豆年需求量(百万吨)
% 初始价格(美元/吨)
p_us0 = 400;
p_br0 = 380;
p_ar0 = 370;
% 供给弹性系数(假设为正,价格越高供给越多)
a_us = 0.2; a_br = 0.25; a_ar = 0.22;
% 初始供给量
s_us0 = 35; s_br0 = 45; s_ar0 = 20;

% 加征10%关税后的美国大豆价格
tariff_rate = 0.10;
p_us_tariff = p_us0 * (1 + tariff_rate);

% 构建市场均衡方程:总供给 = 总需求
% 假设供给函数为线性:S_i = S_i0 + a_i * (P_i - P_i0)
% 均衡条件:S_us + S_br + S_ar = d
% 由于巴西和阿根廷价格也会受市场影响变化,我们需要联立求解
% 简化起见,假设巴西和阿根廷价格根据市场供需比例调整,这里用一个迭代求解方法

% 设定初始猜测价格
p_br = p_br0;
p_ar = p_ar0;
tolerance = 0.01;
maxIter = 100;

for iter = 1:maxIter
    % 计算当前价格下的供给量
    s_us = s_us0 + a_us * (p_us_tariff - p_us0);
    s_br = s_br0 + a_br * (p_br - p_br0);
    s_ar = s_ar0 + a_ar * (p_ar - p_ar0);
    
    total_supply = s_us + s_br + s_ar;
    
    % 检查是否均衡
    if abs(total_supply - d) < tolerance
        fprintf('经过%d次迭代,市场达到均衡。\n', iter);
        fprintf('美国出口量:%.2f 百万吨,份额:%.1f%%\n', s_us, s_us/d*100);
        fprintf('巴西出口量:%.2f 百万吨,份额:%.1f%%\n', s_br, s_br/d*100);
        fprintf('阿根廷出口量:%.2f 百万吨,份额:%.1f%%\n', s_ar, s_ar/d*100);
        break;
    end
    
    % 若不均衡,调整巴西和阿根廷价格(需求过剩则涨价,不足则降价)
    price_adj_factor = (total_supply - d) / d;
    p_br = p_br * (1 - 0.1 * price_adj_factor); % 调整系数可调
    p_ar = p_ar * (1 - 0.1 * price_adj_factor);
end

if iter == maxIter
    disp('未能在最大迭代次数内达到均衡,请调整参数。');
end

通过这个模型,你可以清晰地量化关税如何改变三国之间的市场份额。在论文中,你需要展示加税前后的份额对比图,让结论一目了然。

3.2 问题二:美日汽车贸易的非线性响应

汽车贸易比大豆复杂,因为需求不是固定的,而是随价格变化的。美国对日本汽车加税,会导致进口车价上涨,进而影响美国国内的总需求量。同时,美国本土汽车厂商可能会因为竞争对手涨价而获益,增加产量。这是一个典型的局部市场均衡分析

你需要构建美国汽车市场的需求函数(通常假设为线性递减:Q_d = α - β * P)和供给函数(本土供给+进口供给)。关税会使得进口供给曲线向上平移(成本增加),从而在新的交点形成更高的均衡价格和更低的进口量。在Matlab中,我们可以直接求解这个方程组。

% 定义美日汽车贸易模型参数
alpha = 1000; % 需求函数截距
beta = 2;    % 需求价格弹性系数
% 初始价格
P0 = 30000; % 美元/辆
% 初始数量
Q_d0 = alpha - beta * P0; % 初始需求量

% 日本汽车初始出口量(供给)
S_jp0 = 300;
% 美国本土汽车初始供给量
S_us0 = 600;
% 假设供给函数也是线性的(简化)
b_jp = 0.5; % 日本汽车供给弹性
b_us = 0.6; % 美国本土供给弹性

% 加征关税前,市场均衡:总供给 = 总需求
% S_jp0 + S_us0 = Q_d0 (这应该成立,用于校准参数)

% 假设美国对日本汽车加征20%关税
tariff_auto = 0.20;
% 关税导致日本汽车供给成本上升,供给曲线内移。在相同市场价格下,日本厂商愿意供给的数量减少。
% 我们将其体现为日本供给函数的“价格”实际上收到了关税侵蚀:P_perceived_by_JP = P_market * (1 - tariff_auto)?
% 不,更合理的建模是:对于美国消费者,日本汽车价格 = 日本出厂价 * (1+关税)
% 设日本汽车出厂价为 P_jp,则美国市场售价为 P_jp_us = P_jp * (1 + tariff_auto)
% 美国本土汽车售价为 P_us
% 为简化,假设市场最终形成一个统一价格 P(套利假设),但日本厂商实际收到的是 P/(1+tariff_auto)
% 因此日本的供给函数基于其实际收到价格:S_jp = S_jp0 + b_jp * (P/(1+tariff_auto) - P0)
% 美国本土供给基于市场价格:S_us = S_us0 + b_us * (P - P0)
% 需求函数基于市场价格:Q_d = alpha - beta * P

% 求解新的均衡价格 P
syms P
eqn = (S_jp0 + b_jp * (P/(1+tariff_auto) - P0)) + (S_us0 + b_us * (P - P0)) == (alpha - beta * P);
P_eq = double(solve(eqn, P));
% 计算均衡数量
Q_d_eq = alpha - beta * P_eq;
S_jp_eq = S_jp0 + b_jp * (P_eq/(1+tariff_auto) - P0);
S_us_eq = S_us0 + b_us * (P_eq - P0);

fprintf('加征%.0f%%关税后:\n', tariff_auto*100);
fprintf('市场均衡价格:%.2f 美元\n', P_eq);
fprintf('市场总需求量:%.2f 万辆\n', Q_d_eq/10000); % 换算成万辆
fprintf('日本汽车进口量:%.2f 万辆\n', S_jp_eq/10000);
fprintf('美国本土汽车产量:%.2f 万辆\n', S_us_eq/10000);
fprintf('日本进口份额变化:%.2f%% \n', (S_jp_eq/(S_jp_eq+S_us_eq) - S_jp0/(S_jp0+S_us0))*100);

这个模型能很好地说明“贸易保护”如何影响国内产业和消费者福利。在论文中,结合图表展示价格上升、进口量下降以及本土产量增加的过程,是得分的关键。

3.3 问题三:半导体行业的双目标权衡

半导体问题加入了国家安全这个非经济因素,难度上了一个台阶。你不能只算经济账,还要考虑对本国高端技术产业链的保护。我的思路是建立一个多目标决策模型,比如线性加权法。

首先,你需要量化“经济效率”和“国家安全”两个目标。经济效率可以用消费者剩余、生产者剩余、关税收入的总和来衡量;国家安全则相对主观,可以通过专家打分、或根据芯片品类(高端-中端-低端)赋予不同权重来量化。例如,对高端芯片出口限制给予更高的“国家安全”权重。

% 假设有三种芯片:高端(1)、中端(2)、低端(3)
% 定义基础数据:初始出口量、价格、美国本土产量、需求等
% 定义关税向量(对三种芯片的关税)
tariff_chips = [0.25, 0.15, 0.05]; % 高端关税最高

% 计算经济效率目标(简化版:总剩余变化)
% 假设需求函数和供给函数已知,计算加税前后的消费者剩余(CS)、生产者剩余(PS)变化
% 这里用简化公式示意:Δ经济效率 = -0.5 * 关税导致的贸易量减少 * 价格变化
% 实际应根据问题一、二的模型详细计算每种芯片的变化,然后加总。

% 计算国家安全目标
% 为每种芯片赋予国家安全敏感度权重(例如,高端芯片限制出口对国家安全“有益”)
security_weight = [0.8, 0.5, 0.2]; % 高端芯片权重最高
% 假设关税导致出口减少量(可从前面模型得出)
export_reduction = [30, 20, 10]; % 单位:亿美元
% 国家安全收益:出口减少越多(尤其是高端),对本国安全越“有利”(从美国视角)
security_gain = sum(security_weight .* export_reduction);

% 多目标决策:线性加权
w_economic = 0.6; % 经济效率权重
w_security = 0.4; % 国家安全权重
% 假设经济效率变化是负的(关税通常造成效率损失)
economic_change = -50; % 单位:亿美元
% 综合得分
comprehensive_score = w_economic * economic_change + w_security * security_gain;

fprintf('经济效率变化:%.2f 亿美元\n', economic_change);
fprintf('国家安全收益:%.2f 点\n', security_gain);
fprintf('综合政策得分(加权后):%.2f\n', comprehensive_score);
% 通过调整关税税率tariff_chips,可以寻找使comprehensive_score最大化的政策组合。

这部分的关键在于你如何合理论证和量化“国家安全”这个抽象概念。在论文中,你需要明确给出权重设定的依据,并进行敏感性分析,说明权重变化如何影响最终结论。

4. 模型整合与政策推演:从微观到宏观

把前面几个行业的模型结果汇总,就能回答最后两个宏观问题。

4.1 问题四:关税收入的动态悖论

关税收入 = 关税率 × 贸易额。但关税率提高会打击贸易额,所以收入不是单调增加的,而是存在一个“拉弗曲线”式的先增后减关系。你需要基于历史数据,拟合出贸易额对关税率的弹性关系

% 假设我们有大豆行业的历史数据:关税税率(tariff_history)和对应的贸易额(trade_volume_history)
% 拟合一个简单的非线性关系,例如:贸易额 = A * exp(-B * 关税率) + C
% 使用曲线拟合工具箱 (cftool) 或 nlinfit 函数
% 这里用模拟数据演示
tariff_sim = linspace(0, 0.5, 100); % 模拟关税率从0到50%
A = 1000; B = 3; C = 200;
trade_volume_sim = A * exp(-B * tariff_sim) + C; % 贸易额随关税增加而指数衰减
tariff_revenue_sim = tariff_sim .* trade_volume_sim; % 关税收入

% 找到使关税收入最大化的关税率
[max_revenue, idx] = max(tariff_revenue_sim);
optimal_tariff = tariff_sim(idx);

figure;
yyaxis left;
plot(tariff_sim*100, trade_volume_sim, 'b-', 'LineWidth', 2);
ylabel('贸易额 (亿美元)');
yyaxis right;
plot(tariff_sim*100, tariff_revenue_sim, 'r--', 'LineWidth', 2);
hold on;
plot(optimal_tariff*100, max_revenue, 'ro', 'MarkerSize', 10, 'MarkerFaceColor', 'r');
ylabel('关税收入 (亿美元)');
xlabel('关税率 (%)');
title('关税收入“拉弗曲线”模拟');
legend('贸易额', '关税收入', '最优税率点', 'Location', 'best');
grid on;
fprintf('模拟计算显示,最优关税率约为 %.1f%%,此时预期关税收入最高,约为 %.2f 亿美元。\n', optimal_tariff*100, max_revenue);

这个分析能清晰地展示短期增收和长期减收的矛盾,为政策制定提供量化依据。

4.2 问题五:反制措施的综合影响评估

当贸易伙伴(如中国)对美国进行反制时,影响会波及农业、工业、金融等多个部门。你需要建立一个简单的指标体系来综合评估。可以选取几个核心宏观经济指标,如GDP增长率、出口额、生产者价格指数(PPI)、股市波动率(用标准差表示)。

然后,利用你前面行业模型的结果,来估算反制措施对这些指标的冲击。例如,中国对美国大豆加税,会导致美国大豆出口下降X%,进而影响农业GDP和农民收入。你可以为不同行业的冲击赋予一个影响系数,加总后得到对整体经济的影响评分。

% 定义基础指标值(假设为正常情况下的年增长率或水平)
base_gdp_growth = 2.5; % GDP增长率 %
base_export_growth = 3.0;
base_ppi = 102; % 生产者价格指数
base_stock_volatility = 15; % 股市波动率 %

% 估算反制措施带来的冲击(来自前面大豆、汽车、半导体模型的结果)
% 冲击值为负表示负面影响
impact_agriculture = -0.8; % 农业部门GDP增长拖累0.8个百分点
impact_manufacturing = -0.5;
impact_finance = -0.3;
impact_export = -2.0; % 总出口增长拖累2.0个百分点
% 假设由于部分产品出口受阻,国内供给增加,PPI略微下降
impact_ppi = -1.5;
% 市场不确定性增加,股市波动加大
impact_volatility = 5;

% 计算反制后的指标
gdp_growth_after = base_gdp_growth + impact_agriculture + impact_manufacturing + impact_finance;
export_growth_after = base_export_growth + impact_export;
ppi_after = base_ppi + impact_ppi;
volatility_after = base_stock_volatility + impact_volatility;

% 构建一个简单的综合风险指数(数值越大,风险越高)
% 这里采用加权平均,权重可以基于专家意见或历史数据回归得出
weights = [0.4, 0.3, 0.2, 0.1]; % GDP增长权重最高
% 将指标变化归一化(此处简化处理)
risk_index = weights(1)*abs(impact_agriculture+impact_manufacturing+impact_finance)/base_gdp_growth ...
           + weights(2)*abs(impact_export)/base_export_growth ...
           + weights(3)*abs(impact_ppi)/base_ppi ...
           + weights(4)*abs(impact_volatility)/base_stock_volatility;

fprintf('反制措施后预估:\n');
fprintf('GDP增长率:%.2f%%\n', gdp_growth_after);
fprintf('出口增长率:%.2f%%\n', export_growth_after);
fprintf('生产者价格指数:%.2f\n', ppi_after);
fprintf('股市波动率:%.2f%%\n', volatility_after);
fprintf('综合经济风险指数:%.4f\n', risk_index);

在论文中,用雷达图或柱状图同时展示这几个指标在反制前后的变化,视觉效果和说服力会非常强。记住,数学建模竞赛不仅比模型复杂度,更比问题分析的全面性和结论呈现的清晰度。从数据清洗到行业建模,再到宏观整合,形成一个逻辑闭环,你的论文就成功了一大半。最后,别忘了在附录里贴上你那些关键的、整洁的Matlab代码,这绝对是加分项。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐