在金融交易领域,实时数据的可视化是分析和决策的重要工具。通过将数据以图表的形式展示,交易者可以更直观地观察市场走势,从而做出更明智的交易决策。本文将详细介绍如何使用Python实现期货交易数据的实时可视化,并通过代码示例展示如何绘制两条数据线,分别显示在上下两个子图中,以便更清晰地观察数据的相关性。
在期货交易中,实时数据的获取和分析至关重要。通过实时数据可视化,交易者可以更直观地观察市场走势,从而做出更明智的交易决策。本文将介绍如何使用Python的tqsdk库获取期货交易数据,并使用matplotlib库将数据可视化。我们将展示如何在指定交易时间内获取数据,并将两条数据线分别绘制在上下两个子图中,以便更清晰地观察数据的相关性。
在开始之前,我们需要确保已经安装了所需的Python库。我们将使用tqsdk库来获取期货交易数据,并使用matplotlib库来绘制图表。可以通过以下命令安装这些库:
pip install tqsdk matplotlib首先,我们需要导入所需的Python库:
from tqsdk import TqApi, TqKq, TqAuth
import matplotlib.pyplot as plt
from datetime import datetime, time接下来,我们使用tqsdk库来获取期货交易数据。我们指定一个期货合约,并创建一个模拟账户来获取数据:
SYMBOL = "DCE.i2505" # 指定数据合约
api = TqApi(TqKq(), auth=TqAuth("890727", "150402")) # 模拟帐号
quote = api.get_quote(SYMBOL) # 获取合约基本信息
klines = api.get_kline_serial(SYMBOL, 12) # 获取合约12秒K线我们需要定义一个函数来计算两条数据线。数据1和数据2的计算方法如下:
def get_index_line(klines):
volume = (klines.volume.iloc[-2] + klines.volume.iloc[-3] +
klines.volume.iloc[-4] + klines.volume.iloc[-5] +
klines.volume.iloc[-6]) / 5
open_oi = (klines.open_oi.iloc[-2] + klines.open_oi.iloc[-3] +
klines.open_oi.iloc[-4] + klines.open_oi.iloc[-5] +
klines.open_oi.iloc[-6]) / 5
close_oi = (klines.close_oi.iloc[-2] + klines.close_oi.iloc[-3] +
klines.close_oi.iloc[-4] + klines.close_oi.iloc[-5] +
klines.close_oi.iloc[-6]) / 5
close = (klines.close.iloc[-2] + klines.close.iloc[-3] +
klines.close.iloc[-4] + klines.close.iloc[-5] +
klines.close.iloc[-6]) / 5
shuju1 = (close_oi - open_oi) / volume * 100 # 数据1
shuju2 = close / 100 # 数据2
return shuju1, shuju2为了更清晰地展示两条数据线,我们将使用matplotlib的subplot功能,将数据1和数据2分别绘制在上下两个子图中:
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 8))
fig.tight_layout(pad=5.0)我们将在指定交易时间内获取数据,并实时更新图表。以下是完整的代码实现:
# 存储时间和数据以便绘图
times = []
data1 = []
data2 = []
while True:
api.wait_update() # 等待行情更新
current_time = datetime.now().time()
# 设定交易时间条件
if (time(9, 0) <= current_time <= time(11, 30)) or \
(time(13, 30) <= current_time <= time(15, 0)) or \
(time(21, 0) <= current_time <= time(23, 0)):
if api.is_changing(klines.iloc[-1], "datetime"): # 合约行情更新时计算数据1和数据2
shuju1, shuju2 = get_index_line(klines)
print("数据1: %.2f, 数据2: %.2f" % (shuju1, shuju2))
# 记录时间和数据
times.append(datetime.now()) # 记录当前时间
data1.append(shuju1) # 记录数据1
data2.append(shuju2) # 记录数据2
# 清除之前的图
ax1.cla()
ax2.cla()
# 绘制数据1
ax1.plot(times, data1, label="数据1", color='blue')
ax1.set_xlabel("时间")
ax1.set_ylabel("数据1")
ax1.set_title("数据1的走势")
ax1.legend()
ax1.tick_params(axis='x', rotation=45)
# 绘制数据2
ax2.plot(times, data2, label="数据2", color='orange')
ax2.set_xlabel("时间")
ax2.set_ylabel("数据2")
ax2.set_title("数据2的走势")
ax2.legend()
ax2.tick_params(axis='x', rotation=45)
# 自适应布局
plt.tight_layout()
# 暂停以更新图形
plt.pause(1)
plt.show() # 展示图形以下是完整的代码实现,包括数据获取、处理和可视化:
from tqsdk import TqApi, TqKq, TqAuth
import matplotlib.pyplot as plt
from datetime import datetime, time
# 指定数据合约
SYMBOL = "DCE.i2505"
api = TqApi(TqKq(), auth=TqAuth("890727", "150402")) # 模拟帐号
quote = api.get_quote(SYMBOL) # 获取合约基本信息
klines = api.get_kline_serial(SYMBOL, 12) # 获取合约12秒K线
# 定义数据1和数据2的计算函数
def get_index_line(klines):
volume = (klines.volume.iloc[-2] + klines.volume.iloc[-3] +
klines.volume.iloc[-4] + klines.volume.iloc[-5] +
klines.volume.iloc[-6]) / 5
open_oi = (klines.open_oi.iloc[-2] + klines.open_oi.iloc[-3] +
klines.open_oi.iloc[-4] + klines.open_oi.iloc[-5] +
klines.open_oi.iloc[-6]) / 5
close_oi = (klines.close_oi.iloc[-2] + klines.close_oi.iloc[-3] +
klines.close_oi.iloc[-4] + klines.close_oi.iloc[-5] +
klines.close_oi.iloc[-6]) / 5
close = (klines.close.iloc[-2] + klines.close.iloc[-3] +
klines.close.iloc[-4] + klines.close.iloc[-5] +
klines.close.iloc[-6]) / 5
shuju1 = (close_oi - open_oi) / volume * 100 # 数据1
shuju2 = close / 100 # 数据2
return shuju1, shuju2
# 存储时间和数据以便绘图
times = []
data1 = []
data2 = []
# 创建图形和子图
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 8))
fig.tight_layout(pad=5.0)
while True:
api.wait_update() # 等待行情更新
current_time = datetime.now().time()
# 设定交易时间条件
if (time(9, 0) <= current_time <= time(11, 30)) or \
(time(13, 30) <= current_time <= time(15, 0)) or \
(time(21, 0) <= current_time <= time(23, 0)):
if api.is_changing(klines.iloc[-1], "datetime"): # 合约行情更新时计算数据1和数据2
shuju1, shuju2 = get_index_line(klines)
print("数据1: %.2f, 数据2: %.2f" % (shuju1, shuju2))
# 记录时间和数据
times.append(datetime.now()) # 记录当前时间
data1.append(shuju1) # 记录数据1
data2.append(shuju2) # 记录数据2
# 清除之前的图
ax1.cla()
ax2.cla()
# 绘制数据1
ax1.plot(times, data1, label="数据1", color='blue')
ax1.set_xlabel("时间")
ax1.set_ylabel("数据1")
ax1.set_title("数据1的走势")
ax1.legend()
ax1.tick_params(axis='x', rotation=45)
# 绘制数据2
ax2.plot(times, data2, label="数据2", color='orange')
ax2.set_xlabel("时间")
ax2.set_ylabel("数据2")
ax2.set_title("数据2的走势")
ax2.legend()
ax2.tick_params(axis='x', rotation=45)
# 自适应布局
plt.tight_layout()
# 暂停以更新图形
plt.pause(1)
plt.show() # 展示图形本文详细介绍了如何使用Python实现期货交易数据的实时可视化。通过tqsdk库获取数据,并使用matplotlib库绘制图表,我们成功地将两条数据线分别显示在上下两个子图中,从而更清晰地观察数据的相关性。这种方法不仅适用于期货交易数据,还可以应用于其他需要实时数据可视化的场景。希望本文对您有所帮助,祝您在交易中取得更好的成绩!