4、资金流向图绘制基础:Matplotlib与Plotly入门

各位同学,今天咱们来聊聊资金流向图绘制的基础工具。说实话,我做了这么多年量化分析,最深的体会就是:数据再漂亮,画不出来也是白搭。你想想看,一堆数字堆在那儿,谁能一眼看出资金是进是出?

所以这一章,我带你入门两个最常用的绘图库——MatplotlibPlotly。一个偏静态,一个偏交互。咱们先画最简单的柱状图和折线图,把基本功打扎实。

核心知识点速览

  • Matplotlib:静态图表,适合论文、报告、印刷
  • Plotly:交互图表,适合网页、Dashboard、探索分析
  • 柱状图:展示资金流入/流出对比
  • 折线图:展示资金流向的时间趋势
资金流向图绘制基础 Matplotlib(静态) Plotly(交互) 柱状图 折线图 柱状图 折线图 核心能力:数据可视化 → 洞察资金流向 → 辅助交易决策 先画出来,再谈分析

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