实盘交易
程序化交易也就是自动化交易,也就是大家常见的各种量化框架,本质就是任务的定时调度 + 通知回调。
Hikyuu 主要聚焦于快速策略分析,本身不提供实盘交易,Strategy 运行时仅供大家学习参考如何和实盘进行对接,造成盈亏请自行负责。
具体可参见安装目录下的 strategy 子目录下的相关 demo。
公共参数:
spot_worker_num=1 (int) : 接收行情数据时内部的线程数
quotation_server="" (string) : 指定行情服务地址,为空表示使用本机默认配置(hikyuu.ini)
- class hikyuu.Strategy
策略运行时
创建策略运行时有以下几种方式:
# 方式 1:使用默认参数创建 stg = Strategy() # 方式 2:指定证券代码列表和 K 线类型 stg = Strategy( code_list=["sz000001", "sz000002"], ktype_list=["day", "min"], preload_num={"day_max": 1000, "min_max": 2000}, name="MyStrategy", config="" # 配置文件路径,为空时使用默认的 hikyuu 配置文件 ) # 方式 3:使用上下文创建 context = StrategyContext(stock_list=["sz000001"], ktype_list=["day"]) stg = Strategy(context, name="MyStrategy", config="")
- name
策略名称,可读可写
- context
策略上下文,只读属性,包含证券代码列表、K 线类型等信息
- tm
关联的交易管理实例,可读可写,用于管理账户资产和订单
- sp
移滑价差算法,可读可写,仅在回测状态下使用
- running
获取当前运行状态,只读属性,返回 True 或 False
- is_backtesting
获取回测状态,只读属性
- start(self, auto_recieve_spot=True)
启动策略执行,请在完成相关回调设置后执行。
注意:在 Python 交互模式下无法启动策略。
- 参数:
auto_recieve_spot (bool) -- 是否自动接收行情数据,默认为 True
- on_change(self, func)
设置证券数据更新回调通知
当行情数据发生变化时触发该回调,通常用于调试。只要收到行情采集消息就会触发,不受开、闭市时间限制。
- 参数:
func -- 可调用对象,需接收三个参数:func(stg: Strategy, stock: Stock, spot: SpotRecord)
- on_received_spot(self, func)
设置证券数据更新通知回调
在一批行情数据接受完毕后通知,通常仅用于调试打印。该批行情数据中不一定含有上下文中包含的 stock, 且只要收到行情采集消息就会触发,不受开、闭市时间限制。
- 参数:
func -- 可调用对象,需接收两个参数:func(stg: Strategy, revTime: Datetime)
- run_daily(self, func, time, market='SH', ignore_market=False)
设置日内循环执行回调。如果忽略市场开闭市,则自启动时刻开始按间隔时间循环, 否则第一次执行时将开盘时间对齐时间间隔,且在非开市时间停止执行。
- 参数:
func -- 可调用对象,需接收一个参数:func(stg: Strategy)
time (TimeDelta) -- 间隔时间,如间隔 3 秒:TimeDelta(0, 0, 0, 3) 或 Seconds(3)
market (str) -- 使用哪个市场的开闭市时间,默认为"SH"
ignore_market -- 忽略市场开闭市时间,默认为 False
- run_daily_at(self, func, time, ignore_holiday=True)
设置每日定点执行回调
- 参数:
func -- 可调用对象,需接收一个参数:func(stg: Strategy)
time (TimeDelta) -- 执行时刻,如每日 15 点:TimeDelta(0, 15),必须小于 1 天
ignore_holiday -- 节假日不执行,默认为 True
备注
同一时刻只能注册一个任务,重复注册将抛出异常
- get_current_price(self, stk, ktype)
获取当前价格
- 参数:
stk (Stock) -- 指定的证券
ktype (KQuery.KType) -- K 线类型
- 返回:
当前价格,无效时返回 constant.null_price
- 返回类型:
price_t
- get_last_kdata(self, stk, start_date, ktype, recover_type)
方法1:获取指定证券从指定日期开始到当前时间的对应 K 线数据 (为保证实盘和回测一致,请使用本方法获取 K 线数据) get_last_kdata(self, stk, start_date, ktype, recover_type)
方法2:获取指定证券当前能获取到的最后 last_num 条 K 线数据 (为保证实盘和回测一致,请使用本方法获取 K 线数据) get_last_kdata(self, stk, lastnum, ktype, recover_type)
- get_kdata(self, stk, start_date, end_date, ktype, recover_type)
获取指定证券指定日期范围内的 K 线数据 (为保证实盘和回测一致,请使用本方法获取 K 线数据)
- order(self, stock, num, remark='')
按数量下单(正数为买入,负数为卖出)
实际交易数量会受到证券的最小/最大交易数量限制:
买入时,如果下单数量超过最大交易数量,则按最大交易数量成交
卖出时,如果下单数量超过最大交易数量且不等于 MAX_DOUBLE,则按最大交易数量成交
卖出时,如果下单数量小于最小交易数量,则全部卖出
- 参数:
stock (Stock) -- 指定的证券
num (float) -- 下单数量
remark (str) -- 下单备注
- 返回:
交易记录
- 返回类型:
- order_value(self, stock, value, remark='')
按预期的证劵市值下单,即希望买入多少钱的证券(正数为买入,负数为卖出)
该方法会根据当前价格计算需要买入的数量,并考虑手续费等因素,确保不会超出可用资金。 如果资金不足,会自动减少买入数量,如果连最小交易数量都无法买入,则不会下单。
- 参数:
stock (Stock) -- 指定的证券
value (float) -- 投入买入资金
remark (str) -- 下单备注
- 返回:
交易记录
- 返回类型:
- buy(self, stock, price, num, stoploss=0.0, goal_price=0.0, part=SystemPart.PART_SIGNAL, remark='')
买入操作
- 参数:
stock (Stock) -- 指定的证券
price (price_t) -- 买入价格,0 表示使用当前市场价格
num (float) -- 买入数量
stoploss (float) -- 止损价,默认为 0
goal_price (float) -- 目标价,默认为 0
part (SystemPart) -- 系统部分,默认为 PART_SIGNAL
remark (str) -- 备注信息
- 返回:
交易记录
- 返回类型:
- sell(self, stock, price, num, stoploss=0.0, goal_price=0.0, part=SystemPart.PART_SIGNAL, remark='')
卖出操作
- 参数:
stock (Stock) -- 指定的证券
price (price_t) -- 卖出价格,0 表示使用当前市场价格
num (float) -- 卖出数量
stoploss (price_t) -- 止损价,默认为 0
goal_price (price_t) -- 目标价,默认为 0
part (SystemPart) -- 系统部分,默认为 PART_SIGNAL
remark (str) -- 备注信息
- 返回:
交易记录
- 返回类型:
- hikyuu.start_spot_agent(print=False, worker_num=1, addr='')
启动行情数据接收代理
如果之前已经处于运行状态,将抛出异常。
- 参数:
print (bool) -- 是否打印日志,默认为 False
worker_num (int) -- 工作线程数,默认为 1
addr (str) -- 行情采集服务地址,为空表示使用 hikyuu 配置文件中的行情服务器地址
- hikyuu.stop_spot_agent()
停止行情数据接收代理
- hikyuu.spot_agent_is_running()
判断行情数据接收代理是否在运行
- 返回:
True 或 False
- hikyuu.spot_agent_is_connected()
判断行情数据接收代理是否已连接
- 返回:
True 或 False
- hikyuu.crtBrokerTM(broker, cost_func=TC_Zero(), name='SYS', other_brokers=[])
创建券商交易管理器
- 参数:
broker -- 券商实例
cost_func (TradeCost) -- 交易成本函数,默认为 TC_Zero()
name (str) -- 名称,默认为"SYS"
other_brokers (list) -- 其他订单代理列表,默认为空
- 返回:
交易管理器实例
- 返回类型:
TradeManagerPtr
- hikyuu.run_in_strategy(sys, stock, query, broker, costfunc, other_brokers=[])
方式1:在策略运行时执行系统交易 SYS
run_in_strategy(sys, stock, query, broker, costfunc, other_brokers=[]) 目前仅支持 buy_delay|sell_delay 均为 false 的系统,即 close 时执行交易
- 参数:
sys -- 交易系统
stock -- 交易对象
query -- 查询条件
broker -- 订单代理(专用与和账户资产同步的订单代理)
costfunc -- 成本函数
other_brokers (list) -- 其他的订单代理,默认为空列表
方式2: 在策略运行时执行组合策略 PF
目前仅支持 buy_delay|sell_delay 均为 false 的系统,即 close 时执行交易
- hikyuu.crt_sys_strategy(sys, stk_market_code, query, broker, cost_func, other_brokers=[], name='SYSStrategy', config='')
创建系统策略
- 参数:
sys -- 交易系统
stk_market_code (str) -- 证券市场代码
query -- 查询条件
broker -- 订单代理
cost_func -- 成本函数
other_brokers (list) -- 其他订单代理,默认为空列表
name (str) -- 策略名称,默认为"SYSStrategy"
config (str) -- 配置文件路径,默认为空
- hikyuu.crt_pf_strategy(pf, query, broker, cost_func, other_brokers=[], name='PFStrategy', config='')
创建组合策略
- 参数:
pf -- 资产组合
query -- 查询条件
broker -- 订单代理
cost_func -- 成本函数
other_brokers (list) -- 其他订单代理,默认为空列表
name (str) -- 策略名称,默认为"PFStrategy"
config (str) -- 配置文件路径,默认为空