用Python对投资组合进行回溯测试

2024-10-03 21:27:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我想对马科维茨的投资组合做一个回溯测试。到目前为止,我已经尝试过zipline、backtrader和QSTrader(虽然QSTrader可以工作,但是没有文档,所以非常困难)。我没有像我所希望的那样幸运地创建回测

我的数据结构是一个csv,由200种不同股票的调整收盘价组成。我想每季度或每年进行一次投资组合再平衡。我已经有了实际投资组合优化的代码和它返回的权重。我只需要一个实际的框架来插入这些权重,然后每年每季度重新计算一次。到目前为止,我已经做了大约5个小时了,我只是无法进行任何回溯测试。Zipline在处理数据方面非常混乱,尤其是在使用我描述的结构导入本地csv时。Backtrader也有同样的问题。QSTrader似乎不适合我,加载数据后会抛出以下错误:

Traceback (most recent call last):
  File "d:\Finansiering. Modern Portfolio Theory Projekt\Finansiering_Backtrader.py", line 53, in <module>
    strategy_backtest.run()
  File "D:\Anaconda\envs\zipline\lib\site-packages\qstrader\trading\backtest.py", line 398, in run
    self.qts(dt, stats=stats)
  File "D:\Anaconda\envs\zipline\lib\site-packages\qstrader\system\qts.py", line 172, in __call__
    rebalance_orders = self.portfolio_construction_model(dt, stats=stats)
  File "D:\Anaconda\envs\zipline\lib\site-packages\qstrader\portcon\pcm.py", line 289, in __call__
    target_portfolio = self._generate_target_portfolio(dt, full_weights)
  File "D:\Anaconda\envs\zipline\lib\site-packages\qstrader\portcon\pcm.py", line 139, in _generate_target_portfolio
    return self.order_sizer(dt, weights)
  File "D:\Anaconda\envs\zipline\lib\site-packages\qstrader\portcon\order_sizer\dollar_weighted.py", line 168, in __call__
    'modifying the backtest start date and re-running.' % (asset, dt)
ValueError: Asset price for "A" at timestamp "2006-01-31 21:00:00+00:00" is Not-a-Number (NaN). This can occur if the chosen backtest start date is earlier than the first available price for a particular asset. Try modifying the backtest start date and re-running.

回溯测试的开始日期是正确的,基本上是在月底,当它需要重新平衡时,它只是得到一个中风。我也没办法解决这个问题

我希望有人有一个半即插即用的解决方案


Tags: inpyselflibpackageslinedtsite
2条回答

我对zipline也不是很有经验,但似乎zipline使用数据包类处理数据。文件确实不是很清楚。以下是您可能需要执行的操作:

  1. 格式化csv文件中的数据-最好为此构建一个函数。数据包的严格格式包含在“自定义csv包”部分下的文档中。请记住,它们需要具有完全相同的开始和结束日期,与您的交易日历保持一致,并且具有与文档中提供的csv完全相同的格式

  2. 你应该有一个“.zipline”文件夹,在其中创建/编辑extension.py,包括以下内容:1)注册交易日历;2) 注册自定义csv包-这两个包都可以在文档中找到

  3. 在提示符中键入$zipline ingest-b[bundle_name]-这将接收数据

  4. 使用“symbol”调用每个资产的数据,并在运行回测时指定捆绑包名称

希望这能对你有所帮助

我认为bt - flexible backtesting for Python更适合你想做的事情。该库旨在定期重新平衡金融投资组合

相关问题 更多 >