量化交易入门笔记-策略常用对象

在股票量化策略中,还会用到一些常用的对象,如 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 一样的处理:

  1. 可以添加自己的变量,每次进程关闭时持久保存,进程重启时恢复

  2. 以"_"开头的变量不会被持久保存

  3. 如果添加的变量与系统的冲突,将覆盖掉系统变量,如果想恢复系统变量,就要删除自己的变量

    实例代码:

    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)
    
  4. 以后可能会向 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 : 这段时间的平均价

注:本文章为个人学习笔记,参考了一些书籍与官方教程,不作任何商业用途!

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python量化交易入门可以从以下几个方面着手: 1. 学习Python基础知识:包括变量、数据类型、运算符、条件语句、循环语句等。这些是编写量化交易程序的基础。 2. 学习量化交易基础知识:了解量化交易的基本概念、常用量化交易策略和指标等。可以通过阅读相关书籍或在线教程来学习。 3. 学习数据处理库:Python中有很多用于数据处理的库,如NumPy、Pandas等。这些库可以帮助你处理和分析金融数据。 4. 学习可视化库:Python中有很多用于数据可视化的库,如Matplotlib、Seaborn等。这些库可以帮助你将分析结果以图表的形式展示出来。 5. 学习量化交易库:Python中有一些专门用于量化交易的库,如PyAlgoTrade、Zipline等。这些库提供了一些常用量化交易功能,如回测、交易执行等。 6. 实践项目:通过实践项目来巩固所学知识。可以选择一些简单的量化交易策略进行回测和优化,或者使用爬虫库获取金融数据进行分析。 以下是一个简单的示例,演示如何使用Python进行简单的量化交易回测: ```python import pandas as pd import numpy as np # 读取股票数据 data = pd.read_csv('stock_data.csv') # 计算收益率 data['returns'] = np.log(data['close'] / data['close'].shift(1)) # 计算移动平均线 data['ma'] = data['close'].rolling(window=10).mean() # 生成交易信号 data['signal'] = np.where(data['close'] > data['ma'], 1, -1) # 计算持仓 data['position'] = data['signal'].shift() # 计算策略收益率 data['strategy_returns'] = data['position'] * data['returns'] # 计算累计收益率 data['cumulative_returns'] = (1 + data['strategy_returns']).cumprod() # 绘制累计收益曲线 data['cumulative_returns'].plot() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值