|
|
@@ -0,0 +1,236 @@
|
|
|
+package tests;
|
|
|
+
|
|
|
+import java.sql.PreparedStatement;
|
|
|
+import java.sql.ResultSet;
|
|
|
+import java.sql.SQLException;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+import objects.League;
|
|
|
+import objects.SoccerMatch;
|
|
|
+import objects.TeamSettings;
|
|
|
+
|
|
|
+public class HomeTeamTest extends TestClass {
|
|
|
+
|
|
|
+ ArrayList<Integer> recalcTeamsList = new ArrayList<Integer>();
|
|
|
+ private League leagueInfo;
|
|
|
+ private ArrayList<SoccerMatch> matches;
|
|
|
+ private ArrayList<SoccerMatch> trainMatches;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void runTest() {
|
|
|
+ matches = getMatches();
|
|
|
+ trainMatches = getTrainMatches();
|
|
|
+
|
|
|
+ leagueInfo = getLeagueInfoById();
|
|
|
+ for (final SoccerMatch soccerMatch : matches) {
|
|
|
+ final int homeTeamId = soccerMatch.getHomeTeam().getTeamId();
|
|
|
+ final int awayTeamId = soccerMatch.getAwayTeam().getTeamId();
|
|
|
+
|
|
|
+ TeamSettings homeTeamValues = getTeamValues(homeTeamId);
|
|
|
+ final TeamSettings awayTeamValues = getTeamValues(awayTeamId);
|
|
|
+
|
|
|
+ if (homeTeamValues.getLookbackHome() <= 0 || homeTeamValues.getMarginHome() <= 0 ) {
|
|
|
+ homeTeamValues = calculateTeamValues(homeTeamValues, true);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ // if (awayTeamValues.getLookbackAway() <= 0 || awayTeamValues.getMarginAway() <= 0 ) {
|
|
|
+ // awayTeamValues = calculateTeamValues(awayTeamValues, false);
|
|
|
+ // }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private TeamSettings calculateTeamValues(TeamSettings teamSettings, boolean isHomeTeam) {
|
|
|
+ // TODO
|
|
|
+
|
|
|
+ // 1. plocka ut teamets matcher beroende på hemma/borta
|
|
|
+ // 2. filtrera träningsmatcherna på datum innan aktuell match
|
|
|
+ // 3. loopa över de träningsmatcher som stämmer
|
|
|
+ final ArrayList<SoccerMatch> teamMatches;
|
|
|
+ if (isHomeTeam) {
|
|
|
+ teamMatches = (ArrayList<SoccerMatch>) trainMatches.stream().filter(p -> p.getHomeTeam().getTeamId() == teamSettings.getTeamId()).collect(Collectors.toList());
|
|
|
+ } else {
|
|
|
+ teamMatches = (ArrayList<SoccerMatch>) trainMatches.stream().filter(p -> p.getAwayTeam().getTeamId() == teamSettings.getTeamId()).collect(Collectors.toList());
|
|
|
+ }
|
|
|
+
|
|
|
+ float bestBankResult = startingBank;
|
|
|
+ int bestBetMargin = 0;
|
|
|
+ int bestLookBack = 0;
|
|
|
+
|
|
|
+ final float betLevel = bettingLevel / 100f;
|
|
|
+ float betAmount = startingBank * betLevel;
|
|
|
+
|
|
|
+ for (int lookback = 1; lookback < 25; lookback++) {
|
|
|
+ for (int margin = 1; margin < 25; margin++) {
|
|
|
+ final float betMarginDecimal = 1 + (margin / 100);
|
|
|
+ float bank = startingBank;
|
|
|
+ int betOnGameCount = 0;
|
|
|
+ int wins = 0;
|
|
|
+ for (final SoccerMatch soccerMatch : teamMatches) {
|
|
|
+ final List<SoccerMatch> aktuellaMatcher = trainMatches.stream().filter(p -> p.getGameDate().isBefore(soccerMatch.getGameDate())).collect(Collectors.toList());
|
|
|
+ if (soccerMatch.getHomeScore() < 0 || soccerMatch.getAwayScore() < 0) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Hemma lagets resultat
|
|
|
+ final List<SoccerMatch> hemmaMatcher = aktuellaMatcher.stream().filter(p -> p.getHomeTeam().getTeamId() == teamSettings.getTeamId()).limit(lookback).collect(Collectors.toList());
|
|
|
+ final long hemmaVinster = hemmaMatcher.stream().filter(p -> p.getHomeScore() > p.getAwayScore()).count();
|
|
|
+ final long lika = hemmaMatcher.stream().filter(p -> p.getHomeScore() == p.getAwayScore()).count();
|
|
|
+ final long hemmaForluster = hemmaMatcher.stream().filter(p -> p.getHomeScore() < p.getAwayScore()).count();
|
|
|
+
|
|
|
+ // borta lagets resultat
|
|
|
+ final List<SoccerMatch> bortaMatcher = aktuellaMatcher.stream().filter(p -> p.getAwayTeam().getTeamId() == soccerMatch.getAwayTeam().getTeamId()).limit(lookback).collect(Collectors.toList());
|
|
|
+ final long bortaVinster = bortaMatcher.stream().filter(p -> p.getHomeScore() < p.getAwayScore()).count();
|
|
|
+ final long likaBortalag = bortaMatcher.stream().filter(p -> p.getHomeScore() == p.getAwayScore()).count();
|
|
|
+ final long bortaForluster = bortaMatcher.stream().filter(p -> p.getHomeScore() > p.getAwayScore()).count();
|
|
|
+
|
|
|
+
|
|
|
+ // final TeamResults homeTeamResults = GuiMysql.getInstance().getTeamResultsTest(soccerMatch.getHomeTeam().getTeamId(), lookback, true, sm.getGameDate().format(DateTimeFormatter.ISO_DATE));
|
|
|
+ // final TeamResults awayTeamResults = GuiMysql.getInstance().getTeamResultsTest(soccerMatch.getAwayTeam().getTeamId(), lookback, false, sm.getGameDate().format(DateTimeFormatter.ISO_DATE));
|
|
|
+
|
|
|
+ final float homeWinPercent = (hemmaVinster + bortaForluster) / Float.valueOf(hemmaMatcher.size() + bortaMatcher.size()) * 100;
|
|
|
+ final float homeOdds = 100 / homeWinPercent;
|
|
|
+
|
|
|
+ betAmount = bank * betLevel;
|
|
|
+
|
|
|
+ // Spela på hemma vins?
|
|
|
+ if (homeOdds * betMarginDecimal <= soccerMatch.getOdds1()) {
|
|
|
+ betOnGameCount++;
|
|
|
+ bank = bank - betAmount;
|
|
|
+ if (soccerMatch.getHomeScore() > soccerMatch.getAwayScore()) {
|
|
|
+ wins++;
|
|
|
+ bank = bank + betAmount * soccerMatch.getOdds1();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // Spela på lika?
|
|
|
+ final float tiePercent = (lika + likaBortalag) / Float.valueOf(hemmaMatcher.size() + bortaMatcher.size()) * 100;
|
|
|
+ final float tieOdds = 100 / tiePercent;
|
|
|
+
|
|
|
+ if (tieOdds * betMarginDecimal <= soccerMatch.getOddsX()) {
|
|
|
+ betOnGameCount++;
|
|
|
+ bank = bank - betAmount;
|
|
|
+ if (soccerMatch.getHomeScore() == soccerMatch.getAwayScore()) {
|
|
|
+ wins++;
|
|
|
+ bank = bank + betAmount * soccerMatch.getOddsX();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ final float awayWinPercent = (hemmaForluster + bortaVinster) / Float.valueOf(hemmaMatcher.size() + bortaMatcher.size()) * 100;
|
|
|
+ final float awayOdds = 100 / awayWinPercent;
|
|
|
+
|
|
|
+
|
|
|
+ // Spela på borta vins?
|
|
|
+ if (awayOdds * betMarginDecimal <= soccerMatch.getOdds2()) {
|
|
|
+ betOnGameCount++;
|
|
|
+ bank = bank - betAmount;
|
|
|
+ if (soccerMatch.getHomeScore() < soccerMatch.getAwayScore()) {
|
|
|
+ wins++;
|
|
|
+ bank = bank + betAmount * soccerMatch.getOdds2();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if (bestBankResult < bank) {
|
|
|
+ System.out.println("NEW best bank " + bank + " for team " + teamSettings.getTeamName() + " with lookback " + lookback + " and betMargin " + margin +
|
|
|
+ " Bet on " + betOnGameCount + " of " + matches.size() + "(" + betOnGameCount / (float)matches.size() + ") wins " + wins + "(" + wins/Float.valueOf(betOnGameCount) + ")" +
|
|
|
+ " Win / game " + (bank - startingBank) / Float.valueOf(wins) + " kr");
|
|
|
+ bestBetMargin = margin;
|
|
|
+ bestLookBack = lookback;
|
|
|
+ bestBankResult = bank;
|
|
|
+ } else if (bestBankResult == bank) {
|
|
|
+ System.out.println("SAME best bank " + bank + " for team " + teamSettings.getTeamName() + " with lookback " + lookback + " and betMargin " + margin +
|
|
|
+ " Bet on " + betOnGameCount + " of " + matches.size() + "(" + betOnGameCount / (float)matches.size() + ") wins " + wins + "(" + wins/Float.valueOf(betOnGameCount) + ")" +
|
|
|
+ " Win / game " + (bank - startingBank) / Float.valueOf(wins) + " kr");
|
|
|
+ } else {
|
|
|
+ // System.out.println("NOT BEST bank " + bank + " for team " + teamSettings.getTeamName() + " with lookback " + lookback + " and betMargin " + margin +
|
|
|
+ // " Bet on " + betOnGameCount + " of " + matches.size() + "(" + betOnGameCount / (float)matches.size() + ") wins " + wins + "(" + wins/Float.valueOf(betOnGameCount) + ")" +
|
|
|
+ // " Win / game " + (bank - startingBank) / Float.valueOf(wins) + " kr");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return teamSettings;
|
|
|
+ }
|
|
|
+
|
|
|
+ private TeamSettings getTeamValues(int teamId) {
|
|
|
+ final String sql = "SELECT * FROM Team WHERE id = ?";
|
|
|
+ final TeamSettings ts = new TeamSettings();
|
|
|
+ try {
|
|
|
+ final PreparedStatement stmt = getConnection().prepareStatement(sql);
|
|
|
+ stmt.setInt(1, teamId);
|
|
|
+
|
|
|
+ final ResultSet rs = stmt.executeQuery();
|
|
|
+
|
|
|
+ while (rs.next()) {
|
|
|
+ ts.setTeamId(teamId);
|
|
|
+ ts.setTeamName(rs.getString("name"));
|
|
|
+ ts.setLookbackHome(rs.getInt("lookbackHome"));
|
|
|
+ ts.setLookbackDraw(rs.getInt("lookbackDraw"));
|
|
|
+ ts.setLookbackAway(rs.getInt("lookbackAway"));
|
|
|
+ ts.setMarginHome(rs.getInt("marginHome"));
|
|
|
+ ts.setMarginDraw(rs.getInt("marginDraw"));
|
|
|
+ ts.setMarginAway(rs.getInt("marginAway"));
|
|
|
+ }
|
|
|
+
|
|
|
+ } catch (final SQLException e) {
|
|
|
+ // TODO Auto-generated catch block
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
+ return ts;
|
|
|
+ }
|
|
|
+
|
|
|
+ private ArrayList<SoccerMatch> getMatches() {
|
|
|
+ final ArrayList<SoccerMatch> result = new ArrayList<>();
|
|
|
+
|
|
|
+ final String sql = "SELECT res.*, "
|
|
|
+ + "hTeam.name as homeTeamName, aTeam.name as awayTeamName "
|
|
|
+ + "FROM SoccerResults as res "
|
|
|
+ + "Join Team as hTeam ON res.homeTeam = hTeam.id "
|
|
|
+ + "Join Team as aTeam ON res.awayTeam = aTeam.id "
|
|
|
+ + "WHERE "
|
|
|
+ + "DATE(gameDate) > DATE_SUB(NOW(), INTERVAL 1 YEAR) AND "
|
|
|
+ + "res.leagueId = ? "
|
|
|
+ + "ORDER BY gameDate ASC";
|
|
|
+
|
|
|
+ try {
|
|
|
+ final PreparedStatement stmt = getConnection().prepareStatement(sql);
|
|
|
+ stmt.setInt(1, leagueId);
|
|
|
+
|
|
|
+ result.addAll(super.getMatches(stmt));
|
|
|
+ } catch (final SQLException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ private ArrayList<SoccerMatch> getTrainMatches() {
|
|
|
+ final ArrayList<SoccerMatch> result = new ArrayList<>();
|
|
|
+
|
|
|
+ final String sql = "SELECT res.*, "
|
|
|
+ + "hTeam.name as homeTeamName, aTeam.name as awayTeamName "
|
|
|
+ + "FROM SoccerResults as res "
|
|
|
+ + "Join Team as hTeam ON res.homeTeam = hTeam.id "
|
|
|
+ + "Join Team as aTeam ON res.awayTeam = aTeam.id "
|
|
|
+ + "WHERE "
|
|
|
+ + "DATE(gameDate) < DATE_SUB(NOW(), INTERVAL 1 YEAR) AND "
|
|
|
+ + "res.leagueId = ? "
|
|
|
+ + "ORDER BY gameDate ASC";
|
|
|
+
|
|
|
+ try {
|
|
|
+ final PreparedStatement stmt = getConnection().prepareStatement(sql);
|
|
|
+ stmt.setInt(1, leagueId);
|
|
|
+
|
|
|
+ result.addAll(super.getMatches(stmt));
|
|
|
+ } catch (final SQLException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+}
|