Skip to content

如何用 Python 生成行情数据的量价关系图

Published: at 00:00

背景

一般来说,分析一个投资品种通常分为基本面分析和技术面分析。

基本面分析从宏观、中观和微观三个层面进行深入研究。宏观层面关注的是整个经济环境,行业趋势以及政策变化;中观层面则关注行业的整体表现、竞争态势及市场供需;微观层面则涉及期现结构、基差、升贴水、库存、利润、产能利用率、开工率和库存消费比等具体指标。这些因素共同作用,决定了投资品种的基本面情况。

技术面分析则侧重于通过市场价格和成交量等历史数据来研究价格走势与市场情绪,从而预测未来的价格变动。在技术分析中,有一种被广泛应用的方法叫做新威科夫分析法。该方法通过分析价格与成交量的关系,探究市场供求背后的真实意图,从而判断未来价格的变化趋势。

为了更直观地呈现量价关系,本文讲述使用 Python 实现基于行情数据的量价关系图生成,结合新威科夫分析法,可以有效地揭示市场动态,为投资决策提供有力支持。

说明

使用的开发语言主要是 Python,用的包主要有 pandas 和 matplotlib。

代码

日线行情数据说明

随便在网上下载一份日线数据,我这里下载的期货市场螺纹钢的日线数据,整理成rb.csv 文件,格式如下:

date,open,high,low,close,volume
20241105,3425,3458,3405,3433,2032842
20241104,3403,3483,3344,3425,3213882
20241101,3425,3434,3370,3393,2381801
20241031,3445,3451,3417,3427,2057799
20241030,3451,3469,3403,3442,2252191
20241029,3450,3460,3411,3422,1928067
20241028,3380,3479,3372,3451,2997381
20241025,3332,3389,3329,3376,2617330
20241024,3307,3340,3290,3330,2641100
20241023,3342,3362,3308,3316,2479153
20241022,3358,3367,3300,3349,2735345
20241021,3350,3376,3335,3358,2416552
20241018,3311,3384,3284,3336,3902945
20241017,3450,3486,3300,3300,4903326
20241016,3470,3502,3444,3447,3479402
20241015,3499,3512,3461,3467,3584093
20241014,3472,3534,3436,3502,4049131
20241011,3442,3484,3421,3468,3198181
20241010,3450,3511,3412,3442,3806663

设置中文环境

import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['PingFang HK', 'Heiti TC']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.family'] = 'sans-serif'
mpl.rcParams['font.size'] = 12
mpl.rcParams['font.weight'] = 'normal'

读取数据

df = pd.read_csv('./data/rb.csv', index_col=0, parse_dates=True)
df = df.loc['2024-07-01':'2024-11-05'].iloc[::-1]
df.info

画成交量图

代码
import matplotlib.dates as mdates

plt.figure(figsize=(10, 6))
plt.bar(df.index, df['volume'], color='b', alpha=0.6)

plt.title('RB2501成交量')
plt.xlabel('日期')
plt.ylabel('成交量')

plt.xticks(rotation=45)
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))  # 格式化日期为 "年-月-日"
plt.gca().xaxis.set_major_locator(mdates.DayLocator(interval=5))  # 设置日期间隔为5天,可以根据需要调整

plt.show()
图形

[1.png]

画收盘价图

代码
plt.figure(figsize=(10, 6))
#plt.plot(df['close'], marker='o')  plt.title('RB2501收盘价')
plt.xlabel('日期')
plt.ylabel('收盘价')
plt.xticks(rotation=45)
plt.step(df.index, df['close'], where='pre', marker=None)

plt.show()
图形

[2.png]

画成交量与收盘价图

代码
fig, ax1 = plt.subplots(figsize=(15, 8))
ax1.bar(df.index, df['volume'], color='purple', alpha=0.6, label='成交量')

ax2 = ax1.twinx()
ax2.step(df.index, df['close'], color='black', label='收盘价', marker=None)


ax1.set_title('RB2501 成交量与收盘价')
ax1.set_xlabel('日期')
ax1.set_ylabel('成交量', color='purple')
ax2.set_ylabel('收盘价', color='black')

ax1.xaxis.set_major_formatter(mdates.DateFormatter('%m-%d'))
ax1.xaxis.set_major_locator(mdates.DayLocator(interval=10))

plt.xticks(rotation=45)

ax1.legend(loc='upper center')
ax2.legend(loc='upper right')

plt.show()
图形

[3.png]

画成交量与收盘价上下图

代码
# 创建一个包含上下两个子图的图形
fig, (ax1, ax2) = plt.subplots(nrows=2, ncols=1, figsize=(10, 10), sharex=True)

# 绘制折线图在上部分的子图
ax1.step(df.index, df['close'], color='r', label='收盘价', marker=None)
# ax1.set_title('收盘价')
ax1.set_ylabel('收盘价')
ax1.legend(loc='upper right')

# 绘制柱形图在下部分的子图
ax2.bar(df.index, df['volume'], color='b', alpha=0.6, label='成交量')
#ax2.set_title('成交量')
ax2.set_ylabel('成交量')
ax2.legend(loc='upper left')


ax2.xaxis.set_major_formatter(mdates.DateFormatter('%m-%d')) # 格式化 x 轴的日期显示
ax2.xaxis.set_major_locator(mdates.DayLocator(interval=3))  # 设置日期间隔为3天

# 让 x 轴标签垂直显示
plt.xticks(rotation=90)

# 调整布局使上下部分图形更加清晰
fig.tight_layout()  # 自动调整布局,避免重叠

# 显示图表
plt.show()
图形

[4.png]

总结

新威科夫分析法是一种有效的技术面分析方法,通过量价关系揭示市场的真实意图。结合Python工具实现量价关系图生成,能够更加直观地分析市场动态,为投资决策提供数据支持,提升分析的深度与准确性。