Lazy loaded image
基于问财数据驱动的股票与可转债量化交易系统:清仓、分配、买入,全自动运行
00 分钟
2024-12-19
2024-12-19
type
status
date
slug
summary
tags
category
icon
password
这段代码实现了一个完整的 股票与可转债的交易策略,通过“问财”接口获取交易标的,并利用QMT交易接口实现买卖操作。下面将按模块详细解释整个交易逻辑:

1. 交易主逻辑 main()

  1. 初始化交易接口
      • XtQuantTrader:初始化交易接口,生成唯一 session_id 并连接QMT交易平台。
      • 检查交易接口是否成功连接,失败则直接退出程序。
  1. 账号订阅与回调注册
      • StockAccount:订阅账户信息。
      • MyXtQuantTraderCallback:注册回调,接收交易状态反馈,包括连接断开、委托状态及失败信息等。
  1. 设置定时任务
      • 定义问财查询任务及执行时间,例如:
        • 涨幅大于5%的转债
        • 股价创60日新高的股票
      • 使用 schedule 库按设定时间(如 14:30)执行查询和交易。
  1. 执行任务循环
      • 在主线程中不断检测定时任务,每秒轮询一次,执行定时任务。

2. 问财数据获取

函数:get_wencai_data(query)
  • 通过 pywencai 接口获取指定条件的证券数据。
  • 根据 query 的类型(股票、基金或转债)自动选择查询模式。
  • 返回一个证券代码列表供交易模块使用。

3. 交易执行 execute_wencai_strategy()

主要功能:根据问财数据自动化执行交易策略。

3.1 检查交易时间

  • 函数:is_trading_time()
    • 仅在交易时间(周一至周五 9:30-11:30 和 13:00-15:00)内执行交易。
    • 若非交易时间,直接退出。

3.2 获取交易标的

  • 尝试执行多个问财查询,直到返回有效数据为止。
  • 查询返回的标的列表:
    • codes:新的问财选中标的代码列表。
    • holding_codes:当前账户的持仓代码。

3.3 卖出操作

  1. 遍历当前持仓,查找 不在新选中标的中的持仓
  1. 对于符合条件的标的:
      • 计算可用数量,并生成卖出委托数据。
      • 委托数据添加到 sell_positions
  1. 调用 place_orders() 执行卖出操作。
  1. 等待1秒,确保卖出委托完成。

3.4 计算买入策略

  1. 获取当前账户可用现金。
  1. 买入新标的:
      • 将可用现金均分到未持仓的选中标的。
      • 获取实时价格,计算每个标的的委托数量。
      • 委托数量根据证券类型进行四舍五入(股票为100股倍数、转债为10张倍数)。
  1. 追加持仓:
      • 如果没有新标的,则将现金平均分配到已持仓标的上,进行追加买入。

3.5 买入操作

  • 将所有买入委托数据整理成DataFrame。
  • 调用 place_orders() 执行买入操作。
  • 具体执行场景举例:
场景1:有新证券需要买入
  • 当前持仓:100只
  • 策略结果:90只(其中80只与持仓重叠)
  • 卖出20只(100-80)不在策略中的股票
  • 获得卖出资金后,只分配给10只新买入的股票(90-80)
  • 每只新股票分配资金 = 总资金 / 10
  • 根据最新价格和分配资金计算买入数量(四舍五入取整)
场景2:没有新证券买入
  • 当前持仓:100只
  • 策略结果:90只(全部在持仓中)
  • 卖出10只(100-90)不在策略中的股票
  • 获得卖出资金后,平均分配给90只保留的持仓
  • 每只持仓分配资金 = 总资金 / 90
  • 根据最新价格和分配资金计算买入数量(四舍五入取整)

4. 委托下单与撤单逻辑 place_orders()

负责处理具体的交易逻辑,包括下单和撤单。
  1. 撤销未完成订单
      • 查询所有未成交订单并撤单,避免重复交易。
  1. 委托操作
      • 判断买入或卖出类型 (xtconstant.STOCK_BUY / xtconstant.STOCK_SELL)。
      • 卖出时检查持仓的可用数量,若不足则卖出剩余持仓。
      • 买入时检查账户现金是否足够,若不足则跳过。
  1. 设置委托价格类型
      • 若委托价格为 0,使用对手方最优价或最新价。
      • 若有明确价格,使用固定价格类型。
  1. 报单与反馈
      • 通过 xt_trader.order_stock() 提交委托。
      • 打印委托结果,包含订单ID、证券代码、操作类型、数量和价格。

5. 工具函数

  1. 获取实时价格 get_stock_price()
      • 通过 xtdata.get_full_tick() 获取单个证券的最新价格。
  1. 计算委托数量 calculate_order_volume()
      • 根据分配资金和最新价格,计算委托数量。
      • 不同证券类型(股票/转债)使用不同的四舍五入逻辑。

6. 回调函数

MyXtQuantTraderCallback 提供交易接口回调:
  1. 断线重连提示on_disconnected()
  1. 委托回报on_stock_order()
  1. 错误处理on_order_error()

7. 核心策略总结

  1. 清仓操作
      • 卖出所有不在问财新选标的列表中的持仓。
  1. 资金分配与买入操作
      • 将可用资金平均分配给新选标的或已持仓标的。
      • 按实时价格计算买入数量,并执行买入委托。
  1. 动态调整持仓
      • 每天按设定时间查询最新选标,通过卖出旧持仓、买入新标的实现仓位动态调整。

8. 运行环境与依赖

  1. 依赖库
      • pywencai:用于从“问财”获取数据。
      • xtquant:国金QMT交易接口。
      • schedule:用于定时任务调度。
      • pandasmath:数据处理与计算支持。
  1. 运行条件
      • 配置正确的 QMT 交易路径与账号信息。
      • 网络稳定,确保问财数据和QMT接口顺利连接。

9. 代码执行流程总结

  1. 启动交易接口并订阅账户。
  1. 在指定时间运行问财查询,获取选中标的。
  1. 清仓不在选中列表的持仓,释放资金。
  1. 将资金分配给新标的或现有标的,并执行买入操作。
  1. 提供交易状态反馈,确保执行过程顺畅。

结论

这段代码逻辑清晰且结构完整,能够通过问财策略动态调整持仓,实现自动化交易。
确保运行环境正确配置,交易时间精准设定,即可稳定运行此程序。
上一篇
QMT与通达信结合3.0,监测交易系统:通达信公式自动交易系统
下一篇
指数评估:A股年末行情展望,震荡寻底,静待突破

评论
Loading...