AwayTeamWinTest.java 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. package tests;
  2. import java.sql.PreparedStatement;
  3. import java.sql.ResultSet;
  4. import java.sql.SQLException;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7. import java.util.stream.Collectors;
  8. import objects.League;
  9. import objects.SoccerMatch;
  10. import objects.TeamSettings;
  11. public class AwayTeamWinTest extends TestClass {
  12. ArrayList<Integer> recalcTeamsList = new ArrayList<Integer>();
  13. private League leagueInfo;
  14. private ArrayList<SoccerMatch> matches;
  15. private ArrayList<SoccerMatch> trainMatches;
  16. @Override
  17. public void runTest() {
  18. matches = getMatches();
  19. trainMatches = getTrainMatches();
  20. leagueInfo = getLeagueInfoById();
  21. for (final SoccerMatch soccerMatch : matches) {
  22. final int homeTeamId = soccerMatch.getHomeTeam().getTeamId();
  23. final int awayTeamId = soccerMatch.getAwayTeam().getTeamId();
  24. TeamSettings awayTeamValues = getTeamValues(awayTeamId);
  25. if (awayTeamValues.getLookbackAway() <= 0 || awayTeamValues.getMarginAway() <= 0 ) {
  26. awayTeamValues = calculateTeamValues(awayTeamValues, false);
  27. }
  28. }
  29. System.out.println("Done with Away Team TEST");
  30. }
  31. private TeamSettings calculateTeamValues(TeamSettings teamSettings, boolean isHomeTeam) {
  32. final ArrayList<SoccerMatch> teamMatches;
  33. if (isHomeTeam) {
  34. teamMatches = (ArrayList<SoccerMatch>) trainMatches.stream().filter(p -> p.getHomeTeam().getTeamId() == teamSettings.getTeamId()).collect(Collectors.toList());
  35. } else {
  36. teamMatches = (ArrayList<SoccerMatch>) trainMatches.stream().filter(p -> p.getAwayTeam().getTeamId() == teamSettings.getTeamId()).collect(Collectors.toList());
  37. }
  38. float bestBankResult = startingBank;
  39. int bestBetMargin = 0;
  40. int bestLookBack = 0;
  41. final float betLevel = bettingLevel / 100f;
  42. float betAmount = startingBank * betLevel;
  43. for (int lookback = 4; lookback < 25; lookback++) {
  44. for (int margin = 1; margin < 25; margin++) {
  45. final float betMarginDecimal = 1 + (margin / 100f);
  46. float bank = startingBank;
  47. int betOnGameCount = 0;
  48. int wins = 0;
  49. for (final SoccerMatch soccerMatch : teamMatches) {
  50. final List<SoccerMatch> aktuellaMatcher = trainMatches.stream().filter(p -> p.getGameDate().isBefore(soccerMatch.getGameDate())).collect(Collectors.toList());
  51. if (soccerMatch.getHomeScore() < 0 || soccerMatch.getAwayScore() < 0) {
  52. continue;
  53. }
  54. // Hemma lagets resultat
  55. final List<SoccerMatch> hemmaMatcher = aktuellaMatcher.stream().filter(p -> p.getHomeTeam().getTeamId() == teamSettings.getTeamId()).limit(lookback).collect(Collectors.toList());
  56. final long hemmaForluster = hemmaMatcher.stream().filter(p -> p.getHomeScore() < p.getAwayScore()).count();
  57. // borta lagets resultat
  58. final List<SoccerMatch> bortaMatcher = aktuellaMatcher.stream().filter(p -> p.getAwayTeam().getTeamId() == soccerMatch.getAwayTeam().getTeamId()).limit(lookback).collect(Collectors.toList());
  59. final long bortaVinster = bortaMatcher.stream().filter(p -> p.getHomeScore() < p.getAwayScore()).count();
  60. final float awayWinPercent = (bortaVinster + hemmaForluster) / Float.valueOf(hemmaMatcher.size() + bortaMatcher.size()) * 100;
  61. final float awayOdds = 100 / awayWinPercent;
  62. betAmount = bank * betLevel;
  63. // Spela på borta vinst?
  64. if (awayOdds * betMarginDecimal <= soccerMatch.getOdds2()) {
  65. betOnGameCount++;
  66. bank = bank - betAmount;
  67. if (soccerMatch.getAwayScore() > soccerMatch.getHomeScore()) {
  68. wins++;
  69. bank = bank + betAmount * soccerMatch.getOdds2();
  70. }
  71. }
  72. if (bank != startingBank && bestBankResult < bank) {
  73. bestBetMargin = margin;
  74. bestLookBack = lookback;
  75. bestBankResult = bank;
  76. } else if (bestBankResult != startingBank && bestBankResult == bank) {
  77. bestBetMargin = margin;
  78. bestLookBack = lookback;
  79. bestBankResult = bank;
  80. }
  81. }
  82. }
  83. }
  84. if (bestLookBack > 0 && teamSettings.getLookbackAway() != bestLookBack) {
  85. System.out.println("Setting lookbackAway " + bestLookBack + " and margin " + bestBetMargin + " for team " + teamSettings.getTeamName() + " with a bank of " + bestBankResult);
  86. teamSettings.setLookbackAway(bestLookBack);
  87. teamSettings.setMarginAway(bestBetMargin);
  88. }
  89. return teamSettings;
  90. }
  91. private TeamSettings getTeamValues(int teamId) {
  92. final String sql = "SELECT * FROM Team WHERE id = ?";
  93. final TeamSettings ts = new TeamSettings();
  94. try {
  95. final PreparedStatement stmt = getConnection().prepareStatement(sql);
  96. stmt.setInt(1, teamId);
  97. final ResultSet rs = stmt.executeQuery();
  98. while (rs.next()) {
  99. ts.setTeamId(teamId);
  100. ts.setTeamName(rs.getString("name"));
  101. ts.setLookbackHome(rs.getInt("lookbackHome"));
  102. ts.setLookbackDraw(rs.getInt("lookbackDraw"));
  103. ts.setLookbackAway(rs.getInt("lookbackAway"));
  104. ts.setMarginHome(rs.getInt("marginHome"));
  105. ts.setMarginDraw(rs.getInt("marginDraw"));
  106. ts.setMarginAway(rs.getInt("marginAway"));
  107. }
  108. } catch (final SQLException e) {
  109. // TODO Auto-generated catch block
  110. e.printStackTrace();
  111. }
  112. return ts;
  113. }
  114. private ArrayList<SoccerMatch> getMatches() {
  115. final ArrayList<SoccerMatch> result = new ArrayList<>();
  116. final String sql = "SELECT res.*, "
  117. + "hTeam.name as homeTeamName, aTeam.name as awayTeamName "
  118. + "FROM SoccerResults as res "
  119. + "Join Team as hTeam ON res.homeTeam = hTeam.id "
  120. + "Join Team as aTeam ON res.awayTeam = aTeam.id "
  121. + "WHERE "
  122. + "DATE(gameDate) > DATE_SUB(NOW(), INTERVAL 1 YEAR) AND "
  123. + "res.leagueId = ? "
  124. + "ORDER BY gameDate ASC";
  125. try {
  126. final PreparedStatement stmt = getConnection().prepareStatement(sql);
  127. stmt.setInt(1, leagueId);
  128. result.addAll(super.getMatches(stmt));
  129. } catch (final SQLException e) {
  130. e.printStackTrace();
  131. }
  132. return result;
  133. }
  134. private ArrayList<SoccerMatch> getTrainMatches() {
  135. final ArrayList<SoccerMatch> result = new ArrayList<>();
  136. final String sql = "SELECT res.*, "
  137. + "hTeam.name as homeTeamName, aTeam.name as awayTeamName "
  138. + "FROM SoccerResults as res "
  139. + "Join Team as hTeam ON res.homeTeam = hTeam.id "
  140. + "Join Team as aTeam ON res.awayTeam = aTeam.id "
  141. + "WHERE "
  142. + "DATE(gameDate) < DATE_SUB(NOW(), INTERVAL 1 YEAR) AND "
  143. + "res.leagueId = ? "
  144. + "ORDER BY gameDate DESC";
  145. try {
  146. final PreparedStatement stmt = getConnection().prepareStatement(sql);
  147. stmt.setInt(1, leagueId);
  148. result.addAll(super.getMatches(stmt));
  149. } catch (final SQLException e) {
  150. e.printStackTrace();
  151. }
  152. return result;
  153. }
  154. }