Hello, I am a student in finance and I have a project to do about pairs trading strategy. The fact is that my program works but gives me outputs that are not quite trustable (too high like +100% of original balance). I need to code a simulation of pairs trading with cointegrated assets and I don't know how to code a simulation which comes close to real conditions of trading. I use 10 years daily data of FOREX.
I use the residual's z score of linear regression in order to know when to start a trade. It's the first time I ask for help in this forum so I don't know so much how to share my python program so you will see it below :
If you have any question please ask me, thank you for your help in advance.
I use the residual's z score of linear regression in order to know when to start a trade. It's the first time I ask for help in this forum so I don't know so much how to share my python program so you will see it below :
If you have any question please ask me, thank you for your help in advance.
def simulation_trade2(ISOs):
ISO1, ISO2, ISO3, ISO4 = get_data.convert_ISO(ISOs)
z_score = modelisation(ISOs)
z_score_std = z_score.std()
dates, data1, dates_2, data2 = get_data.match_size(ISO1, ISO2, ISO3, ISO4)
z_score_range = 1.2
balance = 10000
q = 0.01
lock_up = 0
lock_down = 0
fees = 0.01
short_pair1 = []
long_pair1 = []
short_pair2 = []
long_pair2 = []
balance_list = []
#Vente de l'actif 1 et achat de l'actif 2 si dépassement seuil haut
for i in range(len(data1)):
if z_score[i] >= z_score_std and z_score[i] <= z_score_std * z_score_range and balance > (2 * q * balance) and lock_up == 0:
short_pair1.append(((q * balance) * data1[i] * (1 - fees)))
long_pair2.append(((q * balance) * data2[i]))
balance = balance - (q * balance * (1 + fees))
lock_up = 1
if z_score[i] <= -z_score_std and z_score[i] >= -z_score_std * z_score_range and balance > (2 * q * balance) and lock_down == 0:
long_pair1.append(((q * balance) * data1[i]))
short_pair2.append(((q * balance) * data2[i] * (1 - fees)))
balance = balance - (q * balance * (1 + fees))
lock_down = 1
if z_score[i] > 0 and z_score[i] < z_score_std and not lock_up == 0:
for j in short_pair1:
balance = balance + (((j - data1[i]) / data1[i]))
for j in long_pair2:
balance = balance + (j / data2[i])
short_pair1.clear()
long_pair2.clear()
lock_up = 0
if z_score[i] < 0 and z_score[i] > -z_score_std and not lock_down == 0:
for j in short_pair2:
balance = balance + (((j - data2[i]) / data2[i]))
for j in long_pair1:
balance = balance + (j / data1[i])
short_pair2.clear()
long_pair1.clear()
lock_down = 0
balance_list.append(balance)
print(balance)
