WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Anwendung von Befehlen nur für bestimmte Teile einer Matrix

 

jp10
Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 24.04.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.04.2014, 08:16     Titel: Anwendung von Befehlen nur für bestimmte Teile einer Matrix
  Antworten mit Zitat      
Liebes MATLAB-Forum,

ich bin ein blutiger MATLAB-Anfänger und gerade dabei meine Bachelorarbeit im Financebereich zu schreiben. Ich habe mich zwar schon eingehend - auch in diesem Forum - eingelesen, jedoch komme ich an einigen Stellen einfach nicht weiter.

Ich habe einen Datensatz mit etwa 600.000 Optionskontrakten, die an 2035 verschiedenen Daten auslaufen.

Mein Ziel ist es für jedes einzelne Datum und jeden Kontrakt die implizite Volatilitat mit Hilfe des Befehls "blsimpv" zu berechnen und danach mit diesen Daten für jeden Tag eine lineare Regression laufen zu lassen.

Mein Problem ist nun folgendes: Wie schaffe ich es den Befehl zu geben "blsimpv" nur für ein bestimmtes Datum zu geben, soll heißen, dass ich die impliziten Volatilitäten eines jeden Tages in einem separatem Vektor stehen habe?

Ich wäre euch für eure Hilfe sehr dankbar. Ich hatte bisher meinen Datensatz in 2035 verschiedene Cell Arrays nach den einzelnen Daten aufgespalten und versucht dies mit einer for-Schleife zu bewerkstelligen. Leider bin ich aber an der Ausführung der Schleife gescheitert.
In der Folge hatte ich von meinem Betreuer den Tipp erhalten mit dem "unique" und "find" Befehlen zu arbeiten. Ich kann mir aber nicht erklären, wie mir diese dabei helfen sollen.. Meinungen und Ratschläge deshalb sehr erwünscht Wink
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 24.04.2014, 08:34     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Leider bin ich aber an der Ausführung der Schleife gescheitert.

Da wäre es dann hilfreich zu wissen, was genau du versucht hast (Code) und wo die Probleme aufgetreten sind. Wenn du einen verkleinerten Datensatz zur Verfügung stellen kannst, so dass man damit herumspielen kann, wäre das ideal.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
jp10
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 24.04.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.04.2014, 08:58     Titel:
  Antworten mit Zitat      
Dann versuch ichs mal:

Mein Datensatz ist nach folgenden Kriterien gegliedert:

'Date' 'Option Price' 'Bid' 'Ask' 'Volume' 'Open Interest' 'Strike' 'Expiry' 'DAX' 'Euribor 3M' 'Time to Maturity' 'IsCall'

732676 1554,50000000000 NaN NaN 20 30397 4000 733026 5408,26000000000 0,0248800000000000 0,968627450980392 1

732676 1554,50000000000 NaN NaN 20 30397 4000 733026 5408,26000000000 0,0248800000000000 0,968627450980392 1

732679 35,6000000000000 NaN NaN 100 50744 4000 733026 5449,98000000000 0,0248800000000000 0,964705882352941 0

732679 35,6000000000000 NaN NaN 100 50744 4000 733026 5449,98000000000 0,0248800000000000 0,964705882352941 0

Die Zahlen sind aus zwei verschiedenen Cell Arrays kopiert.

blsimpv wende ich folgendermaßen für den ersten Cell Array an:

blsimpv(C{1,1}(:,9), C{1,1}(:,7), C{1,1}(:,10), C{1,1}(:,11),C{1,1}(:,2), 10, 0, [], C{1,1}(:,12))

Hierbei entsteht noch keine Fehlermeldung. Ich würde daher gerne diese Formel auf alle C{1:2035} anwenden.

An diesem Punkt wusste ich nicht mehr wie genau ich weitermachen soll.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 24.04.2014, 09:57     Titel:
  Antworten mit Zitat      
Hallo,

bitte Dateien wenn anhängen und ein lauffähiges Beispiel zur Verfügung stellen.

Das naheliegende wäre:

Code:
for I = 1:numel(C)
vola{I} = blsimpv(C{I}(:,9), C{I}(:,7), C{I}(:,10), C{I}(:,11),C{I}(:,2), 10, 0, [], C{I}(:,12));
end


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
jp10
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 24.04.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.04.2014, 17:52     Titel:
  Antworten mit Zitat      
Allergrößten Dank Harald, warst mir eine sehr große Hilfe! Jetzt muss ich mich nur noch durch die Regression durchbeißen.. Wink

Rein vom Ansatz her kann ich ja wieder eine solche for-Schleife verwenden um die Ergebnisse für jeden einzelnen Cell Array separat zu erhalten?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.04.2014, 19:00     Titel:
  Antworten mit Zitat      
Hallo,

das ist ohne weitere Informationen schwer zu sagen. Ich kann da nur sagen: probiers aus Smile Und wenn du damit Probleme hast, kannst du dich ja hie rühren.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
jp10
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 24.04.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.04.2014, 10:17     Titel:
  Antworten mit Zitat      
es läuft sehr gut und ich bin fast am ziel meiner träume angelangt.. Wink

ein kleines mosaiksteinchen fehlt jedoch noch. um die regression zu starten muss an die angehängte datei in jedem cell array noch eine riehe mit einsen, um das intercept korrekt schätzen zu können. da die matrizen in den arrays unterschiedliche zeilananzahlen haben dachte ich mir mit folgendem befehl die reihen mit einsen zu erstellen und danach in die jeweiligen arrays einzufügen:

X = ones(sz)

führe ich diesen befehl per hand für einen array aus funktioniert das auch. bei meiner schleife kommt es jedoch zu einer fehlermeldung. sie sieht folgendermaßen aus:

Code:
for I = 1:numel(vola)
sz = size(vola{I})    
Y(I) = ones(sz);
end


dazugehörige Fehlermeldung: In an assignment A(I) = B, the number of elements in B and I must be the same.

habe schon einige andere varianten probiert, die folge waren aber nur andere fehlermeldungen..

dateien müssten nun angehängt sein.. ich hoffe ihr könnt meinen fehler finden..
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.04.2014, 10:37     Titel:
  Antworten mit Zitat      
Hallo,

du kannst nicht einen Vektor einem Skalar zuweisen.
Zudem sollte Y vorbelegt werden.

Vor allem: was ist denn der Sinn davon, in Y jedes Mal das gleiche reinzuschreiben?

Zudem berücksichtigen Funktionen wie fitlm oder regress als Standardeinstellung automatisch einen konstanten Term.

Dateien sind keine angehängt.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
jp10
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 24.04.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.04.2014, 11:41     Titel:
  Antworten mit Zitat      
ka wieso das mit dem upload nicht geklappt hat.. ich versuchs mal so:

https://www.dropbox.com/sh/8viwuep6rdvj68p/EAkNGiE_7s

mein problem ist aber, dass es funktiniert, wenn ich die befehle nur für einen array gebe:

Code:
sz = size(vola{1})


und anschließend

Code:


erhalte ich genau einen vektor mit 117 zeilen voller einsen, wie ich ihn brauche Wink

da die reihe mit den einsen unerlässlich für das schätzen des achsenabschnitts bei einer ols regression ist wäre es von großem vorteil das selbe für die 2034 verbleibenden arrays machen zu können.. problem nun klarer geworden bzw bin ich immer noch auf dem holzweg?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.04.2014, 12:52     Titel:
  Antworten mit Zitat      
Hallo,

das sind jetzt zwei große .mat-Dateien, aber wo ist der Code, den du darauf anwenden willst?

Zitat:
da die reihe mit den einsen unerlässlich für das schätzen des achsenabschnitts bei einer ols regression ist

Nein, eben nicht, da fitlm oder regress (welche Funktion du verwendest, weiß ich leider immer noch nicht) das automatisch berücksichtigen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
jp10
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 24.04.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.04.2014, 13:00     Titel:
  Antworten mit Zitat      
ich wollte "regress" verwenden.. sollte man die 1er-reihe weglassen können hätte ich das ganze mit der regression so gelöst:

Code:
for I = 1:numel(vola)
d{I} = regress(vola{I}, koeff{I});
end


(die beiden hochgeladenen .mat dateien können dafür verwendet werden)

wo würde man dann das intercept sehen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.04.2014, 13:22     Titel:
  Antworten mit Zitat      
Hallo,

sorry, da habe ich mich bei regress geirrt. Hatte gedacht, dass da genauso wie bei fitlm wäre.

Ist aber so auch kein Problem. So sollte es gehen:

Code:
d{I} = regress(vola{I}, [ones(length(vola{I}),1), koeff{I}]);


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
jp10
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 24.04.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.04.2014, 15:34     Titel:
  Antworten mit Zitat      
so sieht das ganze eindeutig besser aus.. danke!
Private Nachricht senden Benutzer-Profile anzeigen
 
jp10
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 24.04.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.05.2014, 11:51     Titel:
  Antworten mit Zitat      
hey!

ich bin gerade dabei einige dinge zusammenzufassen bzw. zu vereinfachen. bei folgendem komme ich leider nicht zu meinem gewünschtem ergebnis, obwohl mir mein anstaz recht vernünftig erscheint.

ich will folgende beiden datensätze zur besseren übersichtlichkeit miteinander vereinen:

https://www.dropbox.com/sh/8viwuep6rdvj68p/EAkNGiE_7s

die cell arrays von vola sollen immer an die jeweiligen arrays von C angehängt werden.

ich habe mich ja schon ein bisschen daran versucht und mit

Code:
[C{1}, vola{1}]


klappt es problemlos für einen array. ich weiß nur nicht was bei meiner schleife falsch läuft. es kommt zwar ein ergebnis ohne fehlermeldung dabei heraus, jedoch nicht sow ie ich mir das vorstelle:

Code:
for I = 1:numel(C)
volaplus = [C{I}, vola{I}]


wer sieht woran´s liegt?!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.05.2014, 15:42     Titel:
  Antworten mit Zitat      
Hallo,

der Code läuft ja durch, es ist dann schwer zu sagen, inwiefern das Ergebnis nicht das von dir gewünschte ist.

Ausgehend von dem geposteten Code wäre mein Vorschlag:

Code:
for I = 1:numel(C)
volaplus{I} = [C{I}, vola{I}];
...
end

da volaplus sonst ja in jeder Iteration beschrieben wird.

Ob das hilft, ist schwer zu sagen, ohne überhaupt genau zu wissen, worin das Problem besteht.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2, 3  Weiter

Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.