首页 > 解决方案 > 财务回测程序上的 RuntimeWarning

问题描述

我正在尝试通过使用其网页上bt提供的示例之一使用该库对交易策略进行回测(由于该功能不起作用,我没有检索所提供的数据。但这是我正在使用的代码(我知道有些处理很混乱,但它完成了工作):bt.get()df

import bt, pandas as pd, yfinance as yf, datetime as dt, os, requests
from pandas_datareader import data as pdr
yf.pdr_override

ticks = ['AAPL','MSFT','C','GS','GE']

data = tdaph(ticks[0])
data = data.set_index('datetime')
data[ticks[0]] = data['close']
data = data.drop('close',axis=1)

for i in range(1,len(ticks)):
    aa = tdaph(ticks[i])
    aa = aa.set_index('datetime')
    data[ticks[i]] = aa['close']
    print('done')
data.index = pd.to_datetime(data.index)
data = data.astype('float')

sma = data.rolling(50).mean()

class SelectWhere(bt.Algo):
    
    def __init__(self, signal):
        self.signal = signal
        
    def __call__(self, target):
        if target.now in self.signal.index:
            sig = self.signal.loc[target.now]
            selected = list(sig.index[sig])
            target.temp['selected'] = selected

print('hecho')

s = bt.Strategy('above50sma', [SelectWhere(data > sma),
                               bt.algos.WeighEqually(),
                               bt.algos.Rebalance()])
print('strat hecha')

t = bt.Backtest(strategy=s,data=data)
print('backtest hecho')

res = bt.run(t)

但是在运行该bt.run()函数时,我收到以下 RuntimeWarning 消息:

Warning (from warnings module):


File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/ffn/core.py", line 2299
    res = np.divide(er.mean(), std)
RuntimeWarning: invalid value encountered in true_divide

关于可能是什么问题的任何想法?提前感谢任何人。

标签: pythonfinanceback-testingbt

解决方案


当您尝试执行诸如将无穷大除以无穷大之类的操作时,NumPy 会打印此警告:

>>> import numpy as np
>>> np.asarray([np.inf])/np.asarray([np.inf])
<stdin>:1: RuntimeWarning: invalid value encountered in true_divide
array([nan])

怎么做取决于具体情况。例如,在某些情况下,这可能是某些优化算法的一部分,该算法稍后会过滤掉任何给出的结果nan,因此您可能想要做的就是摆脱警告(关于如何在 StackOverflow 上执行此操作有很多问题,例如如何避免 NumPy 中出现“RuntimeWarning:在除法中遇到无效值”?)。在其他情况下,它可能表明更严重的事情是错误的。

如果您不知道警告是否表明有问题,最好暂时“将警告转换为错误”(将 numpy 警告转换为错误),以便在发生这种情况时抛出异常并获得完整的回溯,包括它来自您自己的脚本的哪一行。


推荐阅读