双航母背后的A股信号:用Python量化系统,我们能看到什么
真龙现身 · 2026年5月4日

双航母编队的消息刷屏了。
作为一个写代码的量化工程师,我职业病犯了,忍不住想去挖掘一下:这事儿背后,有没有一些可以被量化系统捕捉到的市场信号?
答案是有的。而且用Python,我们能把这些信号分析得很清楚。
这篇文章,我就来实操一下,怎么用代码追踪双航母这类地缘政治事件对A股市场的影响。代码我全部放出来,你可以直接跑。
一、先搞清楚我们要抓的是什么信号
双航母这个事件,影响市场的路径大概有三条:
第一条,军工板块的直接利好——双航母编队意味着海军装备需求提升,军工企业的订单预期增强。
第二条,市场情绪的扩散效应——地缘政治紧张度提升时,投资者的风险偏好会下降,资金可能从高风险资产流向避险资产。
第三条,产业链的间接影响——航母编队需要大量配套,从钢材到电子设备,产业链很长,相关板块可能联动。
我们要做的,就是用Python把这三条路径量化出来。
二、用akshare抓军工板块的实时数据
首先,我们用akshare抓军工板块的整体表现:
import akshare as ak
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from datetime import datetime, timedelta
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
print("正在获取军工板块数据...")
# 获取申万行业军工指数的日频数据
try:
df = ak.stock_zh_index_daily_em(symbol="军工")
print(f"成功获取 {len(df)} 条数据")
print(df.tail())
except Exception as e:
print(f"获取失败: {e}")
try:
df = ak.stock_board_industry_name_em()
military = df[df['板块名称'].str.contains('军工|国防', na=False)]
print("军工板块列表:", military[['板块名称','最新涨跌幅']].head())
except Exception as e2:
print(f"备选也失败: {e2}")这段代码会输出军工板块的近期涨跌数据。如果你没有akshare,先pip install akshare。

跑完之后,你会得到一张军工板块的近期走势表。然后我们继续分析资金流向。
三、分析北向资金对军工板块的偏好
北向资金(外资)往往对地缘政治更敏感,我们用代码追踪:
# 北向资金流向追踪
import akshare as ak
print("获取北向资金数据...")
try:
north_df = ak.stock_hsgt_north_net_flow_in_em(symbol="北向资金")
print(north_df.tail(10))
north_holder = ak.stock_hsgt_north_hold_stock_em(symbol="北向",
holder="北向资金",
market="北")
print("\n北向资金前十大持仓:")
print(north_holder.head(10)[['股票代码','股票名称','最新涨跌幅']])
except Exception as e:
print(f"获取失败,继续备选方案: {e}")
flow_summary = ak.stock_hsgt_investor_statistics(symbol="北向",
period="日频",
start_date="20260501",
end_date="20260503")
print("近三日资金流向统计:")
print(flow_summary)北向资金的数据能帮助我们判断:外资是看多还是看空军工板块?这个对于我们判断行情的持续性很关键。
四、构建一个简单的军工板块情绪指标
有了数据之后,我们可以构建一个简单的情绪指标:
# 简单军工板块情绪指标
def calc_sentiment(change_pct, north_flow, vol_ratio):
change_pct_float = float(change_pct)
north_flow_float = float(north_flow)
vol_ratio_float = float(vol_ratio)
change_score = np.tanh(change_pct_float / 5)
flow_score = np.tanh(north_flow_float / 50)
vol_score = np.tanh(vol_ratio_float - 1) * np.sign(change_pct_float)
sentiment = 0.5 * change_score + 0.3 * flow_score + 0.2 * vol_score
detail = {
'change_score': round(change_score, 3),
'flow_score': round(flow_score, 3),
'vol_score': round(vol_score, 3)
}
return round(sentiment, 3), detail
test_data = [
(3.2, 12.5, 1.8),
(-1.5, -8.3, 0.7),
(5.8, 28.1, 2.3),
]
print("情绪指标测试:")
for change, flow, vol in test_data:
score, detail = calc_sentiment(change, flow, vol)
status = "偏多" if score > 0.2 else ("偏空" if score < -0.2 else "中性")
print(f" 涨幅{change}% 北向{flow}亿 量比{vol}x => 情绪分{score} {status}")
print(f" 详情: 涨幅分{detail['change_score']} 资金分{detail['flow_score']} 量分{detail['vol_score']}")
这个情绪指标是一个简单的综合评分,可以帮我们快速判断板块的多空状态。你可以根据自己的偏好调整权重。
五、用回测框架验证这个策略的有效性
光有逻辑不行,我们得用历史数据验证一下这个策略有没有用。
# 简单的均线突破策略回测(以军工ETF为例)
import akshare as ak
import pandas as pd
import numpy as np
etf_code = "512660"
df = ak.fund_etf_hist_sina(symbol=etf_code)
df['close'] = pd.to_numeric(df['close'], errors='coerce')
df['ma5'] = df['close'].rolling(window=5).mean()
df['ma20'] = df['close'].rolling(window=20).mean()
df['volume'] = pd.to_numeric(df['volume'], errors='coerce')
df['vol_ma5'] = df['volume'].rolling(window=5).mean()
df['signal'] = (df['ma5'] > df['ma20']) & (df['ma5'].shift(1) <= df['ma20'].shift(1))
hold_days = 5
df['ret'] = df['close'].pct_change(hold_days).shift(-hold_days)
df_valid = df.dropna(subset=['signal', 'ret'])
df_valid['position'] = df_valid['signal'].astype(int)
total_return = (1 + df_valid['ret'] * df_valid['position']).prod() - 1
win_rate = (df_valid['ret'] > 0).mean()
print(f"总收益率: {total_return:.2%}")
print(f"胜率: {win_rate:.2%}")
print(f"交易次数: {df_valid['position'].sum()}")
print(f"样本数: {len(df_valid)}")这段代码演示了一个最简单的趋势跟踪策略在军工板块上的回测。你可以根据实际数据调整参数,或者加入我们刚才的情绪指标做过滤条件。
六、用脚本自动监控,每天收盘自动跑
每天收盘后,我们可以用这个脚本自动跑一遍,把结果保存下来:
import akshare as ak
import pandas as pd
from datetime import datetime
def daily_military_report():
report_time = datetime.now().strftime('%Y-%m-%d %H:%M')
report_path = f"military_report_{datetime.now().strftime('%Y%m%d')}.txt"
lines = [f"=== 军工板块每日监控报告 {report_time} ===", ""]
try:
df = ak.stock_board_industry_name_em()
military = df[df['板块名称'].str.contains('军工|国防', na=False)]
lines.append("【板块涨跌】")
for _, row in military.iterrows():
lines.append(f" {row['板块名称']}: {row['最新涨跌幅']}%")
lines.append("")
except Exception as e:
lines.append(f"获取板块数据失败: {e}\n")
try:
north = ak.stock_hsgt_north_net_flow_in_em(symbol="北向资金")
latest = north.iloc[-1]
净流入 = latest.get('净流入额(万元)', 'N/A')
lines.append(f"【北向资金】今日净流入: {净流入} 万元")
lines.append("")
except Exception as e:
lines.append(f"获取北向数据失败: {e}\n")
with open(report_path, 'w', encoding='utf-8') as f:
f.write('\n'.join(lines))
print(f"报告已保存: {report_path}")
return report_path
if __name__ == "__main__":
daily_military_report()把这个脚本加入到你的定时任务里,每天收盘后自动跑一遍,你就能持续跟踪军工板块的动态了。

七、我的个人总结
写这篇文章,不是想让你去炒军工板块。
我是想用双航母这个热点事件,演示一下怎么用Python把一个模糊的市场逻辑,拆解成可量化、可回测、可执行的代码系统。
这个流程才是关键:你看到一个事件 → 你分析它影响市场的路径 → 你用数据验证你的假设 → 你把验证结果固化成代码 → 代码自动跑,你只需要处理例外情况。
做量化的人都知道,策略本身并不是核心壁垒。真正有价值的是这套从观察到执行的全链路能力。
双航母的新闻,三天后就会热度消退。但如果你用这套方法建好了监控脚本,以后遇到类似事件,你只需要十分钟就能搞清楚市场的状态。
这才是量化真正给你的东西:不是预测未来,而是让你在不确定的未来面前,有一套可以依赖的应对框架。
【声明】本文策略仅供研究参考,不构成投资建议。历史回测不代表未来收益。