Lazy loaded image
python量化分析:打造你的股票分析工具,从通达信数据获取开始
00 分钟
2024-11-17
2024-11-18
type
status
date
slug
summary
tags
category
icon
password
这篇文章将深入分析一段 Python 代码,该代码用于从通达信交易平台获取股票行情数据。我们将探讨代码的目的、功能、结构、使用的库、潜在的限制以及改进建议,并提供流程图以帮助理解代码执行过程。
 

yuhanbolh 库直接调用

该代码已经直接封装到个人开源库,可直接调用,不用那么烦琐,如何下面的代码,具体查看 yuhanbolh 文档的:

代码目的和功能

这段代码的主要目的是从通达信服务器获取各种类型的股票市场数据,包括盘口数据(买卖五档)、K 线数据、市场股票数量、指数 K 线数据、历史分钟数据、历史分笔成交以及财务数据。
它通过连接通达信服务器,发送请求并接收数据,然后将数据转换为 Pandas DataFrame 格式,方便用户进行后续分析和处理。

代码结构和组织方式

代码采用了模块化的设计,主要分为三个函数:
  1. get_tdx_market_address():负责从通达信配置文件 connect.cfg 中读取服务器 IP 地址和端口号。
  1. get_financial_data():负责连接通达信服务器,使用指定的函数获取数据,并将数据转换为 Pandas DataFrame。
  1. main 部分(if __name__ == "__main__":):负责调用上述两个函数,演示如何获取不同类型的市场数据。
这种模块化的设计提高了代码的可读性和可维护性,方便用户根据需要修改和扩展功能。

代码中任何复杂或不寻常的方面

代码中一个值得注意的方面是 get_financial_data() 函数使用了 lambda 表达式。这使得可以将不同的数据获取函数作为参数传递给 get_financial_data(),从而实现代码的复用。
例如,要获取盘口数据,可以传递 lambda api: api.get_security_quotes(...);要获取 K 线数据,可以传递 lambda api: api.get_security_bars(...)

代码的潜在限制和改进建议

  1. 错误处理: 代码的错误处理机制可以改进。例如,在 get_tdx_market_address() 函数中,如果配置文件不存在或格式错误,应该提供更详细的错误信息,并可以选择使用默认的服务器地址。
  1. 异常处理: get_financial_data() 函数使用了 try...except 块来捕获异常,但这不够精细。应该捕获更具体的异常类型,例如网络连接错误、数据解析错误等,并提供相应的处理逻辑。
  1. 重连机制: 如果网络连接中断,代码应该尝试重新连接服务器。
  1. 数据校验: 代码没有对接收到的数据进行校验,例如检查数据是否完整、格式是否正确等。
  1. 异步处理: 可以使用异步编程来提高数据获取效率,尤其是在需要获取大量数据的情况下。

代码中使用的编程语言和库的简要概述

代码使用 Python 编程语言,并依赖于以下库:
  • pytdx:用于连接通达信服务器并获取数据。
  • configparser:用于读取配置文件。
  • os:用于操作文件系统。
  • pandas:用于数据处理和分析。

代码流程图 (Mermaid)

https://tse3.mm.bing.net/th/id/OIG3.Jco2r0253_spfSFp07mS

深入讨论:pytdx库和通达信API

pytdx 库是 Python 中用于访问通达信行情数据的关键工具。它封装了通达信的 API 接口,使得开发者可以使用 Python 代码方便地获取股票、期货、期权等市场数据。该库支持多种数据类型,例如实时行情、K 线数据、财务数据等。
这段代码中,pytdx.hq.TdxHq_API() 创建了一个 API 对象,用于与通达信服务器进行通信。api.connect() 方法用于建立与服务器的连接,api.disconnect() 方法用于断开连接。其他方法,例如 get_security_quotes()get_security_bars() 等,用于获取不同类型的市场数据。

实际应用和扩展

这段代码可以作为基础框架,用于构建更复杂的股票分析应用程序。例如,可以结合其他 Python 库,例如 matplotlibseaborn,对获取的数据进行可视化分析。还可以使用机器学习算法对数据进行建模和预测。

代码

获取的数据

获取盘口数据(买卖五档)

函数 api.get_security_quotes;参数为分别为市场代码(0 为深,1 为沪),股票代码。 get_financial_data(ip, port, lambda api: api.get_security_quotes([(0, '000001'),(0,'000002')]))
数据如下:
market
code
active1
price
last_close
open
high
low
servertime
reversed_bytes0
reversed_bytes1
vol
cur_vol
amount
s_vol
b_vol
reversed_bytes2
reversed_bytes3
bid1
ask1
bid_vol1
ask_vol1
bid2
ask2
bid_vol2
ask_vol2
bid3
ask3
bid_vol3
ask_vol3
bid4
ask4
bid_vol4
ask_vol4
bid5
ask5
bid_vol5
ask_vol5
reversed_bytes4
reversed_bytes5
reversed_bytes6
reversed_bytes7
reversed_bytes8
reversed_bytes9
active2
0
000001
4565
11.44
11.54
11.5
11.61
11.42
14:59 :55.885
14998857
-1144
1215783
13355
1.399309e+09
559943
655841
0
139449
11.44
11.45
6281
3170
11.43
11.46
5718
5392
11.42
11.47
23460
738
11.41
11.48
6109
769
11.40
11.49
26457
1344
(3286,)
0
0
0
0
0
0.09
0
000002
4702
8.71
8.95
8.9
8.95
8.70
14:59 :56.868
14999130
-871
1628734
27001
1.436246e+09
849810
778924
0
148301
8.70
8.71
23138
3580
8.69
8.72
4219
7305
8.68
8.73
7850
3958
8.67
8.74
1154
6850
8.66
8.75
2506
3296
(2774,)
0
0
0
0
0
-0.22

获取 K 线数据

函数 api.get_security_bars;参数为分别为 K 线类型(0 为分时,1 为 1 分钟,2 为 5 分钟,3 为 15 分钟,4 为 30 分钟,5 为 60 分钟),市场代码(0 为深,1 为沪),股票代码,索引(0 为最新,1 为前一,2 为前二),数量。 get_financial_data(ip, port, lambda api: api.get_security_bars(9, 0, '000001', 0, 3))
数据如下:
open
close
high
low
vol
amount
year
month
day
hour
minute
datetime
11.50
11.61
11.70
11.48
1086263.0
1.260162e+09
2024
11
13
15
0
2024-11-13 15:00
11.59
11.54
11.70
11.53
1159783.0
1.348378e+09
2024
11
14
15
0
2024-11-14 15:00
11.50
11.44
11.61
11.42
1215783.0
1.399309e+09
2024
11
15
15
0
2024-11-15 15:00

获取指数 K 线数据

类同获取 K 线数据,函数 api.get_index_bars;参数为分别为 K 线类型(0 为分时,1 为 1 分钟,2 为 5 分钟,3 为 15 分钟,4 为 30 分钟,5 为 60 分钟),市场代码(0 为深,1 为沪),指数代码,索引(0 为最新,1 为前一,2 为前二),数量 get_financial_data(ip, port, lambda api: api.get_index_bars(9, 1, '000001', 1, 2))
数据如下:
open
close
high
low
vol
amount
year
month
day
hour
minute
datetime
up_count
down_count
3406.92
3439.28
3442.30
3404.53
6736623.0
8.294353e+11
2024
11
13
15
0
2024-11-13 15:00
1166
1074
3429.51
3379.84
3441.77
3376.15
6315566.0
7.628842e+11
2024
11
14
15
0
2024-11-14 15:00
183
2113

获取历史分钟数据

函数 api.get_history_minute_time_data;参数为分别为市场代码(0 为深,1 为沪),股票代码,日期。 get_financial_data(ip, port, lambda api: api.get_history_minute_time_data(0, '000001', 20241115))
数据如下:
price
vol
11.48
71782
11.46
40120
11.46
42348
11.49
11178
11.48
16175
11.48
13429
11.51
10393

获取历史分笔成交

函数 api.get_transaction_data;参数为分别为市场代码(0 为深,1 为沪),股票代码,索引(0 为最新,1 为前一,2 为前二),数量 get_financial_data(ip, port, lambda api: api.get_transaction_data(0, '000001', 0, 30))
数据如下:
time
price
vol
num
buyorsell
14:55
11.44
77
11
0
14:55
11.44
395
25
0
14:55
11.44
342
23
0
14:55
11.44
307
24
0
14:55
11.44
1209
78
0
14:55
11.44
182
11
0
14:55
11.43
151
16
1
14:55
11.43
223
38
1

获取财务数据

函数 api.get_finance_info;参数为分别为市场代码(0 为深,1 为沪),股票代码 get_financial_data(ip, port, lambda api: api.get_finance_info(0, '000001'))
数据如下:
market
code
liutongguben
province
industry
updated_date
ipo_date
zongguben
guojiagu
faqirenfarengu
farengu
bgu
hgu
zhigonggu
zongzichan
liudongzichan
gudingzichan
wuxingzichan
gudongrenshu
liudongfuzhai
changqifuzhai
zibengongjijin
jingzichan
zhuyingshouru
zhuyinglirun
yingshouzhangkuan
yingyelirun
touzishouyu
jingyingxianjinliu
zongxianjinliu
cunhuo
lirunzonghe
shuihoulirun
jinglirun
weifenpeilirun
meigujingzichan
baoliu2
0
000001
1.940562e+10
18
1
20241019
19910403
1.940592e+10
19660000.0
3.963500e+11
1.276340e+12
0.0
0.0
19400.000572
5.745988e+13
0.0
8.753000e+10
6.153000e+10
517695.0
0.0
0.0
8.071500e+11
4.904690e+12
1.115820e+12
6.371300e+11
0.0
4.786900e+11
1.837200e+11
1.371580e+12
-1.891300e+11
0.0
4.774400e+11
3.972900e+11
3.972900e+11
2.398990e+12
21.67
9.0

获取市场股票数量

函数 api.get_security_count;参数为市场代码(0 为深,1 为沪) get_financial_data(ip, port, lambda api: api.get_security_count(0))
数据如下:
value
19367
上一篇
11-18收评:创业板指三连阴,破净股逆势突围
下一篇
指数评估:A股市场震荡加剧,如何在波动中寻找投资机会?

评论
Loading...