trade项目代为交易

  • 初始项目名: xtquant
    • 项目目的: 对xtquant(迅投)这个库的梳理和结构化
  • 之后的项目变迁历史:
    • 2025-05-23: 新建项目
    • 2025-05-24: 改名: 记录自己的交易
    • 2025-07-09: 改名: qmt web server
    • 2025-07-12: 改名: trade项目, 代为交易

笔记归档/历史演草

  • xttrade交易
    • 2020初稿
    • 快速入门:
      • xtquant.xttrader下引入:
        • XtQuantTrader, XtQuantTraderCallback
        • (吐槽: 全都xt开头)
        • 基础用法: 继承class MyXtQuantTraderCallback(XtQuantTraderCallback)
        • 定义一个自己的callback类, 下面各种情形的callback
      • xtquant.xttype引入:
        • StockAccount
      • xtquant引入:
        • xtconstant
      • 基础用法/流程:
        • path = ‘D:\迅投极速交易终端 睿智融科版\userdata_mini’. 指向这个文件夹
        • 不同策略可以使用不同sessionid
        • 实例化XtQuantTrader -> 获得一个trader
        • 实例化StockAccount(‘1000000365’)
        • 实例化回调类, 并绑定到trader
        • —以上是初始化变量部分—
        • trader.start(), 启动, 不知道干嘛的(默认为启动miniqmt exe)
        • trader.connect()获得connect, 默认为miniqmt exe连接到交易所
        • subscribe_result = trader.subscribe(acc), “对交易回调进行订阅,订阅后可以收到交易主推”. 默认为, 只有订阅才能之后获得下单是否成功等消息
        • (吐槽: 暴漏太多环节, 不够简洁与小白, 要是我, 直接提供账户与认证就能下单了. 下单自动返回回调/或下单时填入回调函数)
        • — 以上是网络连接 —
        • trader.order_stock(…). 填入账户/股票代码, 可选填入xtconstant.STOCK_BUY(买还是卖), 数量(200/100的倍数). xtconstant.FIX_PRICE(定价挂单还是卖一价), 策略名, 备注 -> 后面这两个就其实迅投不用提供/提供也行
        • — 以上是下单 —, 也就一行代码
        • trader.cancel_order_stock, 撤单
        • trader.order_stock_async, 异步下单
        • 更多trader.相关函数: query_stock_orders, 查询当日所有委托. 查询当日所有成交: query_stock_trades, 查询当日所有持仓: query_stock_positions, 查询对应股票的持仓: query_stock_position
        • trader.run_forever(): 阻塞线程,接收交易推送: 似乎是callback的地盘了
    • 数据字典, xtconstant.下的变量
      • 市场: xtconstant.SH_MARKET上交, SZ_MARKET深交
      • 账号类型: SECURITY_ACCOUNT: 股票
      • (即, 自己使用到的是很少的内容, 1/5或1/10的内容, 或者说, 股票本身只有百行以内的内容/有限且少, 去除期货/港股通/信用与两融)
      • 委托类型: STOCK_BUY买入, STOCK_SELL卖出
      • 报价: LATEST_PRICE最新价, FIX_PRICE定价, MARKET_SH_CONVERT_5_CANCEL(最优五档即时成交剩余撤销), MARKET_SH_CONVERT_5_LIMIT(最优五档即时成交剩转限价?), 对手方最优价格委托: xtconstant.MARKET_PEER_PRICE_FIRST, 本方最优价格委托: xtconstant.MARKET_MINE_PRICE_FIRST
      • 委托状态: 现查就行. 例如.ORDER_SUCCEEDED, 值为56, 已成. .ORDER_XXX
      • 账号状态: 例如ACCOUNT_STATUS_OK, 正常, 值为0
    • 数据结构, 各种类
      • XtAsset资产: 资金账号, 可用资金, 市值, 等
      • XtOrder委托: 账号, 订单号, 股票号, 数量, 价格, 均价, 等
      • XtTrade成交: 账号, 股票号, 成交时间, 数量, 金额, 等
      • XtPosition持仓: “账号/股票号, 算是经典必带成员变量了”, 这里是单个股票的持仓, 上面asset是用户总资产
      • 其他XtXXX各种, 例如XtCancelError撤单失败: 订单编号, 失败码, 失败信息
    • api接口, 函数
      • (注: 上面是预定义/变量声明环节, 这里才是具备动态性/逻辑流程相关的)
      • (注: 只有操作接口和系统设置接口是需要看下的. 其他都无需要, 或比较直观/简单: 查询接口)
      • 操作接口也就下单和撤单, (附加同步和异步两种区分)
      • (注: 即, xtquant这里的下单只是最纯粹的裸下单接口. 无任何回测/策略级别的内容)
  • 笔记归档: 记录自己的交易
    • 核心目的: 将交易记录添加到每周diary中
    • 细分目的:
      • 1, 建立一个trader项目, 专门只用于下单, 不涉及行情, 不涉及策略. 只是一个代购员/采购员
      • 2, 利出一孔, 我的手动下单也由这个trader来代为完成
    • miniqmt打开后只能下单
    • 目的3:
      • 1, 自律, 反思自己的操作, 优化自己的操作
        • 而操作的可选项/可改进项只有: 股票代码, 买入还是卖出/以及价格
  • 笔记归档: xtquant库
    • 放在python库里: pip3 –version:
      • /usr/lib/python3/dist-packages/
      • C:\storage\software\python3.11.4\Lib\site-packages\
    • 前置项目: AI读代码
      • 结论: 还是windsurf
  • 笔记归档: 记录的形式
    • 形式1: 周账户变动对比
      • 即, 把周账户作为一个etf曲线来监控
    • 形式2: 关注于笔数
      • 券商中的死数据/无法看出盈亏: 买入卖出, 成交笔数, 成交价格
      • 关于胜率/平均盈利点数/平均持有时长
        • 数学期望
          • 凯利公式等是之后的事
    • 分析1:
      • 1, 目的1: 可优化项就是需要关注项: 股票代码, 买还是卖, 价格/数量
      • 2, 整体账户的资金利用率要做起来
    • 分析2/deepseek:
      • 交易记录的颗粒度、归因逻辑和资金流动干扰,直接影响绩效分析的准确性
      • 1, 总资产: 模糊但必要
        • 整体资金曲线
      • 2, 区分各个策略的账户
        • 注明注资与抽资
      • 3, 每笔交易
        • 策略标签, 交易意图(试探性建仓/止盈/止损/主力买入/跌破20日均线)
        • 主力买入必须严格符合入场条件
      • 4, 仓位全平后计算总盈亏
      • (注: 税务视角, FIFO): 卖出最早买入的份额
      • 5, 隔离新老资金
        • 新资金视为新一期投资, 单独计算收益率
        • 定期再平衡: 定期调整各策略划拨的资金量
  • 笔记归档: 走势图小组件
    • 用处/目的: 放在周报里 -> 核心用处
    • 实际交易下单
  • 其他地方的笔记合并过来:
    • 纳指ETF日频+石油黄金ETF轮动, 手动条件单下单
    • 回测系统
    • k线, 技术指标
      • “沉迷交易者要拯救小魅魔”
      • 同花顺k线训练营

基础信息

  • 交易端:
    • 账号: ██████████
    • 密码: ██████
  • 模拟端:
    • 账号: ████████
    • 密码: ██████
  • 股票代码: 513000.SH

项目设想与调研

xtquant二次封装

  • 以终为始, 先看下qmt.py内需要支持什么用法
    • “具体到实施, 我打算新建一个qmt repo. 内部有两个文件夹: server(搭在windows上, 用于操控qmt并提供flask接口) 和 qmt (一个文件夹, 之后会作为module被import后使用, 用于请求flask url接口, 返回数据). 我当前打算以终为始, 先确定下qmt这个模组需要支持什么用法. 你有好的建议吗? 我打算分为: order.py(用于下单), query_market.py(用于查询当前行情/历史行情/股票总列表等), query_profile.py(用于查询我自己的相关信息: 持仓查询/资金查询/委托订单查询/成交历史查询). 你有修改或补充吗”
  • qmt/
    • trade.py
    • account.py
    • market.py
  • server/
    • connect.py
    • qmt
      • trade.py
      • account.py
      • market.py
    • server.py
  • 实现顺序:
    • 先实现基础连接和认证
    • 实现查询类接口(账户/持仓)
    • 实现行情订阅基础功能
    • 实现下单/撤单基础功能
  • 补充:
    • 1, uptime监控页接口 -> /health接口, 2xx/3xx视为up
    • 2, 错误码体系
  • 旁支任务: wsl1安装
    • Proxifier安装
    • (注: 这类旁支任务可以绕过, 以核心任务为要)
  • 看公众号文章
    • 基于tick/kline -> 传统版本
    • xtdata, xttrader
    • 行情: 订阅, 查询
    • pandas, 缩写: np, pd
    • 板块分类信息等静态信息更新频率低,无需频繁下载,按周或按日定期下载更新即可
  • 附录:
    • 1, ETF轮动无需关注财务数据: 资产, 负债, 利润
    • 2, ETF需要关心资金规模, 跟踪误差
  • xtquant接口文档
    • xtdata
      • download_history_data(‘90000967.SZO’, period=’tick’)
      • get_local_data(field_list=[], stock_code=[‘90000967.SZO’], period=’tick’, count=10)
    • 附录:
      • 1, 000001.SZ 600000.SH
      • 2, tick - 分笔数据, 1m - 1分钟线, 5m - 5分钟线, 15m - 15分钟线, 30m - 30分钟线, 1h - 1小时线, 1d - 日线, 1w - 周线, 1mon - 月线, 1q - 季度线, 1hy - 半年线, 1y - 年线
      • 3, 时间范围: [start_time, end_time]
      • 4, dividend_type /除权方式: none 不复权, front 前复权, back 后复权, front_ratio 等比前复权, back_ratio 等比后复权

akshare行情封装

  • gkxk.market包的开发: 调用akshare, 不存入db, 只存入本地cache
    • get_data
    • get_list
  • 参数:
    • period:
      • 1m, 5m, 15m, 30m, 1h, 1d, 1w, 1mon, 1q, 1hy, 1y
    • code:
      • 123456.SZ, .SH -> code.exchange
    • start_time = ‘’
    • end_time: 为空则视为最早/最晚时间
    • dividend_type: none 不复权, front 前复权, back 后复权, front_ratio 等比前复权, back_ratio 等比后复权
  • 数据
    • k线数据:
1
2
3
4
5
6
7
8
9
10
11
'time'                  #时间戳
'open' #开盘价
'high' #最高价
'low' #最低价
'close' #收盘价
'volume' #成交量
'amount' #成交额
'settelementPrice' #今结算
'openInterest' #持仓量
'preClose' #前收价
'suspendFlag' #停牌标记 0 - 正常 1 - 停牌 -1 - 当日起复牌
  • Exceptions:
    • 证券状态: 闭市, 网络中断
  • 经验教训:
    • fund_name_em, fund_individual_basic_info_xq, fund_info_index_em, fund_purchase_em: 这些都是基金/经理类型的
  • 实时全品种行情
    • fund_etf_spot_em:
      • 代码, 名称, 最新价, IOPV实时估值, 基金折价率, 涨跌额, 涨跌幅, 成交量, 成交额, 开盘价, 最高价, 最低价, 昨收, 振幅, 换手率, 量比, 委比, 外盘, 内盘, 主力净流入-净额, 主力净流入-净占比, 超大单净流入-净额, 超大单净流入-净占比, 大单净流入-净额, 大单净流入-净占比, 中单净流入-净额, 中单净流入-净占比, 小单净流入-净额, 小单净流入-净占比, 现手, 买一, 卖一, 最新份额, 流通市值, 总市值, 数据日期, 更新时间
    • fund_etf_spot_ths:
      • 序号, 基金代码, 基金名称, 当前-单位净值, 当前-累计净值, 前一日-单位净值, 前一日-累计净值, 增长值, 增长率, 赎回状态, 申购状态, 最新-交易日, 最新-单位净值, 最新-累计净值, 基金类型, 查询日期
    • fund_lof_spot_em
    • fund_etf_category_sina
  • 单支历史行情:
  • 交易经验:
    • 封闭式基金不能买:
      • 1, 封闭式基金68个, LOF385个, ETF1212个
      • 2, 到期日干扰​​:封闭式基金到期后会转为开放式基金(“封转开”),价格强制回归净值。临近到期时,K线可能出现​​非市场因素的剧烈波动​​(如折价套利资金涌入)
      • 3, 流动性陷阱​​:68只封闭式基金中,​​80%日均成交额不足100万​​,容易被小额资金操控(如突然拉高出货),策略容易被“假突破”坑
    • LOF可买的原因:
      • 1, ​​主动型LOF​​:如163406(兴全合宜)、161903(万家行业优选),这些主动基金的K线可能跑赢指数(但需承担基金经理风格风险)。
      • 2, 小众指数LOF​​:如164824(印度基金)、160216(原油基金),ETF无替代品。
    • 关于LOF和ETF的配比/配合: 最优选择:ETF为主 + LOF补充
    • 剔除:
      • 剔除日均成交额<500万的LOF(避免流动性风险)。
      • 剔除规模<2亿元的LOF(避免清盘风险)
  • yfinance: 自带cache

trade项目代为下单

  • 首先要确定的: 对于我的需求, 需要开放哪些http接口