VeighNa量化社区
你的开源社区量化交易平台
Member
avatar
加入于:
帖子: 420
声望: 181

class ArrayManager(object):
def init(self, size=100):
"""Constructor"""
self.count = 0
self.size = size
self.inited = False

    self.open_array = np.zeros(size)
    self.high_array = np.zeros(size)
    self.low_array = np.zeros(size)
    self.close_array = np.zeros(size)
    self.volume_array = np.zeros(size)

在用户策略里经常用 下面的语句来生成一个ArrayManager:

1) self.am = ArrayManager() -----默认最多保存100个周期的bar数据
或者
2) self.am = ArrayManager(200) -----指定最多保存100个周期的bar数据
之后再用户策略的on_bar()或者self.on_xxx_bar()函数中会调用:
self.am.update_bar(bar) ---- 每次执行都会把最老的self.xxx_array一个的数据抛弃,同时添加bar的数据到self.xxx_array[-1]
sma300 = self,am.sma(300) ----- 本人故意用了300
那么问题来了:当一个am中保存的bar数据周期数不足300时,sma300的所有元素都将为NaN:
[NaN,NaN,NaN,.....,NaN]

建议:是否可以把ArrayManager多数据的存在管理做成自适应的?
方法:当用户的策略里对数据的引用数量超过ArrayManager的size时,把size调整为引用数量,重新创建各个数组xxx_array,并且把当前的数据迁移到新数组,这样当用户的bar数据个数达到引用数量时,talib的各个指标就可以计算出有实际意义的返回数组了,就可以适应策略的计算需求。

Member
avatar
加入于:
帖子: 420
声望: 181

手误改正:
2) self.am = ArrayManager(200) -----指定最多保存200个周期的bar数据

Administrator
avatar
加入于:
帖子: 4550
声望: 325

不行,ArrayManager的内部数据计算是基于numpy.array数据结构,所以才能达到比较高的计算性能,而numpy.array是定长的,不像list是可变的。

如果在实盘过程中动态不断创建新的数组xxx_array,会存在显著的延时,拖慢整个系统的速度

Member
avatar
加入于:
帖子: 15
声望: 0

用Python的交易员 wrote:

不行,ArrayManager的内部数据计算是基于numpy.array数据结构,所以才能达到比较高的计算性能,而numpy.array是定长的,不像list是可变的。

如果在实盘过程中动态不断创建新的数组xxx_array,会存在显著的延时,拖慢整个系统的速度

确实。内存复杂度和时间复杂度 不可兼得

© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】