Advertisement
Guest User

Simulation

a guest
Jul 28th, 2015
240
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 7.03 KB | None | 0 0
  1. %% Initialisiere Parameter
  2.  
  3. mu=0; % Drift (auch r)
  4. sigma=1; % Std
  5. S0=100; % Asset Wert in t=0
  6. n = 3650; % Anzahl Schritte. Bei sowas hat sich in finance 1-4millionen durchgesetzt (Martin, Reitz und Wehn 2014)
  7. m=1000; % Anzahl Simulationen
  8.  
  9. %% Simuliere BB
  10. S=zeros(m,n);
  11. for j=1:m
  12.     S(j,1)=S0;
  13. end
  14. Z=normrnd(0,1,m,n);
  15. delta=1/n;
  16.    
  17. % Benutze explizites Euler Schema um BB zu diskretisieren - Alternativen
  18. % siehe Kienitz 2013 oder Glassermann 2008 (letzteres Monte Carlo
  19. % Standardwerk) -> auch geometrische BB genannt
  20. for j=1:m
  21.     for i=2:n
  22.       S(j,i)=S(j,i-1)*exp((mu-(sigma^2/2))*delta+sigma*sqrt(delta)*Z(j,i));
  23.     end
  24. end
  25.  
  26. % muss nicht plotten -> zu viele linien, wenn picke 2,3 raus
  27. % figure
  28. % pl=plot(S');
  29. % %legend('Asset','Location','northeast')
  30. % title('Assetpfad')
  31. % xlabel('Zeitpunkt')
  32. % ylabel('Preis')
  33.  
  34. %% Kaufe und verkaufe zufällig
  35.  
  36. % dümmste Methode = Münze werfen - wenn 0 verkaufe, wenn 1 kaufe -> viel zu
  37. % häufige Aktionen
  38. wurf= round(rand(m,n));
  39. habe_Asset = 0; % variable um zu speichern ob man Asset besitzt oder nicht
  40. Rendite_rand=zeros(m,n); % Rendite absolut
  41. wann_gekauft=0; % Speichere wann Asset grkauft wurde für Renditeberechnung
  42.  
  43. % Kaufsignale auswerten - ganz naiv - geht locker numerisch effizienter
  44. for j=1:m
  45. for i=1:n
  46.     if wurf(j,i)>0 && habe_Asset==0
  47.         % Dann kaufe Asset
  48.         wann_gekauft=i;
  49.         habe_Asset=1;
  50.         if i>1
  51.             Rendite_rand(j,i)=Rendite_rand(j,i-1);
  52.         else
  53.             Rendite_rand(j,i)=0;
  54.         end
  55.     elseif wurf(j,i)==0 && habe_Asset==1
  56.         % Dann verkaufe Asset
  57.         Rendite_rand(j,i)=Rendite_rand(j,i-1)+S(j,i)-S(j,wann_gekauft); % bisherige rendite + das was neu dazu kommt
  58.         wann_gekauft=-1;
  59.         habe_Asset=0;
  60.     else
  61.         % sonst nichts
  62.         if i>1
  63.             Rendite_rand(j,i)=Rendite_rand(j,i-1);
  64.         else
  65.             Rendite_rand(j,i)=0;
  66.         end
  67.     end
  68. end
  69.         if habe_Asset ==1
  70.             % Falls ich am ende Asset habe berechne Rendite die aktuell
  71.             % drauf ist
  72.             Rendite_rand(j,i)=Rendite_rand(j,i-1)+S(j,i)-S(j,wann_gekauft); % Endrendite
  73.         end
  74.         wann_gekauft=-1;
  75.         habe_Asset=0;
  76. end
  77.  
  78. %plot(Rendite_rand')
  79.  
  80. %% Kaufe und Verkaufe nach Possion
  81.  
  82. lambda=1/30; % erhalte Signale durschnittlich 1x im Monat
  83. poi= poissrnd(lambda,m,n);
  84. habe_Asset = 0; % variable um zu speichern ob man Asset besitzt oder nicht
  85. Rendite_poi=zeros(m,n); % Rendite absolut
  86. wann_gekauft=0; % Speichere wann Asset grkauft wurde für Renditeberechnung
  87.  
  88. % Kaufsignale auswerten - ganz naiv - geht locker numerisch effizienter
  89. for j=1:m
  90.         for i=1:n
  91.             if poi(j,i)>0 && habe_Asset==0
  92.                 % Dann kaufe Asset
  93.                 wann_gekauft=i;
  94.                 habe_Asset=1;
  95.                 if i>1
  96.                     Rendite_poi(j,i)=Rendite_poi(j,i-1);
  97.                 else
  98.                     Rendite_poi(j,i)=0;
  99.                 end
  100.             elseif poi(j,i)>0 && habe_Asset==1
  101.                 % Dann verkaufe Asset
  102.                 Rendite_poi(j,i)=Rendite_poi(j,i-1)+S(j,i)-S(j,wann_gekauft); % bisherige Rendite + das was neu dazu kommt
  103.                 wann_gekauft=-1;
  104.                 habe_Asset=0;
  105.             else
  106.                 % sonst nichts
  107.                 if i>1
  108.                     Rendite_poi(j,i)=Rendite_poi(j,i-1);
  109.                 else
  110.                     Rendite_poi(j,i)=0;
  111.                 end
  112.             end
  113.         end
  114.     if habe_Asset ==1
  115.         % Falls ich am ende Asset habe berechne Rendite die aktuell
  116.         % drauf ist
  117.         Rendite_poi(j,i)=Rendite_poi(j,i-1)+S(j,i)-S(j,wann_gekauft); % Endrendite
  118.     end
  119.     wann_gekauft=-1;
  120.     habe_Asset=0;
  121. end
  122.  
  123. %% Kaufe und Verkaufe mit Durschnittslinien
  124.  
  125. % Neuer Code - von 427s auf 61.036 s
  126. DSL_50=MA_filter(S,50,m,n);
  127. DSL_200=MA_filter(S,200,m,n);
  128.  
  129. for j=1:m
  130.     for i=1:50
  131.         DSL_50(j,i)=mean(S(j,1:i));
  132.     end
  133. end
  134.  
  135. for j=1:m
  136.     for i=1:200
  137.         DSL_200(j,i)=mean(S(j,1:i));
  138.     end
  139. end
  140.  
  141. % Berechne 50 Tage DSL
  142.  
  143. % alter, zu langsamer code
  144. %DSL_50=zeros(m,n);
  145. % for j=1:m
  146. % for i=1:n
  147. %    if i<51
  148. %        DSL_50(j,i)=mean(S(j,1:i));
  149. %    else
  150. %       DSL_50(j,i)=mean(S(j,i-50:i));
  151. %    end
  152. % end
  153. % end
  154.  
  155. % Berechne 200 Tage DSL
  156. % DSL_200=zeros(m,n);
  157. %
  158. % for j=1:m
  159. % for i=1:n
  160. %    if i<201
  161. %        DSL_200(j,i)=mean(S(j,1:i));
  162. %    else
  163. %       DSL_200(j,i)=mean(S(j,i-200:i));
  164. %    end
  165. % end
  166. % end
  167.  
  168. % Plotte Assetverlauf + DSLs
  169. figure
  170. pl=plot(1:n,S(1,1:n),1:n,DSL_50(1,1:n),1:n,DSL_200(1,1:n));
  171. set(pl(1),'linewidth',1.5)
  172. legend('Asset','DSL 50','DSL 200','Location','northeast')
  173. title('Beispielpfad Durchschnittlinien')
  174. xlabel('Simulation')
  175. ylabel('Preis')
  176.  
  177. % Werte Kauf/Verkaufsignale aus
  178.  
  179. habe_Asset = 0; % variable um zu speichern ob man Asset besitzt oder nicht
  180. Rendite_dsl=zeros(m,n); % Rendite absolut
  181. wann_gekauft=0; % Speichere wann Asset keuaft wurde für Renditeberechnung
  182.  
  183. for j=1:m
  184.         for i=1:n
  185.             if DSL_50(j,i) > DSL_200(j,i) && habe_Asset == 0
  186.                % Dann kaufe Asset
  187.                 wann_gekauft=i;
  188.                 habe_Asset=1;
  189.                 if i>1
  190.                     Rendite_dsl(j,i)=Rendite_dsl(j,i-1);
  191.                 else
  192.                     Rendite_dsl(j,i)=0;
  193.                 end
  194.             elseif DSL_50(j,i) < DSL_200(j,i) && habe_Asset == 1
  195.                 % Dann verkaufe Asset
  196.                 Rendite_dsl(j,i)=Rendite_dsl(j,i-1)+S(j,i)-S(j,wann_gekauft); % bisherige Rendite + das was neu dazu kommt
  197.                 wann_gekauft=-1;
  198.                 habe_Asset=0;
  199.             else
  200.                 if i>1
  201.                     Rendite_dsl(j,i)=Rendite_dsl(j,i-1);
  202.                 else
  203.                     Rendite_dsl(j,i)=0;
  204.                 end
  205.             end
  206.         end
  207.     if habe_Asset ==1
  208.         % Falls ich am ende Asset habe berechne Rendite die aktuell
  209.         % drauf ist
  210.         Rendite_dsl(j,i)=Rendite_dsl(j,i-1)+S(j,i)-S(j,wann_gekauft); % Endrendite
  211.     end
  212.     wann_gekauft=-1;
  213.     habe_Asset=0;
  214. end
  215.  
  216. figure
  217. pl=plot(1:n,Rendite_rand(1,1:n),1:n,Rendite_poi(1,1:n),1:n,Rendite_dsl(1,1:n));
  218. %set(pl(2),'linewidth',1.5)
  219. legend('Random','Poisson','mit DSL','Location','northeast')
  220. title('Beispielpfad Renditen absolut')
  221. xlabel('Simulation')
  222. ylabel('Renditen')
  223.  
  224. %% Werte Ergebnisse aus
  225.  
  226. return_rand=Rendite_rand(1:m,n);
  227. return_dsl=Rendite_dsl(1:m,n);
  228. return_poi=Rendite_poi(1:m,n);
  229.  
  230. disp('Rendite mit zufälligen Käufen')
  231. mean(return_rand)
  232. disp('Standardabweichung Rendite mit zufälligen Käufen')
  233. std(return_rand)
  234.  
  235. disp('Rendite mit zufälligen poissonvtlten Käufen')
  236. mean(return_poi)
  237. disp('Standardabweichung Rendite mit zufälligen poissonvtlten Käufen')
  238. std(return_poi)
  239.  
  240. disp('Rendite mit dsl Strategie Käufen')
  241. mean(return_dsl)
  242. disp('Standardabweichung mit dsl Strategie Käufen')
  243. std(return_dsl)
  244.  
  245. %% Random Ideen
  246.  
  247. % - Brownsche Bewegungen korrelieren für kleinere Std und realistischere
  248. % Ergebnisse -> Cholesky Zerlegung
  249. % - wahrscheinlich x Sachen hier verbessern die eventuell falsch sind :D
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement