HomeTeamWinTest.java 6.3 KB

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