量化交易入门笔记-策略常用对象
在股票量化策略中,还会用到一些常用的对象,如 Order 对象、全局对象 g 、Trade 对象等。下面详细讲解一下常用的对象
Order 对象
Order 对象常用的属性如下:
- amount : 下单数量,不管是买还是卖,都是正数
- filled : 已经成交的股票数量,正数
- security : 股票代码
- order_id : 订单 id
- price : 平均成交价格,已经成交的股票的平均成交价格(一个订单可能分多次成交)
- avg_cost : 卖出时表示下单卖出前的此股票的持仓成本,用来计算此次卖出的收益。买入时表示此次买入的均价(等于 price )
- side : 用来指定开多单,还是空单。如果其值是 long 代表开多单,如果其值是 short 代表开空单
- action : 用来指定是开仓,还是平仓。如果其值是 open 代表开仓,如果其值是 close 代表平仓
- add_time : 订单添加时间
全局对象 g
全局对象 g,用来存储用户的种类可被 pickle.dumps 函数序列化的全局数据
在模拟盘中,如果中途进程中断,我们会使用 pickle.dumps 序列化所有的 g 下面的变量内容,保存到磁盘中,再启动的时候模拟盘就不会有任何数据影响。如果没有用 g 声明,会出现模拟盘重启后,变量数据丢失的问题
如果不想 g 中某个变量被序列化,可以让变量以 "_"开头,这样,这个变量在序列化会被忽略
全局对象 g 的实例代码如下:
def initialize(context):
g.secruity = "000001.XSHG"
g.count = 1
g.flag = 0
def process_initialize(context):
# 保存不能被序列化的对象,进程每次重启都初始化
g._q = query(valuation)
def handle_data(context, data):
log.info(g.security)
log.info(g.count)
log.info(g.flag)
Trade 对象
Trade 对象用于记录订单的一次交易。但需要注意的是,一个订单可能分多次交易。Trade 对象的常用属性如下:
- time : 交易时间
- amount : 交易数量
- price : 交易价格
- trade_id : 交易记录 id
- order_id : 对应的订单 id
tick 对象
tick 中的信息是在 tikc 事件发生时,盘面的一个快照。tikc 对象的家长属性如下:
- code : 标的代码
- datetime : tick 发生的时间
- current : 最新价
- high : 最高价
- low : 最低价
- volume : 截至当前时刻的成交量
- amount : 截至当前时刻的成交额
- position : 截至当前时刻的持仓量,只适用于期货 tick 对象
- a1_v ~ a5_v : 卖一量到卖五量,对于期货,只有卖一量
- a1_p ~ a5_p : 卖一价到卖五价,对于期货,只有卖一价
- b1_v ~ b5_v : 买一量到买五量,对于期货,只有买一量
- b1_p ~ b5_p : 买一价到买五价,对于期货,只有买一价
Context 对象
Context 对象,即量化策略加油对象,其常用属性如下:
- subportfolios : 当前单个操作仓位的资金和标的的信息
- portfolio : 账户信息,即 subportfolios 的汇总信息
- cruuent_dt : 当前单位时间的开始时间。如果是按天回测,那么开始时间是 hour = 9, minute = 30, second = microsecond = 0; 如果是按分钟回测,那么开始时间是 second = microsecond = 0
- previous_date : 前一个交易日
- universe : 查询 set_universe() 设定的股票池,例如:["000001.XSHG", "600000.XSHG"]
- run_params : 表示此次运行的参数,有如下属性:
- start_date : 回测/模拟开始日期
- end_date : 回测/模拟结束日期
- type : 运行方式,如果其值是 "simple_backtest",表示回测是通过单击“编译运行”运行;如果其值是"full_backtest"表示回测是通过单击“运行回测”运行;如果其值是"sim_trade",表示模拟交易
- frequency : 运行频率,只能是 "day"/ "minute"或"tick"
另外,此对象也做了和 g 一样的处理:
-
可以添加自己的变量,每次进程关闭时持久保存,进程重启时恢复
-
以"_"开头的变量不会被持久保存
-
如果添加的变量与系统的冲突,将覆盖掉系统变量,如果想恢复系统变量,就要删除自己的变量
实例代码:
def handle_data(context, data): # 执行下面的语句之后,context.portfolio 的整数 1 context.portfolio = 1 log.info(context.portfolio) # 要恢复系统的变量,只需要使用下面的语句即可 del context.portfolio # 此时,context.portfolio 将变成账户信息 log.info(context.portfolio.portfolio_value)
-
以后可能会向 context 中添加新的变量来支持量多功能,为了减少麻烦,这里建议大家使用 g
Context 对象的实例代码如下:
def handle_data(context, data):
#获得当前回测相关时间
year = context.current_dt.year
month = context.current_dt.month
day = context.current_dt.day
hour = context.current_dt.hour
minute = context.current_dt.minute
second = context.current_dt.second
#得到"年-月-日"格式
date = context.current_dt.strftime("%Y-%m-%d")
#得到周几
weekday = context.current_dt.isoweekday()
# 获取账户的持仓价值
positions_value = context.portfolio.positions_value
# 获取仓位subportfolios[0]的可用资金
available_cash = context.subportfolios[0].available_cash
# 获取subportfolios[0]中多头仓位的security的持仓成本
hold_cost = context.subportfolios[0].long_positions[security].hold_cost
Position 对象
Position 对象是特有的某个标的的信息,其常用属性如下:
- security : 标的的代码
- price : 最新行情价格
- avg_cost : 开创均价,买入标的的加权平均价
- hold_cost : 持仓成本,针对期货有效
- init_time : 建仓时间,格式为 datetime.datetime
- total_amount : 总仓位,但不包括挂单冻结仓位
- closeable_amount : 可卖出的仓位
- today_amount : 今天开的仓位
- locked_amount : 挂单冻结仓位
- value : 标的的价值,计算方法是 :price * total_amount * multiplier, 其中股票、基金的 multiplier 为1,期货为相应的合约乘数
- side : 用来指定开多单,还是空单。如果其值是 long 代表开多单,如果其值是 short 代表开空单
- pindex : 仓位索引
SubPortfolio 对象
SubPortfolio 对象是某个仓位的资金和标的信息,其常用属性如下:
- inount_cash : 累计的出入金,比如初始资金为1000元,后来转移出去100元,则这值是 1000-100=900元
- available_cash : 可用资金,可用来购买证券的资金
- transferable_cash : 可取资金,即可以提现的资金,不包括今日卖出的证券所得资金
- locked_cash : 挂单锁住资金
- type : 账户所属类型
- long_positions : 多单仓位
- short_positions: 空单仓位
- positions_value : 持仓价值,股票基金才有持仓价值,期货为0
- total_value : 总资产,包括现金,保证金,仓位的总价值,可用来计算收益
- toatl_liability : 总负债,等于融资负债、融券负债、利息总负债的总和
- net_value : 净资产,等于总资产减去总负债
- cash_liability : 融资负债
- sec_liability : 融券负债
- interest : 利息总负债
- maintenance_margin_rate : 维持担保比例
- available_margin : 融资融券可用保证金
- margin : 保证金,股票、基金保证金都为100%;融资融券保证金为0;期货保证金会实时更新,总是等于当前期货价值 * 保证金比率,当保证金不足时,强制平仓。平仓顺序是:亏损多的(相对于开仓均价)平仓
Portfolio 对象
Portfolio 对象是所有标的的操作仓位的信息汇总,其常用属性如下
- inout_cash : 累计出入金,比如初始资金为1000元,后来转移出去100元,则这个值是1000-100=900
- available_cash : 可用资金,可用来购买证券的资金
- transferable_cash : 可取资金,即可以提现的资金,不包括今日卖出证券所得资金
- locked_cash : 挂单锁住资金
- margin : 保证金,股票、基金保证金都为100%
- positions : 等同于 long_positions
- long_positions : 多单的仓位
- short_positions: 空间的仓位
- total_value : 总的权益,包括现金,保证金,仓位的总价值,可用来计算的收益
- returns : 总权益的累计收益
- starting_cash : 初始资金
- positions_value : 持仓价值,股票基金才有持仓价值,期货为0
- locked_cash_by_purchase : 基金申购未完成所冻结的金额
- locked_cash_by_redeem : 基金赎回未到账的金额
- locked_amount_by_redeem : 基金赎回时,冻结的份额
SecurityUnitData 对象
SecurityUintData 对象是一个单位时间内的股票的数据,其常用属性如下:
- security : 股票代码。例如"000001.XSHG"
- returns : 股票在这个单位时间的相对收益比例
- open : 时间段开始时价格
- close : 时间段结束时价格
- low : 最低价
- high : 最高价
- volume : 成交的股票的数量
- factor : 前复权因子。利用前复权因子可以算出原始价格,方法是价格除以 factor ,即原始价格 = close / factor
- high_limit : 涨停价
- low_limit : 跌停价
- avg : 这段时间的平均价
注:本文章为个人学习笔记,参考了一些书籍与官方教程,不作任何商业用途!