type
status
date
slug
summary
tags
category
icon
password
这段代码实现了一个完整的 股票与可转债的交易策略,通过“问财”接口获取交易标的,并利用QMT交易接口实现买卖操作。下面将按模块详细解释整个交易逻辑:
1. 交易主逻辑 main()
- 初始化交易接口
XtQuantTrader
:初始化交易接口,生成唯一session_id
并连接QMT交易平台。- 检查交易接口是否成功连接,失败则直接退出程序。
- 账号订阅与回调注册
StockAccount
:订阅账户信息。MyXtQuantTraderCallback
:注册回调,接收交易状态反馈,包括连接断开、委托状态及失败信息等。
- 设置定时任务
- 定义问财查询任务及执行时间,例如:
涨幅大于5%的转债
股价创60日新高的股票
- 使用
schedule
库按设定时间(如14:30
)执行查询和交易。
- 执行任务循环
- 在主线程中不断检测定时任务,每秒轮询一次,执行定时任务。
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 卖出操作
- 遍历当前持仓,查找 不在新选中标的中的持仓。
- 对于符合条件的标的:
- 计算可用数量,并生成卖出委托数据。
- 委托数据添加到
sell_positions
。
- 调用
place_orders()
执行卖出操作。
- 等待1秒,确保卖出委托完成。
3.4 计算买入策略
- 获取当前账户可用现金。
- 买入新标的:
- 将可用现金均分到未持仓的选中标的。
- 获取实时价格,计算每个标的的委托数量。
- 委托数量根据证券类型进行四舍五入(股票为100股倍数、转债为10张倍数)。
- 追加持仓:
- 如果没有新标的,则将现金平均分配到已持仓标的上,进行追加买入。
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()
负责处理具体的交易逻辑,包括下单和撤单。
- 撤销未完成订单
- 查询所有未成交订单并撤单,避免重复交易。
- 委托操作
- 判断买入或卖出类型 (
xtconstant.STOCK_BUY
/xtconstant.STOCK_SELL
)。 - 卖出时检查持仓的可用数量,若不足则卖出剩余持仓。
- 买入时检查账户现金是否足够,若不足则跳过。
- 设置委托价格类型
- 若委托价格为
0
,使用对手方最优价或最新价。 - 若有明确价格,使用固定价格类型。
- 报单与反馈
- 通过
xt_trader.order_stock()
提交委托。 - 打印委托结果,包含订单ID、证券代码、操作类型、数量和价格。
5. 工具函数
- 获取实时价格
get_stock_price()
- 通过
xtdata.get_full_tick()
获取单个证券的最新价格。
- 计算委托数量
calculate_order_volume()
- 根据分配资金和最新价格,计算委托数量。
- 不同证券类型(股票/转债)使用不同的四舍五入逻辑。
6. 回调函数
MyXtQuantTraderCallback
提供交易接口回调:- 断线重连提示:
on_disconnected()
- 委托回报:
on_stock_order()
- 错误处理:
on_order_error()
7. 核心策略总结
- 清仓操作:
- 卖出所有不在问财新选标的列表中的持仓。
- 资金分配与买入操作:
- 将可用资金平均分配给新选标的或已持仓标的。
- 按实时价格计算买入数量,并执行买入委托。
- 动态调整持仓:
- 每天按设定时间查询最新选标,通过卖出旧持仓、买入新标的实现仓位动态调整。
8. 运行环境与依赖
- 依赖库:
pywencai
:用于从“问财”获取数据。xtquant
:国金QMT交易接口。schedule
:用于定时任务调度。pandas
、math
:数据处理与计算支持。
- 运行条件:
- 配置正确的 QMT 交易路径与账号信息。
- 网络稳定,确保问财数据和QMT接口顺利连接。
9. 代码执行流程总结
- 启动交易接口并订阅账户。
- 在指定时间运行问财查询,获取选中标的。
- 清仓不在选中列表的持仓,释放资金。
- 将资金分配给新标的或现有标的,并执行买入操作。
- 提供交易状态反馈,确保执行过程顺畅。
结论
这段代码逻辑清晰且结构完整,能够通过问财策略动态调整持仓,实现自动化交易。
确保运行环境正确配置,交易时间精准设定,即可稳定运行此程序。
- 作者:余汉波
- 链接:https://wd.sanrenjz.com/%E4%BB%A3%E7%A0%81%E4%B8%8E%E6%95%88%E7%8E%87/%E5%9F%BA%E4%BA%8E%E9%97%AE%E8%B4%A2%E6%95%B0%E6%8D%AE%E9%A9%B1%E5%8A%A8%E7%9A%84%E8%82%A1%E7%A5%A8%E4%B8%8E%E5%8F%AF%E8%BD%AC%E5%80%BA%E9%87%8F%E5%8C%96%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F%EF%BC%9A%E6%B8%85%E4%BB%93%E3%80%81%E5%88%86%E9%85%8D%E3%80%81%E4%B9%B0%E5%85%A5%EF%BC%8C%E5%85%A8%E8%87%AA%E5%8A%A8%E8%BF%90%E8%A1%8C
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。