3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 ptrade 量化交易平台中,当我们需要获取几百只甚至上千只股票的历史行情时,默认返回的 pandas.DataFrame 或 pandas.Panel 对象会因为内部的格式转换和索引构建,导致严重的性能瓶颈。为了解决这一痛点,ptrade 官方在 get_history 接口中提供了一个极速优化参数:is_dict=True。
is_dict=True 能大幅提速?pandas.DataFrame。当股票数量极多时,这种转换非常耗时。is_dict=True 时,接口会直接返回一个 OrderedDict,其内部的值为 numpy.ndarray(结构化数组)。这种原生数组的读取和传输速度极快,非常适合大数据量的量化回测与实盘计算。get_history 接口参数说明get_history(count, frequency='1d', field='close', security_list=None, fq=None, include=False, fill='nan', is_dict=True)
True 时,返回 OrderedDict 格式 {str: array()},取数速度相对较快。pandas.DataFrame,包含时间索引和多列。OrderedDict([
('000001.SZ', array([(202309220931, 11.03, 11.07), ...], dtype=[('datetime', '<i8'), ('open', '<f8'), ('close', '<f8')]))
])
以下是一个完整的策略示例,展示了如何在 before_trading_start 或 handle_data 中利用 is_dict=True 快速获取并处理多只股票的历史收盘价:
def initialize(context):
# 订阅沪深300成分股(约300只股票)
g.security = get_index_stocks('000300.XBHS')
set_universe(g.security)
def handle_data(context, data):
# 1. 开启 is_dict=True 极速获取过去5天的收盘价
# 此时返回的是 OrderedDict,key 为股票代码,value 为 numpy 结构化数组
history_dict = get_history(
count=5,
frequency='1d',
field=['datetime', 'close'],
security_list=g.security,
is_dict=True
)
if history_dict is None:
return
# 2. 快速遍历和计算,无需经过慢速的 DataFrame 索引
for code in g.security:
if code in history_dict:
stock_data = history_dict[code]
# 获取最近5天的收盘价数组
close_prices = stock_data['close']
# 计算5日均价(利用 numpy 的 mean,速度极快)
ma5 = close_prices.mean()
# 获取最新价格进行逻辑判断
current_price = data[code]['close']
# 策略逻辑示例
if current_price > ma5 * 1.01:
log.info("股票 %s 突破5日均线,触发买入信号" % code)
field 中一次性传入(如 ['open', 'close', 'volume']),配合 is_dict=True 一次性读出,避免多次调用 get_history。get_history 与 get_price 接口不支持多线程同时调用。在 run_daily 或 run_interval 等定时任务中,避免与 handle_data 在同一时刻调用,否则可能导致获取数据为空。