recalcTest.java 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. package tests;
  2. import java.sql.PreparedStatement;
  3. import java.sql.SQLException;
  4. import java.time.LocalDateTime;
  5. import java.time.format.DateTimeFormatter;
  6. import java.util.ArrayList;
  7. import java.util.List;
  8. import java.util.stream.Collectors;
  9. import objects.SoccerMatch;
  10. public class recalcTest extends TestClass {
  11. float prevHomeBank = -1;
  12. float prevDrawBank = -1;
  13. float prevAwayBank = -1;
  14. @Override
  15. public void runTest() {
  16. final int daysInPast = 360;
  17. final int recalcDays = 14;
  18. final ArrayList<SoccerMatch> matches = getMatches();
  19. final LocalDateTime startDate = matches.get(0).getGameDate();
  20. LocalDateTime endDate = startDate.plusYears(1);
  21. CalculateLookback(leagueId, startDate, daysInPast);
  22. LocalDateTime recalcDate = startDate.plusDays(recalcDays);
  23. float bank = startingBank;
  24. final float betLevel = this.bettingLevel / 100f;
  25. float betAmount = bank * betLevel;
  26. int betHomeCount = 0;
  27. int betDrawCount = 0;
  28. int betAwayCount = 0;
  29. int winHome = 0;
  30. int winDraw = 0;
  31. int winAway = 0;
  32. for (final SoccerMatch soccerMatch : matches) {
  33. if (soccerMatch.getGameDate().isAfter(endDate)) {
  34. System.out.println("End date reached " + endDate.format(DateTimeFormatter.ISO_DATE) + " with bank: " + bank +
  35. " Betted on: " + betHomeCount + "," + betDrawCount + "," + betAwayCount +
  36. " winPercent " + (betHomeCount>0?winHome/Float.valueOf(betHomeCount):0) + "," +
  37. (betDrawCount>0?winDraw/Float.valueOf(betDrawCount):0) + "," +
  38. (betAwayCount>0?winAway/Float.valueOf(betAwayCount):0));
  39. bank = startingBank;
  40. endDate = soccerMatch.getGameDate().plusYears(1);
  41. betHomeCount = 0;
  42. betDrawCount = 0;
  43. betAwayCount = 0;
  44. winHome = 0;
  45. winDraw = 0;
  46. winAway = 0;
  47. }
  48. if (recalcDate.isBefore(soccerMatch.getGameDate())) {
  49. final int prevBestLookbackHome = this.bestHomeLookback;
  50. final int prevBestLookbackDraw = this.bestDrawLookback;
  51. final int prevBestLookbackAway = this.bestAwayLookback;
  52. final int prevBestMarginHome = this.bestHomeMargin;
  53. final int prevBestMarginDraw = this.bestDrawMargin;
  54. final int prevBestMarginAway = this.bestAwayMargin;
  55. CalculateLookback(leagueId, soccerMatch.getGameDate(), daysInPast);
  56. recalcDate = soccerMatch.getGameDate().plusDays(recalcDays);
  57. }
  58. final List<SoccerMatch> homeMatches = matches.stream().filter(p -> p.getGameDate().isBefore(soccerMatch.getGameDate()) && p.getHomeTeam().getTeamId() == soccerMatch.getHomeTeam().getTeamId()).limit(bestHomeLookback).collect(Collectors.toList());
  59. final List<SoccerMatch> awayMatches = matches.stream().filter(p -> p.getGameDate().isBefore(soccerMatch.getGameDate()) && p.getAwayTeam().getTeamId() == soccerMatch.getAwayTeam().getTeamId()).limit(bestAwayLookback).collect(Collectors.toList());
  60. final long homeWins = homeMatches.stream().filter(p -> p.getHomeScore() > p.getAwayScore()).count();
  61. final long homeLosses = homeMatches.stream().filter(p -> p.getHomeScore() < p.getAwayScore()).count(); // borde det vara <=??
  62. final long homeDraws = homeMatches.stream().filter(p -> p.getHomeScore() == p.getAwayScore()).count();
  63. final long awayWins = awayMatches.stream().filter(p -> p.getHomeScore() < p.getAwayScore()).count();
  64. final long awayLosses = awayMatches.stream().filter(p -> p.getHomeScore() > p.getAwayScore()).count();
  65. final long awayDraws = awayMatches.stream().filter(p -> p.getHomeScore() == p.getAwayScore()).count();
  66. final float hemmaPercent = (homeWins + awayLosses) / Float.valueOf(homeMatches.size() + awayMatches.size()) * 100f;
  67. final float bortaPercent = (awayWins + homeLosses) / Float.valueOf(homeMatches.size() + awayMatches.size()) * 100f;
  68. final float likaPercent = (homeDraws + awayDraws) / Float.valueOf(homeMatches.size() + awayMatches.size()) * 100f;
  69. final float homeOdds = 100 / hemmaPercent;
  70. final float drawOdds = 100 / likaPercent;
  71. final float awayOdds = 100 / bortaPercent;
  72. betAmount = bank * betLevel;
  73. if (this.bestHomeMargin > 0 && homeOdds * (1 + (this.bestHomeMargin / 100f)) <= soccerMatch.getOdds1()) {
  74. bank -= betAmount;
  75. betHomeCount++;
  76. if (soccerMatch.getHomeScore() > soccerMatch.getAwayScore()) {
  77. winHome++;
  78. bank += betAmount * soccerMatch.getOdds1();
  79. }
  80. }
  81. if (this.bestDrawMargin > 0 && drawOdds * (1 + (this.bestDrawMargin / 100f)) <= soccerMatch.getOddsX()) {
  82. bank -= betAmount;
  83. betDrawCount++;
  84. if (soccerMatch.getHomeScore() == soccerMatch.getAwayScore()) {
  85. winDraw++;
  86. bank += betAmount * soccerMatch.getOddsX();
  87. }
  88. }
  89. if (this.bestAwayMargin > 0 && awayOdds * (1 + (this.bestAwayMargin / 100f)) <= soccerMatch.getOdds2()) {
  90. bank -= betAmount;
  91. betAwayCount++;
  92. if (soccerMatch.getHomeScore() < soccerMatch.getAwayScore()) {
  93. winAway++;
  94. bank += betAmount * soccerMatch.getOdds2();
  95. }
  96. }
  97. }
  98. System.out.println("End of test reached with bank: " + bank +
  99. " Betted on: " + betHomeCount + "," + betDrawCount + "," + betAwayCount +
  100. " winPercent " + (betHomeCount>0?winHome/Float.valueOf(betHomeCount):0) + "," +
  101. (betDrawCount>0?winDraw/Float.valueOf(betDrawCount):0) + "," +
  102. (betAwayCount>0?winAway/Float.valueOf(betAwayCount):0));
  103. System.out.println("Ending Margins " + this.bestHomeMargin + ", " + this.bestDrawMargin + ", " + this.bestAwayMargin + System.lineSeparator() + "Best Lookback " + this.bestHomeLookback + ", " + this.bestDrawLookback + ", " + this.bestAwayLookback);
  104. }
  105. private ArrayList<SoccerMatch> getMatches() {
  106. final ArrayList<SoccerMatch> result = new ArrayList<>();
  107. final String sql = "SELECT res.*, "
  108. + "hTeam.name as homeTeamName, aTeam.name as awayTeamName "
  109. + "FROM SoccerResults as res "
  110. + "Join Team as hTeam ON res.homeTeam = hTeam.id "
  111. + "Join Team as aTeam ON res.awayTeam = aTeam.id "
  112. + "WHERE "
  113. + "res.leagueId = ? "
  114. + "ORDER BY gameDate ASC";
  115. try {
  116. final PreparedStatement stmt = getConnection().prepareStatement(sql);
  117. stmt.setInt(1, leagueId);
  118. result.addAll(super.getMatches(stmt));
  119. } catch (final SQLException e) {
  120. e.printStackTrace();
  121. }
  122. return result;
  123. }
  124. }