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
|