4、资金流向图绘制基础:Matplotlib与Plotly入门
各位同学,今天咱们来聊聊资金流向图绘制的基础工具。说实话,我做了这么多年量化分析,最深的体会就是:数据再漂亮,画不出来也是白搭。你想想看,一堆数字堆在那儿,谁能一眼看出资金是进是出?
所以这一章,我带你入门两个最常用的绘图库——Matplotlib和Plotly。一个偏静态,一个偏交互。咱们先画最简单的柱状图和折线图,把基本功打扎实。
核心知识点速览
- Matplotlib:静态图表,适合论文、报告、印刷
- Plotly:交互图表,适合网页、Dashboard、探索分析
- 柱状图:展示资金流入/流出对比
- 折线图:展示资金流向的时间趋势
4.1 为什么先学这两个库?
我个人习惯是:快速探索用Plotly,正式输出用Matplotlib。为什么?
- Matplotlib:老牌库,稳定可靠。我早期做量化回测报告,所有图表都用它。导出PDF、PNG,清晰度没得挑。
- Plotly:交互式,鼠标悬停能看到数值。我在做资金流向监控Dashboard时,必用Plotly。客户喜欢能拖拽、能放大的图表。
我的建议:别纠结选哪个。两个都学,根据场景切换。就像工具箱里既有螺丝刀又有扳手,看情况用。
4.2 环境准备
先装库。打开终端,一行搞定:
pip install matplotlib plotly pandas
嗯,这里要注意。如果你用的是Jupyter Notebook,Plotly需要额外配置才能显示。我踩过这个坑,后来发现加一行代码就行:
import plotly.io as pio
pio.renderers.default = 'notebook' # 或者 'iframe'
避坑指南:我曾经在服务器上跑Plotly,结果图表死活不显示。后来发现是渲染器没设置。如果你在非Jupyter环境,试试 pio.renderers.default = 'browser'。
4.3 用Matplotlib画柱状图——资金流入流出对比
咱们先模拟一组数据。假设有5只股票,今天的主力资金净流入情况:
import matplotlib.pyplot as plt
import numpy as np
# 模拟数据
stocks = ['贵州茅台', '宁德时代', '招商银行', '中国平安', '五粮液']
inflow = [2.3, 1.8, -0.5, 0.9, -1.2] # 单位:亿元
# 设置颜色:流入为红,流出为绿
colors = ['#ff4d4f' if v > 0 else '#52c41a' for v in inflow]
# 绘制柱状图
plt.figure(figsize=(10, 6))
bars = plt.bar(stocks, inflow, color=colors, alpha=0.8)
# 添加数值标签
for bar, val in zip(bars, inflow):
plt.text(bar.get_x() + bar.get_width()/2,
bar.get_height() + 0.1 if val > 0 else bar.get_height() - 0.3,
f'{val:.1f}亿', ha='center', fontsize=11)
plt.title('主力资金净流入(亿元)', fontsize=14, fontweight='bold')
plt.axhline(y=0, color='gray', linestyle='--', linewidth=0.8)
plt.ylabel('净流入金额(亿元)')
plt.grid(axis='y', alpha=0.3)
plt.tight_layout()
plt.show()
这段代码我用了好多年。核心就几点:
- 颜色区分:流入用红色,流出用绿色。这是行业惯例,别搞反了。
- 零线参考:
axhline画一条虚线,一眼看出谁在净流入谁在净流出。 - 数值标签:柱子上方标数字,省得读者去猜。
关键点:资金流向图里,颜色就是语言。红色代表资金流入(买盘强),绿色代表资金流出(卖盘强)。别用反了,否则会被同行笑话。
4.4 用Matplotlib画折线图——资金流向趋势
柱状图看的是某个时间点的截面数据。那如果要看某只股票连续5天的资金流向变化呢?折线图上场。
# 模拟5天的资金流向数据
days = ['周一', '周二', '周三', '周四', '周五']
net_flow = [0.5, 1.2, -0.3, 0.8, 1.5] # 单位:亿元
plt.figure(figsize=(10, 5))
plt.plot(days, net_flow, marker='o', linewidth=2, color='#1890ff', markersize=8)
# 填充面积
plt.fill_between(range(len(days)), net_flow, alpha=0.15, color='#1890ff')
# 标注关键点
for i, val in enumerate(net_flow):
plt.text(i, val + 0.1, f'{val:.1f}亿', ha='center', fontsize=10)
plt.title('贵州茅台本周资金净流入趋势', fontsize=14, fontweight='bold')
plt.axhline(y=0, color='gray', linestyle='--', linewidth=0.8)
plt.ylabel('净流入金额(亿元)')
plt.grid(alpha=0.3)
plt.tight_layout()
plt.show()
这里我加了个小技巧——fill_between填充面积。为什么?因为视觉上更直观,资金流入的「势能」一眼就能看出来。我在做周报时经常用这个手法,领导反馈说「看着舒服」。
个人经验:折线图里,marker参数别省。没有标记点的折线图,数据点多了根本看不清每个点的具体位置。我早期犯过这个错,后来被同事提醒才改过来。
4.5 用Plotly画交互式柱状图
好,静态的看完了。咱们来点动态的。Plotly的柱状图,鼠标悬停就能看到数值,还能缩放、拖拽。
import plotly.graph_objects as go
# 同样的数据
stocks = ['贵州茅台', '宁德时代', '招商银行', '中国平安', '五粮液']
inflow = [2.3, 1.8, -0.5, 0.9, -1.2]
# 颜色映射
colors = ['#ff4d4f' if v > 0 else '#52c41a' for v in inflow]
fig = go.Figure(data=[
go.Bar(x=stocks, y=inflow, marker_color=colors,
text=[f'{v:.1f}亿' for v in inflow],
textposition='outside')
])
fig.update_layout(
title='主力资金净流入(亿元)——交互版',
yaxis_title='净流入金额(亿元)',
showlegend=False,
height=500,
width=800
)
fig.show()
你看,代码量其实差不多。但Plotly多了一个好处:交互。鼠标移到柱子上,自动显示数值。这在做演示时特别有用——你不用提前标注所有数字,观众自己看就行。
注意:Plotly的图表在Jupyter里默认是HTML格式。如果你要保存为图片,需要用 fig.write_image('chart.png')。但前提是安装了 kaleido 库。我曾经在部署时忘了装这个,结果图片导出失败,被老板骂了一顿。
4.6 用Plotly画交互式折线图
最后,咱们把折线图也做成交互的。还是那5天的数据:
days = ['周一', '周二', '周三', '周四', '周五']
net_flow = [0.5, 1.2, -0.3, 0.8, 1.5]
fig = go.Figure(data=[
go.Scatter(x=days, y=net_flow, mode='lines+markers',
line=dict(color='#1890ff', width=3),
marker=dict(size=10, color='#1890ff'),
fill='tozeroy', fillcolor='rgba(24,144,255,0.15)',
name='净流入')
])
fig.update_layout(
title='贵州茅台本周资金净流入趋势——交互版',
yaxis_title='净流入金额(亿元)',
hovermode='x unified',
height=500,
width=800
)
fig.show()
这里我特别推荐 hovermode='x unified'。什么意思?就是鼠标在图表上移动时,同一x轴位置的所有数据点一起显示。做资金流向分析时,你经常需要对比不同时间点的数据,这个模式省事很多。
4.7 两个库的对比总结
说了这么多,咱们用一张表收个尾:
| 对比维度 | Matplotlib | Plotly |
|---|---|---|
| 输出格式 | 静态图片(PNG/PDF/SVG) | 交互式HTML |
| 交互能力 | 无 | 悬停、缩放、拖拽 |
| 学习曲线 | 中等(API较底层) | 较平缓(高层封装) |
| 适合场景 | 论文、报告、印刷品 | 网页、Dashboard、演示 |
| 数据量支持 | 适合中小规模 | 适合大规模(WebGL加速) |
| 我的使用频率 | 60% | 40% |
说白了,两个都是好工具。我个人的工作流是:先用Plotly快速探索数据,找到规律后,再用Matplotlib精修图表,放到报告里。你也不妨试试这个套路。
本章核心:柱状图看对比,折线图看趋势。Matplotlib稳,Plotly活。先画出来,再谈分析。资金流向图的第一步,就是让数据「看得见」。
公众号:蓝海资料掘金营,微信deep3321