请 [注册] 或 [登录]  | 返回主站

量化交易吧 /  量化平台 帖子:3351423 新帖:41

handle_data函数移植中的注意事项:data对象

TRADE12发表于:8 月 25 日 20:00回复(1)

在目前新版的聚宽教程中,推荐使用run_daily(自定义函数,频率)来替代原来的handle_data(context,data)函数
推荐的示例如下:

def initialize(context):
    run_daily(period,time='every_bar')
    g.security = '000001.XSHE'

def period(context):
    order(g.security, 100)

我们在参考社区里面的老的策略代码的时候,还有一些策略使用的是老的框架结构。如果想借用原来handle_data中的逻辑,放到自己定义的函数中,就会碰到对data对象引用的问题。

def period(context,data):在编译运行时会碰到下面的报错:
TypeError: period() missing 1 required positional argument: 'data'

考虑到data对象的属性在get_price()返回的对象中都有,几个基本的属性和get_current_data()得到的对象属性类似,可以采取下列办法

def period(context):
    current_data = get_current_data()   #用get_current_data()或者get_price()的返回对象来替代data对象
    # 得到当前价格
    #price = data[security].price    #data对象中的当前价用的是price
    price = current_data[security].last_price    #get_current_data()返回的对象中,当前价用的是last_price
    ......
    order(g.security, 100)

就是用get_current_data()或者get_price()的返回对象来替代data对象,注意两种对象的引用方式和属性名称不完全一致,因此要对相关的语句做适当的修改。

get_current_data() 详见API中的get_current_data
返回值是一个dict, 其中 key 是股票代码, value 是拥有如下属性的对象
last_price : 最新价
high_limit: 涨停价
low_limit: 跌停价
paused: 是否停止或者暂停了交易, 当停牌、未上市或者退市后返回 True
is_st: 是否是 ST(包括ST, ST),是则返回 True,否则返回 False
day_open: 当天开盘价
name: 股票现在的名称, 可以用这个来判断股票当天是否是 ST,
ST, 是否快要退市
industry_code: 股票现在所属行业代码

get_price()用起来相对复杂一些,参数比较多,返回信息也多。详细情况见API中的get_price:
get_price(security, start_date=None, end_date=None, frequency='daily', fields=None, skip_paused=False, fq='pre', count=None)

返回值支持SecurityUnitData里面的所有基本属性,,包含:['open', 'close', 'low', 'high', 'volume', 'money', 'factor', 'high_limit','low_limit', 'avg', 'pre_close', 'paused'],其中paused为1表示停牌。

API中对于data对象的说明见API中的SecurityUnitData:
SecurityUnitData data对象

不知道大家有什么更好的办法?

全部回复

0/140

量化课程

    移动端课程