我有开始日期列表和结束日期列表。它们被排序...
start_dates = [
datetime.date(2009, 11, 5), datetime.date(2009, 11, 13),
datetime.date(2009, 11, 25), datetime.date(2009, 11, 26),
datetime.date(2009, 12, 4), datetime.date(2009, 12, 7),
datetime.date(2009, 12, 29), datetime.date(2009, 12, 30)]
end_dates = [
datetime.date(2009, 10, 1), datetime.date(2009, 10, 2),
datetime.date(2009, 10, 9), datetime.date(2009, 10, 12),
datetime.date(2009, 11, 4), datetime.date(2009, 12, 14),
datetime.date(2009, 12, 15)]
开始日期表示我们收到购买股票建议的日期。结束日期是我们收到出售建议的日期。建议的来源不同,我们正在回溯测试如果我们使用一个来源的买入建议,但使用另一个来源的卖出建议会发生什么。因此,我们有两个日期序列,我们希望将其分解成对(或间隔),我们将在这些日期内持有股票头寸。
因此,我们将从 start_dates 中选取一个日期来决定何时购买股票:11 月 5 日我们购买一个头寸。然后我们循环遍历 end_dates 寻找第一个卖出建议:12 月 14 日。然后重复,当我们从一个来源获得建议时不持有头寸时买入,当我们从另一个来源持有头寸时卖出。
你可能会说我们想在我们正在循环的两个列表中的哪一个之间摆动。
因此上面的输入生成:
result = (
(datetime.date(2009, 11, 5), datetime.date(2009, 12, 14)),
(datetime.date(2009, 12, 29), None)
)
我在 for 循环中使用 for 循环,想知道是否有更好的方法。性能很有趣,因为它将在 40 年的时间跨度内应用于数千个场景;一些列表涉及数千个日期。
编辑
这应该与 len(start_dates)+len(end_dates)
成比例:
def date_range(start_dates, end_dates):
result = []
start_i = 0
end_i = 0
while start_i<len(start_dates):
while end_i<len(end_dates) and start_dates[start_i]>end_dates[end_i]:
end_i += 1
if end_i == len(end_dates):
result.append((start_dates[start_i], None))
break
result.append((start_dates[start_i], end_dates[end_i]))
while start_i<len(start_dates) and start_dates[start_i]<=end_dates[end_i]:
start_i += 1
end_i += 1
return result
用法:
In : start_dates = [
....: datetime.date(2009, 11, 5), datetime.date(2009, 11, 13),
....: datetime.date(2009, 11, 25), datetime.date(2009, 11, 26),
....: datetime.date(2009, 12, 4), datetime.date(2009, 12, 7),
....: datetime.date(2009, 12, 29), datetime.date(2009, 12, 30)]
In : end_dates = [
....: datetime.date(2009, 10, 1), datetime.date(2009, 10, 2),
....: datetime.date(2009, 10, 9), datetime.date(2009, 10, 12),
....: datetime.date(2009, 11, 4), datetime.date(2009, 12, 14),
....: datetime.date(2009, 12, 15)]
In : date_range(start_dates, end_dates)
Out:
[(datetime.date(2009, 11, 5), datetime.date(2009, 12, 14)),
(datetime.date(2009, 12, 29), None)]
In : start_dates = [
....: datetime.date(2009, 11, 5), datetime.date(2009, 11, 13),
....: datetime.date(2009, 11, 25), datetime.date(2009, 11, 26),
....: datetime.date(2009, 12, 4), datetime.date(2009, 12, 7),
....: datetime.date(2009, 12, 29), datetime.date(2009, 12, 30)]
In : end_dates = [
....: datetime.date(2009, 10, 1), datetime.date(2009, 10, 2),
....: datetime.date(2009, 10, 9), datetime.date(2009, 10, 12),
....: datetime.date(2009, 11, 7), datetime.date(2009, 12, 14), # changed (2009, 11, 4) -> (2009, 11, 7)
....: datetime.date(2009, 12, 15)]
In : date_range(start_dates, end_dates)
Out:
[(datetime.date(2009, 11, 5), datetime.date(2009, 11, 7)),
(datetime.date(2009, 11, 13), datetime.date(2009, 12, 14)),
(datetime.date(2009, 12, 29), None)]
我是一名优秀的程序员,十分优秀!