平台的缓存机制是怎样的?

缓存
cache
m_deps
标签: #<Tag:0x00007fcf72725260> #<Tag:0x00007fcf727250f8> #<Tag:0x00007fcf72724fb8>

(shen5455) #1

用贵平台,也已经好几周了,我不是第一次发现,代码运行的结果并不是我想要的结果,没有异常没有报错觉得很难受,我猜测应该是缓存导致的,数据缓存提升运行效率,我能理解,但我还怀疑,平台也对代码进行了缓存。简单的说个例子,我在代码里加了print(temp)打印的,保存了,运行了好几遍打印的信息都不会出来,一定要我改了下print(‘bbs’,temp),才能重新看到我想要看的东西。
上面是我举得一个例子,实际上是我随意改变我策略里的判断买卖条件,回测结果始终是一样的,That is all.


策略研究常用功能
(小Q) #2

您好,平台引入缓存机制,如果您不想使用缓存,你可以加入修改模块(module)依赖(dependence)的参数。每个函数、模块的参数发生变化就不会击中缓存,就会重新运行。以回测举例,假如你修改了handle_data函数内部代码,想看看修改后策略的效果,此时因为M.trade模块参数没有任何变化,那么您的回测就会击中缓存,返回上次运行的结果。如果你想去掉缓存,你修改下模块的参数即可,比如:

m=M.trade.v2(
    instruments=instruments,
    start_date=start_date,
    end_date=end_date,
    initialize=initialize,
    handle_data=handle_data,
    order_price_field_buy='open',
    order_price_field_sell='open',
    capital_base=1000000,
    m_deps=np.random.randn()
    )

加入 m_deps=np.random.randn() 一句后,通过每次产生不同的随机数赋值给参数m_deps,Trade每次就会重新运行,重新调用相关函数,不会击中缓存。

此外,在可视化编辑模式下,每个模块都有缓存开关,关掉即可。

image


(iQuant) #3
克隆策略
In [1]:
M.cached.v3
Out[1]:
M.cached.v3(run=, input_1=None, input_2=None, input_3=None, kwargs=None)
In [2]:
t1 = datetime.datetime.now()
instruments = D.instruments()
start_date = '2010-01-01' 
end_date = '2017-02-27' 
    # 获取市值数据
market_cap_data = D.history_data(instruments,start_date,end_date,fields=['market_cap'])
daily_buy_stock = market_cap_data.groupby('date').apply(lambda df: df.sort_values('market_cap')[:30])
print('查看数据: ', daily_buy_stock.tail())
print('完整运行一次的时间(秒): ',(datetime.datetime.now() - t1).total_seconds())
查看数据:                        market_cap  instrument       date
date                                                   
2017-02-27 4326693  3.165085e+09  300092.SZA 2017-02-27
           4325825  3.180138e+09  002057.SZA 2017-02-27
           4326721  3.184781e+09  300120.SZA 2017-02-27
           4327084  3.199449e+09  300486.SZA 2017-02-27
           4327693  3.238400e+09  600593.SHA 2017-02-27
完整运行一次的时间(秒):  20.731449

缓存引入

In [3]:
t2 = datetime.datetime.now()
# 使用缓存技术及options传入
def select_by_market_cap():
    instruments = D.instruments()
    start_date = '2010-01-01' 
    end_date = '2017-02-27' 
    # 获取市值数据
    market_cap_data = D.history_data(instruments,start_date,end_date,fields=['market_cap'])
    daily_buy_stock = market_cap_data.groupby('date').apply(lambda df: df.sort_values('market_cap')[:30])
    return Outputs(daily_buy_stock=DataSource.write_df(daily_buy_stock))

m1 = M.cached.v2(run=select_by_market_cap)
m1.daily_buy_stock.read_df()
print('查看数据: ', m1.daily_buy_stock.read_df().tail())
print('运行时间(秒): ',(datetime.datetime.now() - t2).total_seconds())
[2018-03-07 17:41:01.586551] INFO: bigquant: cached.v2 开始运行..
[2018-03-07 17:41:01.600755] INFO: bigquant: 命中缓存
[2018-03-07 17:41:01.605261] INFO: bigquant: cached.v2 运行完成[0.018722s].
查看数据:                           date    market_cap  instrument
date                                                   
2017-02-27 4326693 2017-02-27  3.165085e+09  300092.SZA
           4325825 2017-02-27  3.180138e+09  002057.SZA
           4326721 2017-02-27  3.184781e+09  300120.SZA
           4327084 2017-02-27  3.199449e+09  300486.SZA
           4327693 2017-02-27  3.238400e+09  600593.SHA
运行时间(秒):  0.327418
In [4]:
t2_ = datetime.datetime.now()
m1 = M.cached.v2(run=select_by_market_cap)
m1.daily_buy_stock.read_df()
print('查看数据: ', m1.daily_buy_stock.read_df().tail())
print('运行时间(秒): ',(datetime.datetime.now() - t2_).total_seconds())
[2018-03-07 17:41:16.016174] INFO: bigquant: cached.v2 开始运行..
[2018-03-07 17:41:16.021901] INFO: bigquant: 命中缓存
[2018-03-07 17:41:16.044570] INFO: bigquant: cached.v2 运行完成[0.028388s].
查看数据:                           date    market_cap  instrument
date                                                   
2017-02-27 4326693 2017-02-27  3.165085e+09  300092.SZA
           4325825 2017-02-27  3.180138e+09  002057.SZA
           4326721 2017-02-27  3.184781e+09  300120.SZA
           4327084 2017-02-27  3.199449e+09  300486.SZA
           4327693 2017-02-27  3.238400e+09  600593.SHA
运行时间(秒):  0.20835

传入一个函数环境依赖参数,摆脱缓存

In [6]:
t3 = datetime.datetime.now()
m1 = M.cached.v2(run=select_by_market_cap, m_deps='cache-v101') # 因为m_deps为新传入的一个参数,因此需重新运行
m1.daily_buy_stock.read_df()
print('查看数据: ', m1.daily_buy_stock.read_df().tail())
print('运行时间(秒): ',(datetime.datetime.now() - t3).total_seconds())
[2018-03-07 17:41:37.177454] INFO: bigquant: cached.v2 开始运行..
[2018-03-07 17:41:59.317055] INFO: bigquant: cached.v2 运行完成[22.139688s].
查看数据:                        market_cap  instrument       date
date                                                   
2017-02-27 4326693  3.165085e+09  300092.SZA 2017-02-27
           4325825  3.180138e+09  002057.SZA 2017-02-27
           4326721  3.184781e+09  300120.SZA 2017-02-27
           4327084  3.199449e+09  300486.SZA 2017-02-27
           4327693  3.238400e+09  600593.SHA 2017-02-27
运行时间(秒):  22.316587

每次运行都摆脱缓存

因为函数参数为np.random.randn(),基本上每次参数都不一样,因此每次都是重新运行,不会击中缓存

In [7]:
t4 = datetime.datetime.now()
m1 = M.cached.v2(run=select_by_market_cap, m_deps=np.random.randn())
m1.daily_buy_stock.read_df()
print('查看数据: ', m1.daily_buy_stock.read_df().tail())
print('运行时间(秒): ',(datetime.datetime.now() - t4).total_seconds())
[2018-03-07 17:42:15.108877] INFO: bigquant: cached.v2 开始运行..
[2018-03-07 17:42:30.857280] INFO: bigquant: cached.v2 运行完成[15.748394s].
查看数据:                        market_cap  instrument       date
date                                                   
2017-02-27 4326693  3.165085e+09  300092.SZA 2017-02-27
           4325825  3.180138e+09  002057.SZA 2017-02-27
           4326721  3.184781e+09  300120.SZA 2017-02-27
           4327084  3.199449e+09  300486.SZA 2017-02-27
           4327693  3.238400e+09  600593.SHA 2017-02-27
运行时间(秒):  15.962649
In [ ]:
缓存的意义在于策略开发过程中很多数据分析任务都可以先缓存下来这样能节约超过80%的运行时间

为什么我改了代码 结果是一样的?