Parcourir la source

Some new unfinished test, and repair matchTable calc

Axel Nordh il y a 4 ans
Parent
commit
e2eb2f7003

+ 11 - 0
OddsJavaFx/src/controllers/TestsController.java

@@ -26,6 +26,7 @@ import parser.OddsPortal;
 import tests.AwayTests;
 import tests.DrawTests;
 import tests.HomeDrawAwayTest;
+import tests.HomeTeamTest;
 import tests.HomeTests;
 import tests.LastResultsTest;
 import tests.PrioCountriesAll;
@@ -53,6 +54,7 @@ public class TestsController implements Initializable {
 	@FXML Button drawTest;
 	@FXML Button awayTest;
 	@FXML Button homeDrawAwayTest;
+	@FXML Button homeTeamTest;
 
 
 	ObservableList<String> countries = FXCollections.observableArrayList();
@@ -294,4 +296,13 @@ public class TestsController implements Initializable {
 
 		test.runTest();
 	}
+
+	@FXML
+	private void homeTeamTestAction() {
+		final HomeTeamTest test = new HomeTeamTest();
+
+		test.setup("", Float.valueOf(getStartingBank()), Float.valueOf(getBetLevel()), Float.valueOf(getBetMargin()), Integer.valueOf(getLookback()), 1, getCountryIdFromSelector(), getLeagueIdFromSelector());
+
+		test.runTest();
+	}
 }

+ 1 - 0
OddsJavaFx/src/fxml/Testing.fxml

@@ -59,6 +59,7 @@
                                     <Button fx:id="drawTest" onAction="#drawTestAction" text="Draw Test"/>
                                     <Button fx:id="awayTest" onAction="#awayTestAction" text="Away Test"/>
                                     <Button fx:id="homeDrawAwayTest" onAction="#homeDrawAwayTestAction" text="Combined 1X2 Test"/>
+                                    <Button fx:id="homeTeamTest" onAction="#homeTeamTestAction" text="Home Team margin test"/>
                                  </children>
                               </VBox>
                            </children>

+ 78 - 0
OddsJavaFx/src/objects/TeamSettings.java

@@ -0,0 +1,78 @@
+package objects;
+
+public class TeamSettings {
+
+	int teamId;
+	String teamName;
+	int lookbackHome;
+	int lookbackDraw;
+	int lookbackAway;
+	int marginHome;
+	int marginDraw;
+	int marginAway;
+
+	public TeamSettings(int teamId, String teamName, int lookbackHome, int lookbackDraw, int lookbackAway,
+			int marginHome, int marginDraw, int marginAway) {
+		this.teamId = teamId;
+		this.teamName = teamName;
+		this.lookbackHome = lookbackHome;
+		this.lookbackDraw = lookbackDraw;
+		this.lookbackAway = lookbackAway;
+		this.marginHome = marginHome;
+		this.marginDraw = marginDraw;
+		this.marginAway = marginAway;
+	}
+
+	public TeamSettings() {
+	}
+
+	public int getTeamId() {
+		return teamId;
+	}
+	public String getTeamName() {
+		return teamName;
+	}
+	public int getLookbackHome() {
+		return lookbackHome;
+	}
+	public int getLookbackDraw() {
+		return lookbackDraw;
+	}
+	public int getLookbackAway() {
+		return lookbackAway;
+	}
+	public int getMarginHome() {
+		return marginHome;
+	}
+	public int getMarginDraw() {
+		return marginDraw;
+	}
+	public int getMarginAway() {
+		return marginAway;
+	}
+	public void setTeamId(int teamId) {
+		this.teamId = teamId;
+	}
+	public void setTeamName(String teamName) {
+		this.teamName = teamName;
+	}
+	public void setLookbackHome(int lookbackHome) {
+		this.lookbackHome = lookbackHome;
+	}
+	public void setLookbackDraw(int lookbackDraw) {
+		this.lookbackDraw = lookbackDraw;
+	}
+	public void setLookbackAway(int lookbackAway) {
+		this.lookbackAway = lookbackAway;
+	}
+	public void setMarginHome(int marginHome) {
+		this.marginHome = marginHome;
+	}
+	public void setMarginDraw(int marginDraw) {
+		this.marginDraw = marginDraw;
+	}
+	public void setMarginAway(int marginAway) {
+		this.marginAway = marginAway;
+	}
+
+}

+ 0 - 1
OddsJavaFx/src/tests/HomeDrawAwayTest.java

@@ -183,7 +183,6 @@ public class HomeDrawAwayTest extends TestClass {
 				"Join Team as hTeam ON res.homeTeam = hTeam.id " +
 				"Join Team as aTeam ON res.awayTeam = aTeam.id " +
 				"WHERE " +
-				"DATE(gameDate) >= '2020-07-01' AND " +
 				"homeScore >= 0 AND " +
 				"awayScore >= 0 AND " +
 				"res.leagueId IN (" +

+ 236 - 0
OddsJavaFx/src/tests/HomeTeamTest.java

@@ -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;
+	}
+}

+ 9 - 2
OddsJavaFx/src/web/webDbConnection.php

@@ -98,10 +98,17 @@ class WebDbConnection {
             
             $homeTeamCountHome = $homeTeamResultsHome['wins'] + $homeTeamResultsHome['draws'] + $homeTeamResultsHome['lost'];
             $homeTeamCountAway = $homeTeamResultsAway['wins'] + $homeTeamResultsAway['draws'] + $homeTeamResultsAway['lost'];
+
+            $drawTeamCountHome = $drawTeamResultsHome['wins'] + $drawTeamResultsHome['draws'] + $drawTeamResultsHome['lost'];
+            $drawTeamCountAway = $drawTeamResultsAway['wins'] + $drawTeamResultsAway['draws'] + $drawTeamResultsAway['lost'];
+            
+            $awayTeamCountHome = $awayTeamResultsHome['wins'] + $awayTeamResultsHome['draws'] + $awayTeamResultsHome['lost'];
+            $awayTeamCountAway = $awayTeamResultsAway['wins'] + $awayTeamResultsAway['draws'] + $awayTeamResultsAway['lost'];
+            
             
             $homeWinPercent = round((($homeTeamResultsHome['wins'] + $homeTeamResultsAway['lost']) / ($homeTeamCountHome + $homeTeamCountAway)) * 100,2);
-            $drawPercent = round((($drawTeamResultsHome['draws'] + $drawTeamResultsAway['draws']) / ($homeTeamCountHome + $homeTeamCountAway)) * 100, 2);
-            $awayWinPercent = round((($awayTeamResultsAway['wins'] + $awayTeamResultsHome['lost']) / ($homeTeamCountHome + $homeTeamCountAway)) * 100, 2);
+            $drawPercent = round((($drawTeamResultsHome['draws'] + $drawTeamResultsAway['draws']) / ($drawTeamCountHome + $drawTeamCountAway)) * 100, 2);
+            $awayWinPercent = round((($awayTeamResultsAway['wins'] + $awayTeamResultsHome['lost']) / ($awayTeamCountHome + $awayTeamCountAway)) * 100, 2);
             
             $match['homeWinPercent'] = $homeWinPercent;
             $match['drawPercent'] = $drawPercent;