news 2026/4/18 11:47:31

Python期货数据可视化实践_用代码绑制专业交易图表

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python期货数据可视化实践_用代码绑制专业交易图表

声明:本文为个人学习笔记,仅供技术交流,不构成任何投资建议。


一、前言

在期货量化这条路上,我已经走了整整二十年。数据可视化是量化交易中不可或缺的一环——好的图表能帮助我们更直观地理解行情、分析策略、展示结果。

今天这篇文章,我来分享一下Python期货数据可视化的实践经验,包括常用的图表类型和代码实现。


二、常用可视化库

特点适用场景
matplotlib基础、灵活静态图表
plotly交互式网页展示
mplfinance专业K线金融图表

本文主要使用matplotlib和mplfinance。

安装

pipinstallmatplotlib mplfinance pandas numpy

三、获取数据

首先获取期货数据:

fromtqsdkimportTqApi,TqAuthimportpandasaspd api=TqApi(auth=TqAuth("账户","密码"))# 获取K线数据symbol="SHFE.rb2505"klines=api.get_kline_serial(symbol,60*60,500)# 1小时K线api.wait_update()# 转为DataFramedf=klines.to_dataframe()df['datetime']=pd.to_datetime(df['datetime'])df=df.set_index('datetime')print(df.tail())api.close()

四、K线图绑制

4.1 使用mplfinance绑制专业K线

importmplfinanceasmpfimportpandasaspd# 准备数据(需要特定列名)df_ohlc=df[['open','high','low','close','volume']].copy()df_ohlc.columns=['Open','High','Low','Close','Volume']# 绑制K线图mpf.plot(df_ohlc.tail(100),# 最近100根K线type='candle',# 蜡烛图style='charles',# 样式title='螺纹钢 RB2505 1小时K线',ylabel='价格',volume=True,# 显示成交量figsize=(14,8))

4.2 添加均线

# 计算均线df_ohlc['MA5']=df_ohlc['Close'].rolling(5).mean()df_ohlc['MA20']=df_ohlc['Close'].rolling(20).mean()# 添加均线到图表ap=[mpf.make_addplot(df_ohlc['MA5'].tail(100),color='blue',width=1),mpf.make_addplot(df_ohlc['MA20'].tail(100),color='orange',width=1),]mpf.plot(df_ohlc.tail(100),type='candle',style='charles',title='螺纹钢 K线 + 均线',addplot=ap,volume=True,figsize=(14,8))

4.3 添加布林带

# 计算布林带period=20df_ohlc['MA20']=df_ohlc['Close'].rolling(period).mean()df_ohlc['STD']=df_ohlc['Close'].rolling(period).std()df_ohlc['Upper']=df_ohlc['MA20']+2*df_ohlc['STD']df_ohlc['Lower']=df_ohlc['MA20']-2*df_ohlc['STD']# 绑制ap=[mpf.make_addplot(df_ohlc['MA20'].tail(100),color='blue'),mpf.make_addplot(df_ohlc['Upper'].tail(100),color='gray',linestyle='--'),mpf.make_addplot(df_ohlc['Lower'].tail(100),color='gray',linestyle='--'),]mpf.plot(df_ohlc.tail(100),type='candle',addplot=ap,title='布林带指标',figsize=(14,8))

五、策略回测结果可视化

5.1 资金曲线

importmatplotlib.pyplotaspltimportnumpyasnp# 模拟资金曲线数据np.random.seed(42)returns=np.random.randn(252)*0.02# 模拟日收益equity=100000*(1+returns).cumprod()# 绘制资金曲线plt.figure(figsize=(12,5))plt.plot(equity,color='blue',linewidth=1.5)plt.fill_between(range(len(equity)),equity,alpha=0.3)plt.title('策略资金曲线',fontsize=14)plt.xlabel('交易日')plt.ylabel('账户权益')plt.grid(True,alpha=0.3)plt.tight_layout()plt.show()

5.2 回撤曲线

defcalc_drawdown(equity):"""计算回撤"""peak=np.maximum.accumulate(equity)drawdown=(equity-peak)/peakreturndrawdown drawdown=calc_drawdown(equity)# 绘制回撤曲线fig,axes=plt.subplots(2,1,figsize=(12,8),sharex=True)# 资金曲线axes[0].plot(equity,color='blue')axes[0].set_title('资金曲线')axes[0].set_ylabel('账户权益')axes[0].grid(True,alpha=0.3)# 回撤曲线axes[1].fill_between(range(len(drawdown)),drawdown,color='red',alpha=0.5)axes[1].set_title('回撤曲线')axes[1].set_xlabel('交易日')axes[1].set_ylabel('回撤比例')axes[1].grid(True,alpha=0.3)plt.tight_layout()plt.show()

5.3 收益分布

# 计算日收益率daily_returns=np.diff(equity)/equity[:-1]# 绘制收益分布fig,axes=plt.subplots(1,2,figsize=(14,5))# 直方图axes[0].hist(daily_returns,bins=50,color='blue',alpha=0.7,edgecolor='black')axes[0].axvline(x=0,color='red',linestyle='--')axes[0].set_title('日收益分布')axes[0].set_xlabel('日收益率')axes[0].set_ylabel('频次')# 累计分布sorted_returns=np.sort(daily_returns)cumulative=np.arange(1,len(sorted_returns)+1)/len(sorted_returns)axes[1].plot(sorted_returns,cumulative)axes[1].axhline(y=0.5,color='red',linestyle='--',alpha=0.5)axes[1].set_title('累计分布')axes[1].set_xlabel('日收益率')axes[1].set_ylabel('累计概率')plt.tight_layout()plt.show()

六、交易信号可视化

6.1 在K线图上标记买卖点

importmatplotlib.pyplotaspltimportmatplotlib.datesasmdates# 准备数据df_plot=df.tail(100).copy()df_plot['MA5']=df_plot['close'].rolling(5).mean()df_plot['MA20']=df_plot['close'].rolling(20).mean()# 生成信号df_plot['signal']=0df_plot.loc[df_plot['MA5']>df_plot['MA20'],'signal']=1df_plot.loc[df_plot['MA5']<df_plot['MA20'],'signal']=-1df_plot['signal_change']=df_plot['signal'].diff()# 买卖点buy_signals=df_plot[df_plot['signal_change']==2]sell_signals=df_plot[df_plot['signal_change']==-2]# 绑图fig,ax=plt.subplots(figsize=(14,7))ax.plot(df_plot.index,df_plot['close'],label='收盘价',color='black',linewidth=1)ax.plot(df_plot.index,df_plot['MA5'],label='MA5',color='blue',linewidth=1)ax.plot(df_plot.index,df_plot['MA20'],label='MA20',color='orange',linewidth=1)# 标记买卖点ax.scatter(buy_signals.index,buy_signals['close'],marker='^',color='red',s=100,label='买入',zorder=5)ax.scatter(sell_signals.index,sell_signals['close'],marker='v',color='green',s=100,label='卖出',zorder=5)ax.set_title('交易信号标记')ax.set_xlabel('时间')ax.set_ylabel('价格')ax.legend()ax.grid(True,alpha=0.3)plt.xticks(rotation=45)plt.tight_layout()plt.show()

七、多图组合展示

7.1 完整的策略分析面板

importmatplotlib.pyplotaspltimportmatplotlib.gridspecasgridspec fig=plt.figure(figsize=(16,12))gs=gridspec.GridSpec(3,2,height_ratios=[2,1,1])# 1. K线图 + 均线ax1=fig.add_subplot(gs[0,:])ax1.plot(df_plot.index,df_plot['close'],label='收盘价')ax1.plot(df_plot.index,df_plot['MA5'],label='MA5')ax1.plot(df_plot.index,df_plot['MA20'],label='MA20')ax1.set_title('价格走势与均线')ax1.legend()ax1.grid(True,alpha=0.3)# 2. 成交量ax2=fig.add_subplot(gs[1,0])colors=['red'ifc>oelse'green'forc,oinzip(df_plot['close'],df_plot['open'])]ax2.bar(range(len(df_plot)),df_plot['volume'],color=colors,alpha=0.7)ax2.set_title('成交量')ax2.set_ylabel('成交量')# 3. 资金曲线ax3=fig.add_subplot(gs[1,1])ax3.plot(equity,color='blue')ax3.fill_between(range(len(equity)),equity,alpha=0.3)ax3.set_title('资金曲线')ax3.set_ylabel('权益')# 4. 回撤ax4=fig.add_subplot(gs[2,0])ax4.fill_between(range(len(drawdown)),drawdown,color='red',alpha=0.5)ax4.set_title('回撤')ax4.set_ylabel('回撤比例')# 5. 收益分布ax5=fig.add_subplot(gs[2,1])ax5.hist(daily_returns,bins=30,color='blue',alpha=0.7)ax5.axvline(x=0,color='red',linestyle='--')ax5.set_title('日收益分布')plt.tight_layout()plt.show()

八、保存图表

# 保存为PNGplt.savefig('strategy_report.png',dpi=150,bbox_inches='tight')# 保存为PDF(适合打印)plt.savefig('strategy_report.pdf',bbox_inches='tight')# 使用mplfinance保存mpf.plot(df_ohlc.tail(100),type='candle',style='charles',savefig='kline_chart.png')

九、实用技巧

9.1 设置中文字体

importmatplotlib.pyplotasplt# Windowsplt.rcParams['font.sans-serif']=['SimHei']plt.rcParams['axes.unicode_minus']=False# Mac# plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']

9.2 自定义样式

# 使用内置样式plt.style.use('seaborn-darkgrid')# 或自定义plt.rcParams.update({'figure.facecolor':'white','axes.facecolor':'white','axes.grid':True,'grid.alpha':0.3,'font.size':10,})

9.3 交互式图表(Plotly)

importplotly.graph_objectsasgofromplotly.subplotsimportmake_subplots# 创建K线图fig=make_subplots(rows=2,cols=1,shared_xaxes=True,vertical_spacing=0.03,row_heights=[0.7,0.3])# K线fig.add_trace(go.Candlestick(x=df_plot.index,open=df_plot['open'],high=df_plot['high'],low=df_plot['low'],close=df_plot['close'],name='K线'),row=1,col=1)# 成交量fig.add_trace(go.Bar(x=df_plot.index,y=df_plot['volume'],name='成交量'),row=2,col=1)fig.update_layout(title='交互式K线图',xaxis_rangeslider_visible=False)fig.show()

十、总结

期货数据可视化的核心:

  1. 选对工具:matplotlib基础、mplfinance专业K线、plotly交互式
  2. 图表清晰:信息明确、不要过度装饰
  3. 代码复用:封装成函数,方便重复使用

希望这篇文章能帮助你更好地进行期货数据可视化!


声明:本文基于个人学习经验整理,仅供技术交流参考,不构成任何投资建议。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 8:51:05

计算机专业到底怎么学?核心就俩字:动手实践!

计算机专业到底怎么学&#xff1f;核心就俩字&#xff1a;动手实践&#xff01;计算机专业真的不是靠背知识点、看网课、记笔记就能学好的&#xff0c;纯理论学习到最后只会变成 “纸上谈兵”—— 面试写不出一行完整代码&#xff0c;给个需求连项目框架都搭不起来&#xff0c;…

作者头像 李华
网站建设 2026/4/18 6:55:13

Astro快速食用指南:从零到打造你的静态博客

轻量、极速、现代的静态网站生成框架。 一文带你从安装到实战&#xff0c;彻底掌握 Astro。 Astro 是什么&#xff1f; Astro 是一个现代的前端框架&#xff0c;用来构建静态网站和内容驱动的项目&#xff08;如博客、文档站、作品集等&#xff09;。它最大的特点是&#xff1…

作者头像 李华
网站建设 2026/4/18 8:03:10

散点图线性拟合全解析:从原理到实战优化指南

散点图线性拟合全解析&#xff1a;从原理到实战优化指南 引言 在数据分析和机器学习领域&#xff0c;散点图线性拟合是揭示变量间关系最直观、最经典的方法之一。无论是探索趋势、预测未来&#xff0c;还是校准仪器&#xff0c;一条简单的直线背后蕴含着深刻的统计思想与工程…

作者头像 李华
网站建设 2026/4/17 13:40:31

5 款 AI 写论文哪个好?盲测后:虎贲等考 AI 凭 “真材实料” 稳坐 C 位

“用 ChatGPT 写的论文被查出假文献”“WPS AI 生成的实证章节只有文字没图表”“试了 5 款工具&#xff0c;只有它能产出带真实数据的完整论文”—— 毕业季选 AI 写论文软件&#xff0c;最忌 “金玉其外”&#xff1a;表面生成速度快&#xff0c;实则文献虚假、数据空洞、逻辑…

作者头像 李华