First of all, I would re-order your approches this way
Monte-Carlo of daily returns
Bootstrap of daily returns
Block Bootstrap of 20 days
Second I would like to comment on what you want to do with the data?
It seems to me that you target to implement a "sliding (20 days) robust Markowitz portfolio". It leads to the question what kind of ...
So, the error lied as commented on the collision on the 2y-point between FRA and swap.
By adding this line to the FRA-section:
elif 'M' in tenor:
fra_start = int(tenor[0:tenor.find('M')]) - 6
helpers.append( ql.FraRateHelper(ql.QuoteHandle(ql.SimpleQuote(rate/100)),fra_start, euribor6M) )
to take into account the period of the FRA (correct me if I'm ...
Let's assume that the relevant pillar $t$ of your curve is currently (exclusively) calibrated using the reference instrument $f_0$ at market quote $q_0$. The instrument could be a swap, a forward rate agreement, tenor basis swap...
In what follows, I simplify somewhat in using scalar expressions; in practice you may see gradients / vector valued functions ...