The Los Angeles Dodgers once again dominated the headlines in January 2026, securing superstar outfielder Kyle Tucker with a massive four-year, $240 million contract. After a brief but productive stint with the Chicago Cubs in 2025, Tucker joins a Dodgers lineup that is already arguably the most feared in baseball. The Dodgers starting lineup can look like: 1. Ohtani, 2. Betts, 3. Freeman, 4. Smith, 5. Tucker. Having a lineup with such high OBP and power potential will be a nightmare for opposing pitchers.
2025 Review: A Cub in Transition
Following his trade from the Houston Astros in late 2024, Tucker adapted quickly to the Friendly Confines of Wrigley Field. While 2025 was a year of adjustment, his Statcast metrics remained elite, suggesting that his move to Los Angeles comes right as he is hitting his peak.
Statcast Analysis: 2025 Performance
The following analysis was performed on Tucker’s 2025 Statcast data to derive the metrics used in this article.
Analyzing the 2025 at-bat data reveals a hitter who remains fundamentally sound with high-end power potential.
Average Exit Velocity: 87.48 MPH
Hard-Hit Rate (95+ MPH): 32.71%
Average Launch Angle: 10.99
Home Runs: 5 (in this specific data slice)
Plate Discipline: 18 Walks vs. 30 Strikeouts across 157 plate appearances.
Performance by Pitch Type
Tucker continues to be a terror against fastballs, which bodes well for his transition to the NL West’s high-velocity environments.
Pitch Type
Frequency
Avg Exit Velocity (MPH)
4-Seam Fastball
60
91.72
Sinker
25
85.64
Slider
21
82.28
Changeup
17
89.09
Cutter
9
91.27
The 91.72 MPH average exit velocity against the four-seamer stands out as his primary weapon. Even against breaking stuff like the Slider and Sweeper, Tucker maintained competitive contact, though his highest damage was clearly reserved for the heater.
Visualizing Trends: Rolling Average EV
To better understand Tucker’s consistency, we can look at the rolling average of his exit velocity across the 2025 season.
Code
import matplotlib.pyplot as pltimport seaborn as sns# Ensure data is sorted chronologicallyev_la_df["Game Date"] = pd.to_datetime(ev_la_df["Game Date"])ev_la_df = ev_la_df.sort_values("Game Date")# Calculate rolling averageev_la_df['Rolling EV'] = ev_la_df['EV (MPH)'].rolling(window=15).mean()plt.figure(figsize=(6, 4))# Plotting raw data as points to highlight the density/gapssns.scatterplot(data=ev_la_df, x='Game Date', y='EV (MPH)', alpha=0.2, color='gray', label='Individual BBE')sns.lineplot(data=ev_la_df, x='Game Date', y='Rolling EV', color='tab:blue', linewidth=2.5, label='15-BBE Rolling Avg')# The gap between August and October represents a period with no recorded plate appearances (likely an IL stint)plt.title('Kyle Tucker 2025 Rolling Exit Velocity (Season Timeline)')plt.xlabel('Date')plt.ylabel('Exit Velocity (MPH)')plt.xticks(rotation=45)plt.grid(True, linestyle='--', alpha=0.6)plt.legend()plt.tight_layout()plt.show()
Figure 1: Kyle Tucker 2025 Rolling Exit Velocity (Season Timeline)
Forecasting for 2026: ARIMA Model
Using an ARIMA (AutoRegressive Integrated Moving Average) model, we can attempt to forecast the trend of Tucker’s exit velocity as he enters the 2026 season. Let’s first explain what an ARIMA model is. Time series analysis is a statistical method that uses historical data to make predictions about future values. ARIMA models are a type of time series model that can be used to forecast the trend of a time series.
An ARIMA model, denoted as ARIMA(p, d, q), is a class of statistical models that captures temporal structures in time series data. Formally, for a stochastic process \{X_t\}, the model is defined by the equation:
\phi(L)(1 - L)^d X_t = \theta(L)\epsilon_t
Where:
L is the lag (backshift) operator, defined such that L^k X_t = X_{t-k}.
d (Integrated) is the degree of differencing required to achieve stationarity. The term (1 - L)^d represents the d-th order difference operator.
\phi(L) (AutoRegressive) is a polynomial of order p: \phi(L) = 1 - \sum_{i=1}^p \phi_i L^i. This captures the linear dependence of X_t on its own previous values.
\theta(L) (Moving Average) is a polynomial of order q: \theta(L) = 1 + \sum_{j=1}^q \theta_j L^j. This represents the relationship between the observation and the q previous white noise error terms.
\epsilon_t is a white noise process with mean zero and variance \sigma^2.
The model assumes that the d-th difference of the series follows a stationary ARMA process, allowing us to model non-stationary data that exhibits a stochastic trend. Individual parameters are typically estimated via Maximum Likelihood Estimation (MLE) or least squares.
So how do we find p, d, and q? Well, we can use the autocorrelation function (ACF) and partial autocorrelation function (PACF) to help us determine the values of p and q. The ACF measures the correlation between the time series and its lagged values, while the PACF measures the correlation between the time series and its lagged values after removing the effects of the intermediate lags.
Code
from statsmodels.tsa.arima.model import ARIMAimport numpy as npfrom statsmodels.tsa.stattools import adfullerimport matplotlib.dates as mdatesev_series = ev_la_df['EV (MPH)'].values# Perform Augmented Dickey-Fuller testadf_result = adfuller(ev_series)print(f'ADF Statistic: {adf_result[0]}')print(f'p-value: {adf_result[1]}')print(f'Critical Values: {adf_result[4]}')# plot the partial autocorrelation functionfrom statsmodels.graphics.tsaplots import plot_pacfplot_pacf(ev_series)plt.show()
The PACF shows a significant correlation at lag 1, indicating that the time series is non-stationary and requires differencing. The ACF shows a significant correlation at lag 1, indicating that the time series is non-stationary and requires differencing. We’ll use p=1. Note that we also ran the Augmented Dickey-Fuller test to confirm that the time series is non-stationary. The p-value is less than 0.05, indicating that the time series is non-stationary. Hence, d=0.
Below we show the ACF for the time series.
Code
# plot the autocorrelation functionfrom statsmodels.graphics.tsaplots import plot_acfplot_acf(ev_series)plt.show()
Figure 3: Kyle Tucker 2025 ACF
Similar to the PACF, the ACF shows a significant correlation at lag 1, indicating that the time series is non-stationary and requires differencing. We’ll use q=1.
Finally, we’ll fit the ARIMA model and forecast the next 20 BBE.
Code
# Fit ARIMA model (p,d,q) - using (1,0,1) as a starting pointmodel = ARIMA(ev_series, order=(1, 0, 1))model_fit = model.fit()# Forecast the next 20 bbeforecast_steps =20forecast = model_fit.forecast(steps=forecast_steps)history_size =len(ev_series)forecast_obj = model_fit.get_forecast(steps=forecast_steps)forecast_df = forecast_obj.summary_frame()# 2. Extract valuesforecast_mean = forecast_df['mean']conf_int_lower = forecast_df['mean_ci_lower']conf_int_upper = forecast_df['mean_ci_upper']# 3. Plottingplt.figure(figsize=(8, 4))# Plot historysns.lineplot(x=np.arange(history_size), y=ev_series, label='Observed EV (2025)', color='tab:blue')# Plot forecast meanforecast_idx = np.arange(history_size, history_size + forecast_steps)sns.lineplot(x=forecast_idx, y=forecast_mean, color='red', label='Forecasted EV (2026)', linestyle='--')# Plot accurate Confidence Intervals from the modelplt.fill_between(forecast_idx, conf_int_lower, conf_int_upper, color='pink', alpha=0.3, label='95% Confidence Inter val')plt.title('Kyle Tucker Exit Velocity Forecast (ARIMA)')plt.xlabel('At-Bat Number (Sequential)')plt.ylabel('Exit Velocity (MPH)')plt.legend()plt.show()
Figure 4: Kyle Tucker 2026 Exit Velocity Forecast
The ARIMA model indicates Tucker’s exit velocity is not dependent on the previous exit velocity. This is not unexpected given the small sample size of 2025. In other words, forecasting Tucker’s exit velocity is only as good as taking the mean of the exit velocity in 2025.
The model’s coefficients are shown below.
Code
from IPython.display import Markdownfrom tabulate import tabulateimport pandas as pd# Extract the coefficients table from the ARIMA model summarysummary_table = model_fit.summary().tables[1]summary_df = pd.DataFrame(summary_table.data[1:], columns=summary_table.data[0])# Display the summary table in Markdown formatMarkdown(tabulate(summary_df, headers='keys', tablefmt='pipe'))
Table 2: A table showing the forecast coefficients for the ARIMA model
coef
std err
z
P>
z
0
const
89.6849
0.8
112.174
0
88.118
91.252
1
ar.L1
-0.0897
1.149
-0.078
0.938
-2.342
2.163
2
ma.L1
0.1414
1.14
0.124
0.901
-2.094
2.376
3
sigma2
164.441
10.693
15.379
0
143.483
185.399
The p-values for ar.L1 and ma.L1 are both greater than 0.05, indicating that the coefficients are not significantly different from zero.
2026 Projection: The Dodgers Effect
Key Projections for 2026:
Increased Run Production: With a career-high OBP environment surrounding him, Tucker’s RBI potential in the heart of the Dodgers order is astronomical.
Power Surge: Dodger Stadium is a hitter’s par, boasting a 127 HR factor in 2025. Tucker should expect a season-high in home runs.
Elite Efficiency: Expect his hard-hit rate to climb back toward his career highs as he settles into a stable, championship-caliber environment.
Kyle Tucker isn’t just a high-priced addition; he is the final piece of a puzzle that the Dodgers hope leads to another World Series title. Even though the ARIMA model does not show a clear trajectory it serves as a reminder that our intuition can deceive us. At first glace, Tucker’s 2025 EV might have shown a downward trend, but the data tells a different story.
It will be bitter sweet not seeing Clayton Kershaw take the mound in 2026. Tucker nor Kershaw will be teammates. However, I want to share a video of Kershaw pitching to Tucker when he was on the Astros.
Source Code
---title: "The $240 Million Man: Projecting Kyle Tucker's 2026 in Blue"author: "Oliver Chang"email: oliverc1622@gmail.comdate: 2026-01-25 # Update this date when you make changescategories: [Dodgers]toc: trueformat: html: html-math-method: katex code-tools: trueimage: "main.png"# bibliography: references.bibtitle-block-banner: default---<iframe src="https://streamable.com/m/kyle-tucker-homers-22-on-a-fly-ball-to-left-center-field-kevin-alcantara?partnerId=web_video-playback-page_video-share" width="560" height="315"></iframe># IntroductionThe [Los Angeles Dodgers](https://www.espn.com/mlb/story/_/id/47625742/sources-dodgers-land-prized-free-agent-kyle-tucker) once again dominated the headlines in January 2026, securing superstar outfielder Kyle Tucker with a massive four-year, $240 million contract. After a brief but productive stint with the Chicago Cubs in 2025, Tucker joins a Dodgers lineup that is already arguably the most feared in baseball. The Dodgers starting lineup can look like: 1. Ohtani, 2. Betts, 3. Freeman, 4. Smith, 5. Tucker. Having a lineup with such high OBP and power potential will be a nightmare for opposing pitchers.## 2025 Review: A Cub in TransitionFollowing his trade from the Houston Astros in late 2024, Tucker adapted quickly to the Friendly Confines of Wrigley Field. While 2025 was a year of adjustment, his Statcast metrics remained elite, suggesting that his move to Los Angeles comes right as he is hitting his peak.### Statcast Analysis: 2025 PerformanceThe following analysis was performed on Tucker's 2025 Statcast data to derive the metrics used in this article.```{python}#| code-fold: true#| warning: false#| label: tbl-2025-ev#| tbl-cap: "Kyle Tucker 2025 Game Logs"#| tbl-alt: "Kyle Tucker 2025 Game Logs"import pandas as pdimport seaborn as snsimport matplotlib.pyplot as pltsns.set_theme(style="whitegrid", palette="deep")pd.set_option('display.max_columns', None)# Load the 2025 Statcast datadf = pd.read_csv('tucker-data.csv')# Calculate core metricsev_la_df = df.dropna(subset=['EV (MPH)', 'LA'])avg_ev = ev_la_df['EV (MPH)'].mean()avg_la = ev_la_df['LA'].mean()hard_hit_rate = (ev_la_df['EV (MPH)'] >=95).sum() /len(ev_la_df) *100from IPython.display import Markdown, displayfrom tabulate import tabulate# Summary Metrics Tablesummary_data = [ ["Avg EV", f"{avg_ev:.2f} MPH"], ["Hard Hit Rate", f"{hard_hit_rate:.2f}%"], ["Avg Launch Angle", f"{avg_la:.2f}"]]# Pitch Performance Analysispitch_ev_summary = ev_la_df.groupby('Pitch Type')['EV (MPH)'].mean().reset_index().sort_values('EV (MPH)', ascending=False).head(5)display(Markdown(tabulate(summary_data, headers=["Metric", "Value"], tablefmt="github")))display(Markdown("\n**Top Pitch Performance (Avg EV):**"))display(Markdown(tabulate(pitch_ev_summary, headers=["Pitch Type", "Avg EV (MPH)"], tablefmt="github", showindex=False)))```Analyzing the 2025 at-bat data reveals a hitter who remains fundamentally sound with high-end power potential.- **Average Exit Velocity**: 87.48 MPH- **Hard-Hit Rate (95+ MPH)**: 32.71%- **Average Launch Angle**: 10.99- **Home Runs**: 5 (in this specific data slice)- **Plate Discipline**: 18 Walks vs. 30 Strikeouts across 157 plate appearances.#### Performance by Pitch TypeTucker continues to be a terror against fastballs, which bodes well for his transition to the NL West's high-velocity environments.| Pitch Type | Frequency | Avg Exit Velocity (MPH) ||------------|-----------|------------------------|| 4-Seam Fastball | 60 | 91.72 || Sinker | 25 | 85.64 || Slider | 21 | 82.28 || Changeup | 17 | 89.09 || Cutter | 9 | 91.27 |The 91.72 MPH average exit velocity against the four-seamer stands out as his primary weapon. Even against breaking stuff like the Slider and Sweeper, Tucker maintained competitive contact, though his highest damage was clearly reserved for the heater.### Visualizing Trends: Rolling Average EVTo better understand Tucker's consistency, we can look at the rolling average of his exit velocity across the 2025 season.```{python}#| code-fold: true#| warning: false#| label: fig-rolling-ev#| fig-cap: "Kyle Tucker 2025 Rolling Exit Velocity (Season Timeline)"#| fig-alt: "Kyle Tucker 2025 Rolling Exit Velocity (Season Timeline)"import matplotlib.pyplot as pltimport seaborn as sns# Ensure data is sorted chronologicallyev_la_df["Game Date"] = pd.to_datetime(ev_la_df["Game Date"])ev_la_df = ev_la_df.sort_values("Game Date")# Calculate rolling averageev_la_df['Rolling EV'] = ev_la_df['EV (MPH)'].rolling(window=15).mean()plt.figure(figsize=(6, 4))# Plotting raw data as points to highlight the density/gapssns.scatterplot(data=ev_la_df, x='Game Date', y='EV (MPH)', alpha=0.2, color='gray', label='Individual BBE')sns.lineplot(data=ev_la_df, x='Game Date', y='Rolling EV', color='tab:blue', linewidth=2.5, label='15-BBE Rolling Avg')# The gap between August and October represents a period with no recorded plate appearances (likely an IL stint)plt.title('Kyle Tucker 2025 Rolling Exit Velocity (Season Timeline)')plt.xlabel('Date')plt.ylabel('Exit Velocity (MPH)')plt.xticks(rotation=45)plt.grid(True, linestyle='--', alpha=0.6)plt.legend()plt.tight_layout()plt.show()```### Forecasting for 2026: ARIMA ModelUsing an ARIMA (AutoRegressive Integrated Moving Average) model, we can attempt to forecast the trend of Tucker's exit velocity as he enters the 2026 season. Let's first explain what an ARIMA model is. Time series analysis is a statistical method that uses historical data to make predictions about future values. ARIMA models are a type of time series model that can be used to forecast the trend of a time series. An ARIMA model, denoted as $ARIMA(p, d, q)$, is a class of statistical models that captures temporal structures in time series data. Formally, for a stochastic process $\{X_t\}$, the model is defined by the equation:$$\phi(L)(1 - L)^d X_t = \theta(L)\epsilon_t$$Where:- **$L$** is the lag (backshift) operator, defined such that $L^k X_t = X_{t-k}$.- **$d$** (Integrated) is the degree of differencing required to achieve stationarity. The term $(1 - L)^d$ represents the $d$-th order difference operator.- **$\phi(L)$** (AutoRegressive) is a polynomial of order $p$: $\phi(L) = 1 - \sum_{i=1}^p \phi_i L^i$. This captures the linear dependence of $X_t$ on its own previous values.- **$\theta(L)$** (Moving Average) is a polynomial of order $q$: $\theta(L) = 1 + \sum_{j=1}^q \theta_j L^j$. This represents the relationship between the observation and the $q$ previous white noise error terms.- **$\epsilon_t$** is a white noise process with mean zero and variance $\sigma^2$.The model assumes that the $d$-th difference of the series follows a stationary ARMA process, allowing us to model non-stationary data that exhibits a stochastic trend. Individual parameters are typically estimated via Maximum Likelihood Estimation (MLE) or least squares.So how do we find $p$, $d$, and $q$? Well, we can use the autocorrelation function (ACF) and partial autocorrelation function (PACF) to help us determine the values of $p$ and $q$. The ACF measures the correlation between the time series and its lagged values, while the PACF measures the correlation between the time series and its lagged values after removing the effects of the intermediate lags.```{python}#| code-fold: true#| warning: false#| label: fig-pacf-acf#| fig-cap: "Kyle Tucker 2025 PACF"#| fig-alt: "Kyle Tucker 2025 PACF"from statsmodels.tsa.arima.model import ARIMAimport numpy as npfrom statsmodels.tsa.stattools import adfullerimport matplotlib.dates as mdatesev_series = ev_la_df['EV (MPH)'].values# Perform Augmented Dickey-Fuller testadf_result = adfuller(ev_series)print(f'ADF Statistic: {adf_result[0]}')print(f'p-value: {adf_result[1]}')print(f'Critical Values: {adf_result[4]}')# plot the partial autocorrelation functionfrom statsmodels.graphics.tsaplots import plot_pacfplot_pacf(ev_series)plt.show()```The PACF shows a significant correlation at lag 1, indicating that the time series is non-stationary and requires differencing. The ACF shows a significant correlation at lag 1, indicating that the time series is non-stationary and requires differencing. We'll use $p=1$. Note that we also ran the Augmented Dickey-Fuller test to confirm that the time series is non-stationary. The p-value is less than 0.05, indicating that the time series is non-stationary. Hence, $d=0$. Below we show the ACF for the time series.```{python}#| code-fold: true#| warning: false#| label: fig-acf#| fig-cap: "Kyle Tucker 2025 ACF"#| fig-alt: "Kyle Tucker 2025 ACF"# plot the autocorrelation functionfrom statsmodels.graphics.tsaplots import plot_acfplot_acf(ev_series)plt.show()```Similar to the PACF, the ACF shows a significant correlation at lag 1, indicating that the time series is non-stationary and requires differencing. We'll use $q=1$.Finally, we'll fit the ARIMA model and forecast the next 20 BBE.```{python}#| code-fold: true#| warning: false#| label: fig-forecast#| fig-cap: "Kyle Tucker 2026 Exit Velocity Forecast"#| fig-alt: "Kyle Tucker 2026 Exit Velocity Forecast"# Fit ARIMA model (p,d,q) - using (1,0,1) as a starting pointmodel = ARIMA(ev_series, order=(1, 0, 1))model_fit = model.fit()# Forecast the next 20 bbeforecast_steps =20forecast = model_fit.forecast(steps=forecast_steps)history_size =len(ev_series)forecast_obj = model_fit.get_forecast(steps=forecast_steps)forecast_df = forecast_obj.summary_frame()# 2. Extract valuesforecast_mean = forecast_df['mean']conf_int_lower = forecast_df['mean_ci_lower']conf_int_upper = forecast_df['mean_ci_upper']# 3. Plottingplt.figure(figsize=(8, 4))# Plot historysns.lineplot(x=np.arange(history_size), y=ev_series, label='Observed EV (2025)', color='tab:blue')# Plot forecast meanforecast_idx = np.arange(history_size, history_size + forecast_steps)sns.lineplot(x=forecast_idx, y=forecast_mean, color='red', label='Forecasted EV (2026)', linestyle='--')# Plot accurate Confidence Intervals from the modelplt.fill_between(forecast_idx, conf_int_lower, conf_int_upper, color='pink', alpha=0.3, label='95% Confidence Inter val')plt.title('Kyle Tucker Exit Velocity Forecast (ARIMA)')plt.xlabel('At-Bat Number (Sequential)')plt.ylabel('Exit Velocity (MPH)')plt.legend()plt.show()```The ARIMA model indicates Tucker's exit velocity is not dependent on the previous exit velocity. This is not unexpected given the small sample size of 2025. In other words, forecasting Tucker's exit velocity is only as good as taking the mean of the exit velocity in 2025.The model's coefficients are shown below.```{python}#| code-fold: true#| warning: true#| label: tbl-forecast-coefficients#| tbl-cap: "A table showing the forecast coefficients for the ARIMA model"#| tbl-alt: "A table showing the forecast coefficients for the ARIMA model"from IPython.display import Markdownfrom tabulate import tabulateimport pandas as pd# Extract the coefficients table from the ARIMA model summarysummary_table = model_fit.summary().tables[1]summary_df = pd.DataFrame(summary_table.data[1:], columns=summary_table.data[0])# Display the summary table in Markdown formatMarkdown(tabulate(summary_df, headers='keys', tablefmt='pipe'))```The p-values for ar.L1 and ma.L1 are both greater than 0.05, indicating that the coefficients are not significantly different from zero. ## 2026 Projection: The Dodgers Effect**Key Projections for 2026:**1. **Increased Run Production**: With a career-high OBP environment surrounding him, Tucker's RBI potential in the heart of the Dodgers order is astronomical.2. **Power Surge**: Dodger Stadium is a hitter's par, boasting a 127 HR factor in 2025. Tucker should expect a season-high in home runs.3. **Elite Efficiency**: Expect his hard-hit rate to climb back toward his career highs as he settles into a stable, championship-caliber environment.Kyle Tucker isn't just a high-priced addition; he is the final piece of a puzzle that the Dodgers hope leads to another World Series title. Even though the ARIMA model does not show a clear trajectory it serves as a reminder that our intuition can deceive us. At first glace, Tucker's 2025 EV might have shown a downward trend, but the data tells a different story. It will be bitter sweet not seeing Clayton Kershaw take the mound in 2026. Tucker nor Kershaw will be teammates. However, I want to share a video of Kershaw pitching to Tucker when he was on the Astros. <iframe src="https://streamable.com/m/kyle-tucker-lines-out-sharply-to-center-fielder-chris-taylor?partnerId=web_video-playback-page_video-share" width="560" height="315"></iframe>