+1 Daumen
464 Aufrufe

Ich möchte alle Mittel und Abweichungen von den Standards eines Portfolios bekommen. Es scheint jedoch, dass mein Portfolio zu gross ist. Und zwar mit folgendem Code:

n_portfolios = 5
means, stds = np.column_stack([
    random_portfolio(df_new_copy[1:].values)
    for _ in range(n_portfolios)
])

Ich bekomme folgenden Fehler:

---------------------------------------------------------------------------
MemoryError                              Traceback (most recent call last)
<ipython-input-151-62c87a1a020c> in <module>
      2 means, stds = np.column_stack([
      3    random_portfolio(df_new_copy[1:].values)
----> 4    for _ in range(n_portfolios)
      5 ])

<ipython-input-151-62c87a1a020c> in <listcomp>(.0)
      2 means, stds = np.column_stack([
      3    random_portfolio(df_new_copy[1:].values)
----> 4    for _ in range(n_portfolios)
      5 ])

<ipython-input-141-3aebfc0c97df> in random_portfolio(returns)
    13    # This recursion reduces outliers to keep plots pretty
    14    if sigma > 2:
---> 15        return random_portfolio(returns)
    16    return mu, sigma

<ipython-input-141-3aebfc0c97df> in random_portfolio(returns)
    13    # This recursion reduces outliers to keep plots pretty
    14    if sigma > 2:
---> 15        return random_portfolio(returns)
    16    return mu, sigma

<ipython-input-141-3aebfc0c97df> in random_portfolio(returns)
    13    # This recursion reduces outliers to keep plots pretty
    14    if sigma > 2:
---> 15        return random_portfolio(returns)
    16    return mu, sigma

<ipython-input-141-3aebfc0c97df> in random_portfolio(returns)
    13    # This recursion reduces outliers to keep plots pretty
    14    if sigma > 2:
---> 15        return random_portfolio(returns)
    16    return mu, sigma

<ipython-input-141-3aebfc0c97df> in random_portfolio(returns)
      6    p = np.asmatrix(np.mean(returns, axis=1))
      7    w = np.asmatrix(rand_weights(returns.shape[0]))
----> 8    C = np.asmatrix(np.cov(returns))
      9
    10    mu = w * p.T

<__array_function__ internals> in cov(*args, **kwargs)

C:\ProgramData\Anaconda3\lib\site-packages\numpy\lib\function_base.py in cov(m, y, rowvar, bias, ddof, fweights, aweights)
  2452    else:
  2453        X_T = (X*w).T
-> 2454    c = dot(X, X_T.conj())
  2455    c *= np.true_divide(1, fact)
  2456    return c.squeeze()

<__array_function__ internals> in dot(*args, **kwargs)
MemoryError: Unable to allocate array with shape (7010, 7010) and data type float64

Hier sind die Log-Rückgaben df_new_copy[1:]


 

   ABI BB Equity  AD NA Equity    ADS GY Equity  AI FP Equity    AIR FP Equity  AMS SQ Equity  ASML NA Equity  BAS GY Equity  BAYN GY Equity  BBVA SQ Equity  BMW GY Equity  BN FP Equity    BNP FP Equity  CRH ID Equity  CS FP Equity    DAI GY Equity  DG FP Equity    DPW GY Equity  DTE GY Equity  EL FP Equity    ENEL IM Equity  ENGI FP Equity  ENI IM Equity  FP FP Equity    FRE GY Equity  GLE FP Equity  IBE SQ Equity  INGA NA Equity  ISP IM Equity  ITX SQ Equity  KER FP Equity  LIN GY Equity  MC FP Equity    MUV2 GY Equity  NOKIA FH Equity    OR FP Equity    ORA FP Equity  PHIA NA Equity  SAF FP Equity  SAN FP Equity  SAN SQ Equity  SAP GY Equity  SIE GY Equity  SU FP Equity    TEF SQ Equity  URW NA Equity  VIV FP Equity  VOW3 GY Equity  SX5E Index
Dates                                                                                                                                                                                                 
2019-02-27 09:10:00    0.000609    -0.016755  -0.000942  -0.000455  -0.001060  -0.001156  0.001110    -0.000595  -0.012139  -0.005338  -0.001087  -0.000298  -0.005329  -0.002539  0.000458    -0.003402  0.000970    0.000749    0.002073    0.004213    0.001128    0.000000    -0.000526  0.000300    0.000618    -0.004077  -0.001086  -0.003357  -0.001922  -0.004970  -0.000620  0.000981    -0.001154  -0.001450  -0.002239  -0.001803  0.002999    -0.000285  0.002952    0.000274    -0.006883  0.002868    -0.001028  0.001747    -0.001983  -0.002932  0.000825    -0.003332  3275.70
2019-02-27 09:20:00    -0.001676  -0.002226  -0.000943  -0.001366  -0.003185  -0.001447  0.000985    -0.000744  0.005137    0.002673    0.000408    -0.003431  0.003942    -0.000727  -0.002521  0.000379    0.000969    0.004484    -0.000691  0.001400    -0.000752  -0.002848  0.000131    0.000200    -0.003096  0.004852    -0.001631  -0.000177  0.001922    0.000766    0.000207    -0.003931  -0.000825  -0.000484  -0.001121  -0.003164  0.001496    -0.001426  0.000421    0.001370    0.000485    -0.003400  -0.001647  0.002034    -0.000794  -0.000280  -0.004546  0.003332    3273.88
2019-02-27 09:30:00    0.002437    0.004668    -0.000472  0.001366    0.001240    0.003181    0.001107    -0.001192  0.006275    -0.000191  0.002171    0.001195    0.001272    0.000363    0.002521    0.001891    0.001936    0.000000    -0.000691  0.003260    0.000000    -0.001427  -0.000921  0.000200    -0.001241  -0.000387  0.000272    0.000531    0.001199    -0.005376  -0.000207  -0.000657  -0.001156  0.000967    0.004105    0.004066    -0.001496  0.002423    0.000000    0.000547    0.000605    0.001064    0.004011    0.001450    0.000000    0.000699    0.005371    0.002260    3277.38
2019-02-27 09:40:00    -0.001522  -0.006006  0.000000    0.000000    0.001062    -0.001155  -0.002339  -0.003435  -0.002476  -0.003438  -0.001764  -0.001045  -0.005213  0.000000    -0.002063  -0.003595  -0.001451  -0.003361  -0.001038  0.002322    0.000376    -0.000714  -0.000658  -0.000901  -0.001657  -0.006802  0.000816    -0.005678  -0.002881  0.000385    0.000000    0.000985    0.000000    -0.001935  -0.002237  0.001352    0.000748    -0.002137  0.007965    -0.001095  -0.006314  -0.001064  -0.004217  -0.004648  -0.000795  -0.001959  -0.000824  -0.001594  3272.65
2019-02-27 09:50:00    -0.000610  -0.002234  0.000943    0.000910    -0.000354  -0.001736  -0.001357  -0.000748  0.006396    0.001147    0.000407    -0.001645  0.002320    -0.003640  -0.000688  -0.000569  -0.000242  0.000748    -0.000692  -0.001857  -0.001129  -0.002504  -0.001054  -0.001003  -0.001037  0.003698    -0.000272  0.000000    0.000240    0.000000    -0.002483  -0.000656  -0.000661  0.000484    0.000000    0.000000    -0.000748  -0.001285  0.001252    -0.000685  0.001096    -0.000319  -0.001444  -0.002916  -0.001061  0.000840    0.000412    0.000532    3271.90
...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...
2019-09-06 16:00:00    0.000474    0.000000    0.001616    0.000000    -0.001103  0.000000    0.002545    -0.000980  0.000150    -0.001003  -0.006883  0.000000    -0.001296  -0.000327  -0.000696  -0.003742  0.000499    -0.000987  -0.000397  -0.000734  0.002108    0.000000    -0.000727  -0.001100  -0.001232  -0.000622  0.003184    -0.001096  -0.000969  0.000000    -0.000552  0.001464    0.001188    0.000449    -0.002322  0.000794    -0.000730  0.000233    -0.001053  0.001476    -0.001703  0.000000    -0.000434  -0.001300  -0.000455  -0.000419  -0.000394  -0.003708  3490.09

Avatar von

1 Antwort

0 Daumen

Antwort mit KI erzeugt

Lösung des Problems

Das Problem, das Sie stoßen, ist recht häufig, wenn man mit sehr großen Datenmengen in Python und speziell mit NumPy arbeitet. Der MemoryError tritt auf, weil Ihr System nicht genügend Speicher hat, um die Anforderungen Ihres Codes zu erfüllen. Insbesondere scheint der Fehler aufzutreten, wenn die Kovarianzmatrix der Rückgaberaten berechnet wird, die eine Größe von \(7010 \times 7010\) mit dem Datentyp float64 hat.

Ich werde Ihnen einige allgemeine Strategien aufzeigen, um dieses Problem zu umgehen:

1. Optimierung des Datentyps: Manchmal kann der Speicherbedarf reduziert werden, indem man den Datentyp ändert. Zum Beispiel verwendet float64 doppelt so viel Speicher wie float32. Wenn die Präzision, die float64 bietet, nicht unbedingt erforderlich ist, könnten Sie versuchen, Ihre Daten in float32 zu konvertieren.

2. Verwendung von Generatoren und effizienten Iterationen: Anstatt große temporäre Arrays im Speicher zu erstellen, verwenden Sie wenn möglich Generatoren oder Iterator-Objekte, die die Daten on-the-fly verarbeiten.

3. Chunking: Verarbeiten Sie Ihre Daten in kleineren Teilen (Chunks), anstatt das gesamte Datenset auf einmal zu laden oder zu bearbeiten.

4. Hilfsbibliotheken verwenden: Bibliotheken wie Dask bieten fortschrittliche Möglichkeiten, um große Datasets zu verarbeiten, die nicht in den Speicher passen, indem Daten in kleineren Teilen verarbeitet werden und die Berechnungen über mehrere Kerne verteilen.

5. Hardware Ressourcen: Wenn möglich, führen Sie Ihre Verarbeitung auf einem Rechner mit mehr RAM durch oder verwenden Sie Cloud-basierte Dienste, die das Skalieren Ihrer Ressourcen erlauben.

Zum Umgang mit Ihrem spezifischen MemoryError, könnten Sie zunächst versuchen, den Datentyp Ihrer Eingabedaten zu optimieren. Hier ist ein Code-Beispiel zur Konvertierung der Daten in float32:

python
df_new_copy = df_new_copy.astype('float32') # Konvertiert alle Werte in df_new_copy zu float32


Wenn die Generierung der gesamten Kovarianzmatrix das Problem ist, könnten Sie auch überlegen, ob Sie die Berechnung in Chunks durchführen können oder ob Sie Vorverarbeitungstechniken anwenden können, um die Dimensionalität Ihres Datasets zu reduzieren, bevor Sie die Kovarianzmatrix berechnen.

Zum Beispiel könnten Sie mit einer Technik der Dimensionsreduktion, wie PCA (Principal Component Analysis), arbeiten, um die Anzahl der Features zu reduzieren, bevor Sie die Kovarianzmatrix berechnen. Dies ist allerdings nur eine Option, wenn das Endziel der Berechnung dies zulässt.

Leider kann ich ohne weiteren Kontext zu random_portfolio oder rand_weights nicht spezifischer auf Ihre Codebasis eingehen, aber ich hoffe, diese Strategien bieten Ihnen einen Ansatzpunkt, um das Speicherproblem zu überwinden.
Avatar von 4,6 k

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community