Stock return distributions can be well approximated with heavy-tail Lambert W x Gaussian distributions. They are implemented in the LambertW R package and the pylambertw Python module. Advantage of this distribution is that you can "gaussianize" your data based on the estimated distribution parameters (using a bijective trnsformation).
Showing R code examples here, but same can be done in pylambertw using pylambertw.mle.MLE() sklearn Estimator/Transformer.
Note: I downloaded the data directly from Yahoo Finance for the year of 2015 and computed x = logret * 100 to get daily % change; didn't get exactly the summary statistics you have, but same stylized facts of returns).
Simple normality checks (both visual and hypothesis testing) are in line with your findings:
LambertW::test_norm(x)
$seed
[1] 277666
$shapiro.wilk
Shapiro-Wilk normality test
data: data.test
W = 0.97609, p-value = 0.0003105
$shapiro.francia
Shapiro-Francia normality test
data: data.test
W = 0.97193, p-value = 0.0001607
$anderson.darling
Anderson-Darling normality test
data: data
A = 1.4285, p-value = 0.001062

The daily stock returns show the typical stylized facts of a heavy-tailed distribution. You can use maximum likelihood estimation (MLE) to fit a Lambert W x Gaussian distribution to this data, in particular the location, scale, and tail parameter $\delta$.
mod <- MLE_LambertW(x, distname="normal", type="h")
summary(mod)
Call: MLE_LambertW(y = x, distname = "normal", type = "h")
Estimation method: MLE
Input distribution: normal
Parameter estimates:
Estimate Std. Error t value Pr(>|t|)
mu 0.004030 0.056308 0.0716 0.94294
sigma 0.810480 0.059024 13.7314 < 2e-16 ***
delta 0.114220 0.045662 2.5014 0.01237 *
Signif. codes: 0 ‘*’ 0.001 ‘’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Given these input parameter estimates the moments of the output random variable are
(assuming Gaussian input):
mu_y = 0; sigma_y = 0.98; skewness = 0; kurtosis = 6.34.
In this case the $\hat{\delta} = 0.115$, which means moments up to 1 / 0.115 = 8.6 exist; the implied kurtosis of the underlying data is 6.34 (as a function of $\hat{\delta}$).
After Gaussianization the resulting back-transformed, gaussianized stock return data is indistinguishable from a Normal distribution.
x.gauss <- ts(LambertW::get_input(x, mod$tau))
LambertW::test_norm(x.gauss)
$seed
[1] 760417
$shapiro.wilk
Shapiro-Wilk normality test
data: data.test
W = 0.99439, p-value = 0.4815
$shapiro.francia
Shapiro-Francia normality test
data: data.test
W = 0.99433, p-value = 0.4045
$anderson.darling
Anderson-Darling normality test
data: data
A = 0.54611, p-value = 0.1588

descdist(as.numeric(x.gauss), discrete = FALSE)

To @whuber comment above, just fitting a distribution alone does not solve any problem / answer any question. Depending on what specific question you have, this will be more or less useful. Nonetheless you now have a distribution that describes the marginal properties of the sample you have in a way that's indistinguishable from the (latent) Normal distribution. You can use this to answer any question you have about the population of daily returns for SP500 [there might be more efficient ways to answer your questions, but the full distribution allows you to use it downstream in any way/shape/form].