GBT量化结合VNPy运行不了

存档预览:部署一个处理期货交易数据的时间序列神经网络模型,机器、软件、数据收集如何做 做中国期货,3秒级,每天能有十次出入市就好 很好,可能是我表达不够清楚,我是要观察三秒或者五秒的K线,一…(全文以下方原始文本完整保留)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
部署一个处理期货交易数据的时间序列神经网络模型,机器、软件、数据收集如何做
做中国期货,3秒级,每天能有十次出入市就好
很好,可能是我表达不够清楚,我是要观察三秒或者五秒的K线,一次交易持仓可以在几分种几十分钟,知道5秒K线,30秒K线,1分钟K线组合显示要平仓或开仓
把“沪银 AG”做成一个完整示例
专门针对“沪银”的微结构alpha建模
给我中国期货3秒级交易系统项目目录和可运行代码骨架(CTP + LightGBM + 回测)
给我沪银微结构策略 v2(接近实盘)
帮做 v3 沪银微结构 v3(准实盘级)
v3的这些代码分别加在哪里,重新梳理下,或者给出各文件最终完整代码
ctp已经安装了vn.py,改了ctp/md_api.py:import logging
from vnpy_ctp.api import CtpMdApi, ApiStruct

class MdApiWrapper(CtpMdApi):
"""
基于 vnpy_ctp 封装的行情接口
"""

def __init__(self, config, on_tick_callback):
super().__init__()

self.config = config
self.on_tick = on_tick_callback

self.connection_status = False
self.login_status = False

# 记录已订阅的合约列表
self.subscribed_symbols = set()

# --- 核心回调接口 (Overriding CtpMdApi) ---

def onFrontConnected(self):
"""当网络连接建立时触发"""
logging.info("CTP行情前置连接成功")
self.connection_status = True
self.login()

def onFrontDisconnected(self, n: int):
"""当网络连接断开时触发"""
logging.warn(f"CTP行情连接断开,错误代码: {n}")
self.connection_status = False
self.login_status = False

def onRspUserLogin(self, data: dict, error: dict, reqid: int, last: bool):
"""登录请求响应"""
if error and error["ErrorID"] != 0:
logging.error(f"CTP登录失败: {error['ErrorMsg']}")
else:
logging.info(f"CTP登录成功: {data['UserID']}")
self.login_status = True
# 如果之前有订阅过的合约,重连后自动重新订阅
if self.subscribed_symbols:
self.subscribe(list(self.subscribed_symbols))

def onRtnDepthMarketData(self, data: dict):
"""
核心方法:当有新Tick行情时触发
vnpy 已经将 C++ 结构体转为了 Python 字典
"""
# 可以在这里做初步的数据清洗
tick = {
"symbol": data["InstrumentID"],
"last_price": data["LastPrice"],
"volume": data["Volume"],
"open_interest": data["OpenInterest"],
"datetime": f"{data['UpdateTime']}.{data['UpdateMillisec'] // 100}",
"bid_price_1": data["BidPrice1"],
"ask_price_1": data["AskPrice1"],
"bid_volume_1": data["BidVolume1"],
"ask_volume_1": data["AskVolume1"],
}
# 将数据推送到外部处理逻辑(如存入 data/raw_tick/)
self.on_tick(tick)

# --- 操作方法 ---

def login(self):
"""发送登录请求"""
req = {
"BrokerID": self.config.get("broker_id"),
"UserID": self.config.get("user_id"),
"Password": self.config.get("password"),
}
self.reqUserLogin(req, 1)

def subscribe(self, symbols: list):
"""订阅合约"""
if not self.login_status:
logging.warn("未登录成功,合约已记录,将在登录后尝试订阅")

for symbol in symbols:
self.subscribed_symbols.add(symbol)

if self.login_status:
self.subscribeMarketData(symbols)
logging.info(f"已发送订阅请求: {symbols}")

def connect(self):
"""初始化并启动 API"""
# 创建临时目录存放 CTP 生成的 .con 文件
import os
if not os.path.exists("temp"):
os.mkdir("temp")

self.createFtdcMdApi("temp/")
self.registerFront(self.config.get("md_address"))
self.init()
logging.info("CTP API 初始化完成")
uv run run/run_all.py
Traceback (most recent call last):
File "/root/ag_ctp_quant/run/run_all.py", line 3, in <module>
from feature.build_features import build_features
ModuleNotFoundError: No module named 'feature'
:~/ag_ctp_quant# uv run python -m run.run_all
Traceback (most recent call last):
File "<frozen runpy>", line 198, in _run_module_as_main
File "<frozen runpy>", line 88, in _run_code
File "/root/ag_ctp_quant/run/run_all.py", line 9, in <module>
df = pd.read_parquet("data/sample_tick.parquet")
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/root/ag_ctp_quant/.venv/lib/python3.12/site-packages/pandas/io/parquet.py", line 671, in read_parquet
return impl.read(
^^^^^^^^^^
File "/root/ag_ctp_quant/.venv/lib/python3.12/site-packages/pandas/io/parquet.py", line 253, in read
path_or_handle, handles, filesystem = _get_path_or_handle(
^^^^^^^^^^^^^^^^^^^^
File "/root/ag_ctp_quant/.venv/lib/python3.12/site-packages/pandas/io/parquet.py", line 141, in _get_path_or_handle
handles = get_handle(
^^^^^^^^^^^
File "/root/ag_ctp_quant/.venv/lib/python3.12/site-packages/pandas/io/common.py", line 935, in get_handle
handle = open(handle, ioargs.mode)
^^^^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: 'data/sample_tick.parquet'
/ag_ctp_quant# uv run python -m run.run_all
Found files: []
Traceback (most recent call last):
File "<frozen runpy>", line 198, in _run_module_as_main
File "<frozen runpy>", line 88, in _run_code
File "/root/ag_ctp_quant/run/run_all.py", line 15, in <module>
df = pd.concat([pd.read_parquet(f) for f in files])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/root/ag_ctp_quant/.venv/lib/python3.12/site-packages/pandas/core/reshape/concat.py", line 407, in concat
objs, keys, ndims = _clean_keys_and_objs(objs, keys)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/root/ag_ctp_quant/.venv/lib/python3.12/site-packages/pandas/core/reshape/concat.py", line 808, in _clean_keys_and_objs
raise ValueError("No objects to concatenate")
ValueError: No objects to concatenate
from ctp.md_api import MdApiWrapper
:~/ag_ctp_quant# PYTHONPATH=. uv run python run/collect.py
Traceback (most recent call last):
File "/root/ag_ctp_quant/run/collect.py", line 3, in <module>
from ctp.md_api import MdApiWrapper
File "/root/ag_ctp_quant/ctp/md_api.py", line 3, in <module>
from vnpy_ctp.api import CtpMdApi
ImportError: cannot import name 'CtpMdApi' from 'vnpy_ctp.api' (/root/ag_ctp_quant/.venv/lib/python3.12/site-packages/vnpy_ctp/api/__init__.py)
用vn.py重写collect
Connecting CTP...
2026-05-04 08:46:48.494 | INFO | MainEngine | 连接登录 -> CTP
2026-05-04 08:46:48.523 | INFO | CTP | 交易服务器连接成功
2026-05-04 08:46:48.525 | INFO | CTP | 行情服务器连接成功
terminate called after throwing an instance of 'std::runtime_error'
what(): locale::facet::_S_create_c_locale name not valid
z:~/ag_ctp_quant# LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 PYTHONPATH=. uv run python run/collect_vnpy.py
Connecting CTP...
2026-05-04 08:48:30.774 | INFO | MainEngine | 连接登录 -> CTP
2026-05-04 08:48:30.802 | INFO | CTP | 交易服务器连接成功
2026-05-04 08:48:30.805 | INFO | CTP | 行情服务器连接成功
terminate called after throwing an instance of 'std::runtime_error'
what(): locale::facet::_S_create_c_locale name not valid
root@iv-ydxz0mqayowuxjsqbmfz:~/ag_ctp_quant#
root@iv-ydxz0mqayowuxjsqbmfz:~/ag_ctp_quant# what(): locale::facet::_S_create_c_locale name not valid
-bash: syntax error near unexpected token :'
root@iv-ydxz0mqayowuxjsqbmfz:~/ag_ctp_quant# LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 PYTHONPATH=. uv run python run/collect_vnpy.py
Connecting CTP...
2026-05-04 08:48:30.774 | INFO | MainEngine | 连接登录 -> CTP
2026-05-04 08:48:30.802 | INFO | CTP | 交易服务器连接成功
2026-05-04 08:48:30.805 | INFO | CTP | 行情服务器连接成功
terminate called after throwing an instance of 'std::runtime_error'
what(): locale::facet::_S_create_c_locale name not valid
root@iv-ydxz0mqayowuxjsqbmfz:~/ag_ctp_quant# apt update
Hit:1 http://mirrors.ivolces.com/ubuntu focal InRelease
Hit:2 http://mirrors.ivolces.com/ubuntu focal-security InRelease
Hit:3 http://mirrors.ivolces.com/ubuntu focal-updates InRelease
Hit:4 http://mirrors.ivolces.com/ubuntu focal-backports InRelease
Reading package lists... Done
Building dependency tree
Reading state information... Done
All packages are up to date.
root@iv-ydxz0mqayowuxjsqbmfz:~/ag_ctp_quant# apt install -y locales
Reading package lists... Done
Building dependency tree
Reading state information... Done
locales is already the newest version (2.31-0ubuntu9.18).
locales set to manually installed.
The following packages were automatically installed and are no longer required:
libdw1 libnuma1
Use 'apt autoremove' to remove them.
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
root@iv-ydxz0mqayowuxjsqbmfz:~/ag_ctp_quant# dpkg-reconfigure locales
Generating locales (this might take a while)...
en_US.UTF-8... done
Generation complete.
root@iv-ydxz0mqayowuxjsqbmfz:~/ag_ctp_quant# locale-gen en_US.UTF-8
Generating locales (this might take a while)...
en_US.UTF-8... done
Generation complete.
root@iv-ydxz0mqayowuxjsqbmfz:~/ag_ctp_quant# update-locale LANG=en_US.UTF-8locale -a
Unknown option: a
*** update-locale: Error: invalid locale settings: LANG=en_US.UTF-8locale
root@iv-ydxz0mqayowuxjsqbmfz:~/ag_ctp_quant# locale-gen en_US.UTF-8^C
root@iv-ydxz0mqayowuxjsqbmfz:~/ag_ctp_quant# locale-gen en_US.UTF-8
Generating locales (this might take a while)...
en_US.UTF-8... done
Generation complete.
root@iv-ydxz0mqayowuxjsqbmfz:~/ag_ctp_quant# update-locale LANG=en_US.UTF-8
root@iv-ydxz0mqayowuxjsqbmfz:~/ag_ctp_quant# locale -a
C
C.UTF-8
en_US.utf8
POSIX
root@iv-ydxz0mqayowuxjsqbmfz:~/ag_ctp_quant# PYTHONPATH=. uv run python run/collect_vnpy.py
Connecting CTP...
2026-05-04 08:53:38.170 | INFO | MainEngine | 连接登录 -> CTP
2026-05-04 08:53:38.201 | INFO | CTP | 行情服务器连接成功
2026-05-04 08:53:38.202 | INFO | CTP | 交易服务器连接成功
terminate called after throwing an instance of 'std::runtime_error'
what(): locale::facet::_S_create_c_locale name not valid
root@iv-ydxz0mqayowuxjsqbmfz:~/ag_ctp_quant# export LANG=en_US.UTF-8
root@iv-ydxz0mqayowuxjsqbmfz:~/ag_ctp_quant# PYTHONPATH=. uv run python run/collect_vnpy.py
Connecting CTP...
2026-05-04 08:54:01.572 | INFO | MainEngine | 连接登录 -> CTP
2026-05-04 08:54:01.604 | INFO | CTP | 交易服务器连接成功
2026-05-04 08:54:01.606 | INFO | CTP | 行情服务器连接成功
terminate called after throwing an instance of 'std::runtime_error'
what(): locale::facet::_S_create_c_locale name not valid
root@iv-ydxz0mqayowuxjsqbmfz:~/ag_ctp_quant#
用的是uv,降python