在目前新版的聚宽教程中,推荐使用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()
price = current_data[security].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对象
不知道大家有什么更好的办法?