如何在Python Pandas中进行简单信号回测

-3 投票
1 回答
2978 浏览
提问于 2025-04-18 14:14

我想在pandas中进行一个简单快速的回测,方法是提供买入信号作为时间索引,以便与包含开盘、最高、最低和收盘价的DataFrame(调整后的收盘价)进行对比,但我不太确定这样做是否正确。

为了更清楚,我想计算在整个持有期间所有买入信号的累计收益(还有股票收益也算吗?)。之后,我想通过一个简单的夏普比率函数来比较几种计算结果。这是用pandas快速简单地测试买入信号的正确方法吗?

任何帮助都非常感谢!

信号:

In [216]: signal
Out[216]:
<class 'pandas.tseries.index.DatetimeIndex'>
[2000-08-21, ..., 2013-07-09]
Length: 21, Freq: None, Timezone: UTC

ohlc:

In [218]:
df.head()
Out[218]:
open    high    low close   volume  amount
Date                        
2000-01-14 00:00:00+00:00    6.64    6.64    6.06    6.08    74500   4.91
2000-01-17 00:00:00+00:00    6.30    6.54    6.25    6.40    45000   5.17
2000-01-18 00:00:00+00:00    7.56    8.75    7.51    8.75    250200  7.07

回测:

analysis = pd.DataFrame(index=df.index)
#calculate returns of adjusted close price
analysis["returns"] = df['amount'].pct_change()
#set signal returns to quote returns where there is a signal DatetimeIndex and ffill
analysis["signal"] = nan
analysis["signal"][signal] = analysis["returns"][signal]
analysis["signal"] = analysis["signal"].fillna(method="ffill")
#calculation of signal returns
trade_rets = analysis["signal"].shift(1)*analysis["returns"]

预期结果(buy_returns的值不正确):

Out[2]:
returns buy_returns
Date        
2000-08-21 00:00:00+00:00    -0.153226  -0.076613
2001-02-12 00:00:00+00:00    0.000000    0.000000
2002-10-29 00:00:00+00:00    0.246155    0.030769
2003-02-12 00:00:00+00:00    0.231884    0.014493
2003-03-12 00:00:00+00:00    1.548386    0.048387

我真正想问的是,如何计算一个收益序列,以便在pandas中表示给定买入信号的强度(真/假序列或时间索引)?

1 个回答

2

你现在没有足够的信息来进行回测。你的“策略”目前只是简单的真或假。当它是“真”时,你想买多少?如果连续两次都是“真”,那是意味着要一直持有,还是在两个时间点都买入?而“假”是意味着清仓,还是不买入?

你需要:

  1. 把你的信号转化为“在t时持有的数量”
  2. 然后检查持有这个数量的结果是什么
  3. 别忘了做基准测试

在做第二步的时候,我觉得这是你问题的重点,不要太关注速度,只需要做一个直观的迭代模拟器,按照时间逐步进行,执行你设定的操作,并计算出新的总价值。对于你所处理的数据量来说,使用pandas做得再复杂,速度提升也不会快到让你感觉到。

撰写回答