3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 PTrade 中进行多标的或高频策略开发时,反复调用 get_history 或 get_price 获取历史 K 线数据常会成为策略运行的性能瓶颈。默认情况下,系统会构造复杂的 pandas.DataFrame 或 Panel 对象,这在频繁调用时会产生较大的内存与 CPU 开销。
通过将 get_history 的 is_dict 参数设置为 True,可以跳过 Pandas 对象的构建,直接返回底层的 C/C++ 结构化字典数组(Dict),从而大幅提升行情数据的读取与解析速度。
is_dict=True 能够提升读取速度?DataFrame 时,系统需要为行列索引、数据类型转换分配额外内存;而返回 dict 直接使用 OrderedDict 加 NumPy array,数据更加紧凑。get_history(count, frequency='1d', field='close', security_list=None, fq=None, include=False, fill='nan', is_dict=False)
is_dict=False):返回 pandas.DataFrame 或 pandas.Panel 对象。is_dict=True):返回 OrderedDict 数据结构:OrderedDict([
('600570.SS', array([(202309220931, 11.03, 11.08, 11.03, 11.07, 2289400.0, 25302018.0, 11.07)],
dtype=[('datetime', '<i8'), ('open', '<f8'), ('high', '<f8'), ('low', '<f8'), ('close', '<f8'), ('volume', '<f8'), ('money', '<f8'), ('price', '<f8')]))
])
下面展示如何在策略中将 is_dict 设为 True 并提取收盘价计算均线:
def initialize(context):
g.security = ['600570.SS', '000001.SZ']
set_universe(g.security)
def handle_data(context, data):
# 使用 is_dict=True 高速获取过去 5 天的历史行情
history_dict = get_history(5, frequency='1d', field=['close'], security_list=g.security, is_dict=True)
if history_dict is None:
return
for stock in g.security:
if stock in history_dict:
# 提取 NumPy 结构化数组中的 close 字段
close_prices = history_dict[stock]['close']
# 计算 5 日均价
ma5 = close_prices.mean()
log.info("%s 5日均价: %s" % (stock, ma5))
is_dict=True:在 handle_data、run_interval 等高频调用的事件中,统一开启 is_dict=True。array 再转回 DataFrame,尽量使用 numpy 函数直接进行指标计算。get_individual_entrust 或 get_individual_transaction 获取逐笔 L2 数据时,将 is_dict 设为 True 也能获得明显的性能提升。