# Maximising skewness for a portfolio

I am trying to recreate the Mean-Variance-Skewness-Kurtosis-based Portfolio Optimization work done by Lai et Al. (2006) (link).

I reached the part where in order to run the PGP model, you need to feed the aspired levels of the first four moments. The steps to calculate the aspired levels are the following:

I am struggling to understand how they actually solve these sub-problems. I tried to run the optimization to maximise the skewness in python using the following code:

import pandas as pd
import numpy as np
from scipy.optimize import minimize

# Returns Statistics
mean_returns = df_1.mean()
stdev_returns = df_1.std()
skew_returns = df_1.skew()

def maximize_skewness(weights):
portfolio_skewness = np.dot(weights, skew_returns)
return -portfolio_skewness
constraints = ({'type': 'eq', 'fun': lambda weights: np.sum(weights) - 1})
bounds = tuple((0, 1) for asset in range(len(skew_returns)))
num_assets = 5
random_weights = np.random.random(num_assets)
random_weights /= np.sum(random_weights)
random_weights, np.sum(random_weights)
print(random_weights)
solution_skewness = minimize(maximize_skewness, random_weights, method='SLSQP', bounds=bounds, constraints=constraints)
optimal_weights = solution_skewness.x
max_skewness = -solution_skewness.fun
optimal_weights_percentage = [round(weight * 100, 2) for weight in optimal_weights]
print("Optimal Weights in Percentage:", optimal_weights_percentage)
print("Maximum Skewness:", max_skewness)


The issue is that the optimization suggests to allocate 100% of capital to the asset that has the maximim level of skewness in the portfolio, therefore saying that the aspired level of skewness is just the max value of skewness out of the returns for the assets in the portfolio.

Not sure why this is happening, am I missing something in the code? In the paper they also mention to compute the skewness-coskewness and kurtosis-kocurtosis but I am unsure whterh these values are needed at this stage.

Any help would be greatly appreciated.