Portefeuille.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. from Model.Donnee import *
  2. from Model.profil import profile
  3. class CL_Achat:
  4. @profile
  5. def __init__(self, Parametre):
  6. self.portefeuille = [0] * Parametre.NBAction
  7. self.cash = Parametre.PortefeuilleDemarage
  8. self.fee = 0
  9. self.ValueTotalVeille = Parametre.PortefeuilleDemarage
  10. self.nbAchat = 0
  11. self.nbVente = 0
  12. self.PerteMax = 0
  13. self.GainMaxJour = 0
  14. self.JourGagnant = 0
  15. self.JourPerdant = 0
  16. @profile
  17. def achat(self, valeurs,Parametre,date,Donnee): #TODO Optimisé pour voir si on achet plus ou moins il y a d'autres stratégie d'achat a voir
  18. indices_tries = sorted(range(len(valeurs)), key=lambda i: valeurs[i], reverse=True)
  19. for i,p in zip(indices_tries[:Parametre.NBachat],Parametre.poidsAchat):
  20. if self.cash*p > 1000:
  21. self.achatAction(i,self.cash*p , date, Donnee)
  22. def achatAction(self,action, montant, date, Donnee):
  23. prix_total = montant + self.fee
  24. nb = montant / Donnee.ValeurDate(Donnee.listeAction[action], date)
  25. self.nbAchat += 1
  26. self.cash -= prix_total
  27. self.portefeuille[action] += nb
  28. @profile
  29. def vendsTout(self, action, date, Donnee):
  30. if (self.portefeuille[action] > 0):
  31. self.nbVente += 1
  32. prix_total = self.portefeuille[action] * Donnee.ValeurDate(Donnee.listeAction[action], date) - self.fee
  33. self.portefeuille[action] = 0
  34. self.cash += prix_total
  35. @profile
  36. def getCash(self):
  37. return self.cash
  38. @profile
  39. def getValueTotal(self, Date, Donnee):
  40. r = self.cash
  41. for a in range(len(self.portefeuille)):
  42. if (self.portefeuille[a] > 0):
  43. r += Donnee.ValeurDate(Donnee.listeAction[a], Date) * self.portefeuille[a]
  44. return r
  45. @profile
  46. def MarquetGlobal(self, resultat, listeJours, Parametre, Donnee):
  47. resultat_np = resultat
  48. PerteCourante = 0
  49. for NJour, date in enumerate(listeJours):
  50. valeurs = resultat_np[NJour]
  51. # Conditions vectorisées
  52. mask_vente = valeurs < Parametre.ValVente #On vend tous ce qui est inférieur a 0
  53. indices_vente = np.where(mask_vente)[0]
  54. for i in indices_vente:
  55. self.vendsTout(i, date, Donnee)
  56. self.achat(valeurs,Parametre,date,Donnee)
  57. ValeurJour = self.getValueTotal(date, Donnee)
  58. if (ValeurJour > self.ValueTotalVeille):
  59. PerteCourante = 0
  60. self.JourGagnant += 1
  61. gain = self.ValueTotalVeille - ValeurJour
  62. if (self.GainMaxJour < gain):
  63. self.GainMaxJour = gain
  64. elif (ValeurJour < self.ValueTotalVeille):
  65. self.JourPerdant += 1
  66. PerteCourante -= self.ValueTotalVeille - ValeurJour
  67. if (self.PerteMax > PerteCourante):
  68. self.PerteMax = PerteCourante
  69. self.ValueTotalVeille = ValeurJour