M.fast_auto_labeler 相关问题

函数
标签: #<Tag:0x00007f73e065e888>

(PAYNE) #1

想想还是写个问题单记录一下吧,虽然在QQ群里面也讨论了

关于标注数据函数

1,'where(label > {0}, {0}, where(label < -{0}, -{0}, label)),这个函数按照群主的说法就是封装好了,就这么用吧,虽然不明白怎么实现的。OK

2,按照https://bigquant.com/docs/module_fast_auto_labeler.html 这部分例子(代码段见后面)这个时间段1/1/2017~2/1/2017 这两个都有18个交易日,在这里面hold_days修改为了10(方便计数),实际上两个股票一起应该可以产生16个数据(样本)。但是实际结果只返回了14个,这个也是“current_dt下的单,是在第二天成交”同源问题造成的么?

3,.format(10)修改为format(4) 之后,因为这段股票都上涨的,没有下跌的,故平移正数即可成立,但是标签的分布
format(4) [[3, 2], [4, 6], [5, 3], [6, 2], [8, 1]];
format(5)之后,标签:[[4, 2], [5, 6], [6, 3], [7, 2], [10, 1]]
format(6) 标签 [[5, 2], [6, 6], [7, 3], [8, 2], [12, 1]]
format(7) [(6, 2), (7, 6), (8, 3), (9, 2), (13, 1)]

如果按照收益来做标签,平移应该不会改变才对吧,请再核实一下,以为不知道大宽的机制只能黑盒了;

4 之后加了is_regression 没有发现标签的问题,

请follow并 解答一下

label_expr = [
# 将百分比收益乘以100
’return * 100’,
# where 将分数限定在[-20, 20]区间,+20将分数调整到 [0, 40] 区间
’where(label > {0}, {0}, where(label < -{0}, -{0}, label)) + {0}’.format(20)
]
m = M.fast_auto_labeler.v6(
instruments=[‘000001.SZA’, ‘600519.SHA’], start_date=‘2017-01-01’, end_date=‘2017-02-01’,
label_expr=label_expr, hold_days=5,
benchmark=‘000300.SHA’, sell_at=‘open’, buy_at=‘open’)


(iQuant) #3

非常感谢您的反馈。感谢您对BigQuant的这份支持!
您的问题很好,以上多个问题我们今天会逐次给出一个全面、细致的回答。
谢谢您!


(iQuant) #4
  • 问题1

相关模块我们会开源,届时你可以直接查询源代码。

  • 问题2

的确是只返回了14个数据,相当于每只股票只有7条数据。这里与您的8条(16/2)数据相差为1,这里是因为我们两之间的信息不对称、理解不一样导致的。比如,今天早上买,今天下午买,这实际上是持有一天。但是是同一天的数据,因此不用偏移(shift)。
也就是说,这里如果设置为10,实际上我们会偏移11天来计算。因此,我们不必太关注hold_days。
相关模块代码截图:


可以看出,是多偏移了一天。
我们这块文档解释的不是太好,我们已经在着手开源这些模块了,详情过段时间你可以直接查阅源代码。

  • 问题3
    因为两只股票这段时间都是上涨的,因此从标注里也可以看出。比如format(4)标注结果大于4的其实就是上涨的样本,这是没有问题的。

另外,我们重新检查了标注分数是否计算正确,这里以一只股票为例:

克隆策略
In [59]:
label_expr = [
# 将百分比收益乘以100
'return * 100',
# where 将分数限定在[-20, 20]区间,+20将分数调整到 [0, 40] 区间
'where(label > {0}, {0}, where(label < -{0}, -{0}, label)) + {0}'.format(6)
]
m = M.fast_auto_labeler.v6(
instruments=['000001.SZA'], start_date='2017-01-01', end_date='2017-02-01',
label_expr=label_expr, hold_days=10,
benchmark='000300.SHA', sell_at='open', buy_at='open')
[2017-09-25 17:21:25.589162] WARNING: bigquant: 此模块版本 M.fast_auto_labeler.v6 已不再维护。你仍然可以使用,但建议升级到最新版本:请更新到 fast_auto_labeler 最新版本
[2017-09-25 17:21:25.590847] INFO: bigquant: fast_auto_labeler.v6 开始运行..
[2017-09-25 17:21:25.594878] INFO: bigquant: 命中缓存
[2017-09-25 17:21:25.599993] INFO: bigquant: fast_auto_labeler.v6 运行完成[0.009107s].
In [60]:
df = m.data.read_df()
ret = df['m:Return']*100 
ret.map(np.floor)+6   # 标注这里转化成了整数,而且是向下取整的
Out[60]:
0    5.0
1    5.0
2    6.0
3    6.0
4    6.0
5    7.0
6    7.0
Name: m:Return, dtype: float64

通过手动计算,发现标注的分数(label列)确实是由未来收益率(m:Return)计算而来

当然,最好的办法还是开源我们的模块。

没有太明白“平移应该不会改变才对”这句话平移一词的意思。可以通过上述对比的方式,检查下format(4)、format(5)、format(6)、format(7)的标注结果,应该是没有问题的,除非format传入的数值能够对收益率进行划分。

  • 问题4

is_regression (boolean) – label是否用来训练回归类模型。默认是False。如果设置为:is_regression = True,表明该标注并不会进行取整,转化为整数,而是直接使用具体数值(很可能有小数),这样就能用来训练回归类型的算法。目前StockRanker是对股票进行排序,可以看成是分类模型,因此,is_regression只能设置为False.

平台的下一步工作是开源相关模块,已在实际着手处理了。

感谢您一直以来的支持!


(iQuant) #5

(PAYNE) #6

下面个截图,就是在format() 参数分别调整为 4,5,6 7 后的lable标注,我对下面源码的理解是因为打分机制需要保证返回的收益值为正值,所以需要通过fomat平移20 ,处于好奇就调整了这部分的参数,只要保证这段收益值为正即可,参数调整后,和收益差距无关,也就是说返回的label间距也应该不变才对。这是两只股票时的情况,所以你上段代码用一只股票不会出现,刚刚我也用一只股票试过了,是没有问题的。

另外通过上段代码又引出了个新的疑问,如果hold_days=10天,一只股票在18个交易日能产生多少个样本呢?为什么一只股票的产生的数据和两只股票一样?能说说产生的机制么?


“label_expr = [
# 将百分比收益乘以100
'return * 100',
# where **将分数限定在[-20, 20]区间,+20将分数调整到 [0, 40] 区间**
'where(label > {0}, {0}, where(label < -{0}, -{0}, label)) + {0}'.format(6)”




测试代码:

label_expr = [
# 将百分比收益乘以100
’return * 100’,
# where 将分数限定在[-20, 20]区间,+20将分数调整到 [0, 40] 区间
’where(label > {0}, {0}, where(label < -{0}, -{0}, label)) + {0}’.format(7)
]
m = M.fast_auto_labeler.v8(
instruments=[‘000001.SZA’, ‘600519.SHA’], start_date=‘2017-01-01’, end_date=‘2017-02-01’,
label_expr=label_expr, hold_days=10,
benchmark=‘000300.SHA’, sell_at=‘close’, buy_at=‘open’)


(iQuant) #7

关于标注结果,其实在第一个回答中已经回复了。

一只股票产生的样本和两只股票是有差异的。
这段时间两只股票,样本为14个,一只股票的话,样本为7个。

克隆策略
In [3]:
label_expr = [
# 将百分比收益乘以100
'return * 100',
# where 将分数限定在[-20, 20]区间,+20将分数调整到 [0, 40] 区间
'where(label > {0}, {0}, where(label < -{0}, -{0}, label)) + {0}'.format(7)
]
m = M.fast_auto_labeler.v8(
instruments=['000001.SZA', '600519.SHA'], start_date='2017-01-01', end_date='2017-02-01',
label_expr=label_expr, hold_days=10,
benchmark='000300.SHA', sell_at='close', buy_at='open')
len(m.data.read_df())
[2017-09-26 19:19:39.943879] INFO: bigquant: fast_auto_labeler.v8 开始运行..
[2017-09-26 19:19:39.949467] INFO: bigquant: 命中缓存
[2017-09-26 19:19:39.969453] INFO: bigquant: fast_auto_labeler.v8 运行完成[0.025599s].
Out[3]:
14
In [4]:
label_expr = [
# 将百分比收益乘以100
'return * 100',
# where 将分数限定在[-20, 20]区间,+20将分数调整到 [0, 40] 区间
'where(label > {0}, {0}, where(label < -{0}, -{0}, label)) + {0}'.format(7)
]
m = M.fast_auto_labeler.v8(
instruments=['000001.SZA'], start_date='2017-01-01', end_date='2017-02-01',
label_expr=label_expr, hold_days=10,
benchmark='000300.SHA', sell_at='close', buy_at='open')
len(m.data.read_df())
[2017-09-26 19:19:52.386880] INFO: bigquant: fast_auto_labeler.v8 开始运行..
[2017-09-26 19:19:52.406373] INFO: fast_auto_labeler: load history data: 506 rows
[2017-09-26 19:19:52.435411] INFO: fast_auto_labeler: start labeling
[2017-09-26 19:19:52.725413] INFO: bigquant: fast_auto_labeler.v8 运行完成[0.338545s].
Out[4]:
7