我正在用 python 进行一些回溯测试,并在 Django 中设置了我的数据库模型,如下所示。一种是以代码为键的股票数据库,一种是以代码+日期为键的价格数据库。像这样的东西:
股票数据库:
价格数据库:
然后我运行我的回测算法来做类似的事情
for stock in stock_list:
prices = Price.objects.filter(stock=stock)
backtest = run_backtest(prices)
基本上是尝试针对 500-1000 个代码进行优化,我注意到最大的瓶颈是“Price.objects.filter(stock=stock)”,因为它必须为每次回测获取全新的价格。
我怎样才能最好地加速过滤器?我应该尝试一次加载 5 个符号然后从中过滤吗?或者第二个线程在第一个回测运行时获取下一个交易品种?我在这里缺少什么吗?我觉得我可以轻松地将其速度提高 10-20 倍。谢谢!
您可以通过.prefetch_related(…)
[Django-doc]:获得bulk的价格
stock_list = Stock.objects.prefetch_related('price_set')
for stock in stock_list:
backtest = run_backtest(stock.price_set.all())
这将在一个额外的查询中获取(过滤的)股票的所有
Price
,并在 Python 级别进行连接。