Есть ли способ генерировать ненормальные коррелированные случайные величины?

#python #finance #quantitative-finance

Вопрос:

Это мой первый пост, так что извините меня за любые неудобства.

Моя цель состоит в том, чтобы смоделировать временные ряды возврата активов, которые обычно являются жирными хвостами. Поэтому я должен смотреть дальше, чем генерирование коррелированных нормальных вариаций. Я наткнулся на этот пакет, который в основном делает именно то, что я хочу. Тем не менее, это для python 2.x.x, и я на python 3.8.

 from connorav import CorrelatedNonNormalRandomVariates
returns = pd.read_csv(r'datasets/eurostoxx_share_returns.csv', sep=';', parse_dates=True, index_col='Date')
nsim = 10
corr = returns.corr()
corr = posdef.nearestPD(returns.cov())
stats = pd.DataFrame(data={'mean': returns.mean(),
                           'std': returns.std(),
                           'skew': returns.skew(),
                           'kurt': returns.kurt()
                           }).to_numpy()
corr = corr.to_numpy()
rv = CorrelatedNonNormalRandomVariates(stats,corr,nsim)
 

Я получил ошибку, потому что python 2 вернет список на карте (), где python 3 этого не делает. Поэтому я приспособился к correl_rv.py:

 self.moments = moments
self.correlations = correlations
self.distributions = map(MSSKDistribution,moments.tolist())
 

Для

 self.moments = moments
self.correlations = correlations
self.distributions = list(map(MSSKDistribution,moments.tolist()))
 

Тем не менее, теперь я получаю следующий результат:

 ~Anaconda3envspythonlibsite-packagesconnoravcorrel_rv.py in __init__(self, moments, correlations, num_samples, method)
     21         self.moments = moments
     22         self.correlations = correlations
---> 23         self.distributions = list(map(MSSKDistribution,moments.tolist()))
     24 
     25         self.generate(num_samples,method)

~Anaconda3envspythonlibsite-packagesconnoravdistribution.py in __init__(self, mean, std, skew, kurt)
     12         self.skew = skew
     13         self.kurt = kurt
---> 14         self.fit()
     15 
     16     def fit(self):

~Anaconda3envspythonlibsite-packagesconnoravdistribution.py in fit(self)
     16     def fit(self):
     17 
---> 18         if abs(self.skew) < NORMAL_CUTOFF and abs(self.kurt) < NORMAL_CUTOFF:
     19             # It is hard to solve the johnson su curve when it is very close
     20             # to normality, so just use a normal curve instead.

TypeError: bad operand type for abs(): 'NoneType'
 

Данные, которые я использую, представляют собой ежедневную доходность акций всех 50 фирм EuroStoxx за 2000-2021 годы.

Спасибо вам всем!