J'ai une liste de dates de début et une liste de dates de fin. Elles sont triées...
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)]
Les dates de début représentent les dates auxquelles nous avons reçu le conseil d'acheter une action. Les dates de fin sont les dates auxquelles nous avons reçu le conseil de la vendre. Les sources de conseil sont différentes et nous effectuons un backtesting de ce qui se passerait si nous utilisions le conseil d'achat d'une source, mais le conseil de vente d'une autre. Nous avons donc deux séquences de dates que nous voulons résoudre en paires - ou intervalles - sur lesquelles nous aurions détenu une position sur l'action.
Ainsi, nous prendrons une date dans les dates de début pour décider quand acheter l'action : le 5 novembre, nous achetons une position. Puis nous parcourons les end_dates à la recherche du premier conseil pour la vendre : le 14 décembre. Et nous recommençons, en achetant lorsque nous ne détenons pas de position et que l'une des sources nous le conseille, et en vendant lorsque nous détenons une position et que l'autre source nous le conseille.
On pourrait dire qu'on veut changer entre les deux listes sur lesquelles on boucle.
Ainsi, l'entrée ci-dessus génère :
result = (
(datetime.date(2009, 11, 5), datetime.date(2009, 12, 14)),
(datetime.date(2009, 12, 29), None)
)
J'utilise des boucles for à l'intérieur de boucles for et je me demande s'il n'y a pas une meilleure solution. Les performances sont intéressantes car elles seront appliquées à des milliers de scénarios sur une période de 40 ans ; certaines listes comportent des milliers de dates.