VPFPM ZS 2016/17

NMFM308 Computational Tools for Finance and Insurance

$LicenseExpirationDate

Úvod

Doplňky k přednášce NMF201 Finanční management z LS 2015/16

Doplňky k přednášce NMF201 Finanční management z LS 2015/16 budou uvedeny později.

Zkoušky a zápočty

Zápočet

Maximálně tři neomluvené absence a aktivní účast na cvičení. Zápočty udělené v minulosti se neuznávají.

Zkoušky

Termíny jsou vypsány v SIS. K zápisu na zkoušku je nutný zápočet.

2017-01-18, 2017-01-24, 2017-02-15: 09:00 v posluchárně K4.

Odehrávají se v laboratoři K4 u počítače.  Jsou to problémově orientované otázky (obvykle v počtu 2 až 4) vycházející typicky z příkladů uvedených v přednášce. Posuzuje se i formální prezentace výsledků, tj. členění do sekcí, paragrafů, fonty atp. Jsou nutné znalosti z dříve absolvovaných předmětů bakalářského studia finanční matematiky.  Orientační doba trvání zkoušky je 75 minut. Řešení je v elektronické podobě odesíláno examinátorovi ve formátu *.nb v předepsaném formátu.  Výsledky zkoušky v SIS do 50 hodin od konce zkoušky.

Pravidla zkoušky:

1. Můžete zcela volně používat Mathematica Help. Pokud tam najdete odpověď na danou otázku, můžete ji bez obav doslova zkopírovat. Odpověď však je nutné česky komentovat.

2. Z internetových zdrojů můžete používat pouze Wolfram Demonstration Project. Také tady platí, že  pokud tam najdete odpověď na danou otázku, můžete ji bez obav doslova zkopírovat. Odpověď je však také nutné česky komentovat.

3. U zkoušky budete mít k dispozici počítač se zvláště  zřízeným účtem. Není přípustné se během zkoušky logovat se na jiný účet s výjímkou odesílání Vašeho výtvoru examinátorovi. K tomu můžete přistoupit až na výzvu examinátora v posledních cca třech minutách zkoušky.

***Seznam zabudovaných funkcí, jejichž znalost je nutná (nikoli postačující) pro úspěšné zvládnutí zkoušky

Ovládání nejdůležitějších funkcí základního Menu

File ⟶ Save Selection As

Insert ⟶ Hyperlink, &c.

Format ⟶ Style, Face, Size, Text Color, &c.

Evaluation ⟶ Dynamic Evaluation Enabled, Abort Evaluation, Quit Kernel

Palettes Writing Assistant

F1 Nápověda k označené funkci

Základní funkce (elementární funkce typu Log, Sin, Tan, ArcTan, Abs, ..., důležité konstanty Pi, E, i, (π,e,i)  se samozřejmě předpokládají)

(* zavorky *) Parentheses ( ), square brackets [ ], [[ ]], braces { }

FullForm,TreeForm,
Head (* Integer, Real, Rational, Complex, Symbol, String *)

; (* středník = potlačený výstup, výpočet se však provede *)

N, Binomial, Clear, Remove, ?identifikátor, (* dotazy typu *) ?*Function, ?Function*, ?*Function*

Symbolické funkce a jejich numerické ekvivalenty

Simplify, FullSimplify

Expand, ExpandAll, PowerExpand, FunctionExpand, Factor, Together, Apart

Total, Sum, Product

D, Integrate, NIntegrate

Solve, NSolve, Reduce, FindRoot, RSolve, DSolve, NDSolve

Limit, Series

FindSequenceFunction

Definice funkcí a pravidla (rules)

f[x_]=výraz (* globální pravidlo, okamžité přiřazení, provede se výpočet (vyhodnotí se výraz) a ten se uloží *)

f[x_]:=výraz (* globální pravidlo, odložené přiřazení, uloží se definice, výpočet se provede až v okamžiku vyvolání *)

x->y (* lokální pravidlo, substituce s okamžitým vyhodnocením *)
x:>y (* lokální pravidlo, substituce s odloženým vyhodnocením *)
(* aplikace: /. ReplaceAll, //. ReplaceRepeated *)

f[x_]:=Module[{lokální proměnné},složený příkaz]

f[x_]:=f[x]=výraz (* dynamické programování! *)

Which, Piecewise, Boole, While, Print

Grafika

včetně voleb probíraných na přednášce, viz Options[Plot] &c.

Plot, Plot3D, ParametricPlot, ParametricPlot3D, ListPlot,DateListPlot

Manipulate

Show[(Subscript[p, 1]),(Subscript[p, 2]),...] (* Sloučení více grafů do jednoho *)

Seznamy (lists), matice

Table, Array, Range

Take, Drop

First, Last, Rest, Most

Flatten

Prepend, Append, Insert, Delete, Position

Length,Dimensions

Reverse, RotateLeft

Join, Intersection, Complement

Součiny (maticový, obyčejný - po složkách, Hadamardův):

. ,*

IdentityMatrix, DiagonalMatrix,Diagonal, HilbertMatrix

Transpose,Inverse,Det,MatrixPower,Eigenvalues,Eigenvectors

Optimalizace (včetně omezení (constrained optimization) a různých oborů)

Minimize, NMinimize,FindMinimum

(* Příklad *) NMinimize[{(x-1/3)^2+(y-1/3)^2,x∈Integers},{x,y}]

Anonymní (ryzí) funkce, funkcionální programování

Function (* zkrácená konstrukce #& *)

Predikáty a vzory (předlohy, patterns), převod predikátu na vzor

Map, Apply, Thread

Nest, NestList, Fold, FoldList, NestWhile

Řetězce, balíčky (Packages)

StringSplit,StringLength,StringJoin,StringTake,StringDrop,StringInsert,StringReplace,StringReverse

ToUpperCase,ToLowerCase,IgnoreCase->True

Characters,CharacterRange

ToExpression,ToString

Needs["HypothesisTesting`"] (* nebo v Unixovské syntaxi Get: *)

<<HypothesisTesting`
Names["HypothesisTesting`*"]

Pravděpodobnost a statistika

SeedRandom[13],Random,RandomVariate, RandomReal,RandomInteger

RandomChoice, RandomSample

NormalDistribution, UniformDistribution, DiscreteUniformDistribution, StudentTDistribution, ChiSquareDistribution, FRatioDistribution

Probability, ProbabilityDistribution, Expectation

Mean, Variance, StandardDeviation, Median, Quantile

FindFit, LinearModelFit, NonlinearModelFit

EstimatedDistribution, SmoothKernelDistribution

Databázové funkce, externí objekty

Count,Tally

Sort 
(* včetně třídících funkcí, ordering function a třídění podle jiné než první složky *)
Select Cases

FreeQ,MatchQ, MemberQ

FinancialData, CountryData

ExampleData[],ExampleData["Text"]

SetDirectory[NotebookDirectory[]] (* při exortu a importu se nemusí vypisovat kompletní cesta (Path), usnadňuje přenositelnost *)

Import, Export, $ImportFormats, $ExportFormats, Hyperlink, Button

Finanční funkce

FinancialDerivative[]

Annuity

AnnuityDue

Cashflow

TimeValue

EffectiveInterest

FinancialBond

FinancialDerivative

TradingChart

InteractiveTradingChart

FinancialIndicator
FinancialIndicator[All]//Length

FindRoot
FindMinimum
FindFit
Find

Solve
NSolve
FindRoot
Sort

Literatura

[1] Dupačová, J., Hurt, J., Štěpán, J.: Stochastic Modeling in Economics and Finance. Kluwer Academic Publishers. Dordrecht 2002.

[2] Cipra, T.: Finanční ekonometrie. Ekopress, Praha 2008.

[3] Cipra, T.: Matematika cenných papírů. Kamil Mařík Professional Publishing. Praha 2013.

[4] Hurt, J.: Yield curves with Mathematica 6.0. In: Wolfram Technology Conference 2007. http://library.wolfram.com/infocenter/Conferences/6956/ . Champaign (IL) 2007.

[5] Hurt, J.: Risk measures in finance. In: 2008 International Mathematica User Conference. http://library.wolfram.com/infocenter/Conferences/7230/.  Champaign (IL) 2008.

[6] Hurt, J.: Risk measures in finance revisited. In: Wolfram Technology Conference 2010. http://library.wolfram.com/infocenter/Conferences/7861/  . Champaign (IL) 2010.

[7] Sciencedirect:  http://www.sciencedirect.com/

[8] Mathematica Cookbook

[9] Luenberger, D.: Investment Science. Oxford University Press. New York 1998.

[10] Cipra, T.: Financial and Insurance Formulas. Springer-Verlag. Berlin Heidelberg 2010.

[11] Vencálek, Ondřej: Základy analýzy dat v softwaru Mathematica. Univerzita Palackého v Olomouci. Olomouc, 2015. Text je dostupný v knihovně Karlín a Malá Strana. Rovněž je přístupný elektronicky na adrese http://mathscience.upol.cz/materialy.html a to jak ve formátu pdf, tak i ve formě spustitelného “sešitu” Mathematica (.nb).

[12] An Elementary Introduction to the Wolfram Language by Stephen Wolfram: http://wolfr.am/eiwl

[13] Hands-on Start to Wolfram Mathematica and Programming with the Wolfram Language by Cliff Hastings, Kelvin Mischo, and Michael Morrison (Chapter 7 “Creating Interactive Models with a Single Command” available free online): http://www.handsonstart.com

[14] The Wolfram Language: Fast Introduction for Programmers
http://www.wolfram.com/language/fast-introduction-for-programmers/en
Zahrnuje též cvičení s odpovědmi.

[15]
http://www.wolfram.com/mathematica/quick-revision-history.html

Odstavce označené hvězdičkami je třeba interpretovat takto:

*    Slouží k procvičení, znalost ke zkoušce nutná.

**  Obsahuje důležité informace, ale jejich neznalost při zkoušce není fatální, zkouškou je možné “projít”.

*** Inspirativní náměty nebo zatím přednášejícím nezpracovaná témata. Leckdy užitečné pro řešení problémů v budoucnosti.

Doporučený postup pro studium systému Mathematica (nyní Wolfram Language)

(i)

Připomenout si kurs Slavík A.: Mathematica pro začátečníky

http://www.karlin.mff.cuni.cz/~slavik/info.html

(ii)

Projít letmo kurs Slavík, A.: Mathematica pro pokročilé (tamtéž)

(iii)

Podívejte se na Help ⟶ Wolfram  Documentation ⟶ Wolfram Language and System. Prohlédněte si, co je v jednotlivých kapitolách a podívejte se  do Intro for Programmers (malým písmem) úplně dole a Introductory Book. Tím se získá přehled, co všechno je možné pomocí systému realizovat. V této fázi není rozumné se věnovat detailům, navíc jest v prvním čtení nemožné porozumět všemu. Cílem je učinit si mlhavou představu o více než 6000 zabudovaných (built-in) funkcí.

Poznamenejme, že hodně zabudovaných funkcí jsou tzv. “superfunkce”. To znamená, že pod jedním názvem funkce se skrývá (pomocí voleb) programový balík. Viz funkce pro shlukovou analýzu (jedna z metod mnohorozměrné statistické analýzy):

FinancialDerivative

Information["FinancialDerivative",LongForm->False]

Information["FindClusters",LongForm->False]

nebo funkce pro hodnocení finančních derivátů

?FinancialDerivative

Znáte-li alespoň přibližný název funkce nebo jeho část, můžete zkusit např. (Pozor na velká a malá písmena, Mathematica je “Case sensitive”, všechny zabudované funkce začínají velkým písmenem!!!)

?*value*

?*Value*

tam je “naše” funkce TimeValue, na tu poklepneme a dostaneme

poklepnutím na ≫ dostaneme kompletní popis funkce.

?Association

Od verze 9 Mathematica disponuje prediktivní nápovědou: Po napsání prvních dvou písmen existujícího symbolu se objeví seznam možných symbolů z nichž je pak možné vybrat ten požadovaný. U některých zabudovaných funkcí je k dispozici “Advanced Documentation”, někdy též “Tutorials”. Doporučuji její přečtení. Čtenář se zde srozumitelným způsobem seznámi se současnými metodami, které obvykle nejsou v syllabech přednášek konaných na MFF.

(iv)

Z přednášky si čiňte poznámky. Jak metodickými badateli zjištěno, samotným zapisováním se část poznatků v paměti fixuje lépe než při pouhém náslechu. Záznamy z přednášek na mé domovské stránce.

Viz Úvod k oranžové karolince str. 11:

http://www.mff.cuni.cz/fakulta/tiskoviny/or_k1516.pdf

(v)

Není možné se naučit, natož pochopit všechno ihned. K nejmocnějším funkcím systému Mathematica (Apply, Map, Thread, případně Fold, Nest a funkcím podobným) je nezbytné se neustále vracet a zkoušet je v konkrétních situacích.

(vi)

Jádro systému Mathematica bylo naprogramováno v jazyku C. Půjdeme-li zpátky, pak C byl naprogramován v Assembleru, a ten přímo ve strojovém kódu. Pro efektivní užití systému Mathematica však není vhodná zakořeněná znalost ideologie procedurálních jazyků jako jsou Pascal, FORTRAN, C++ a další. Znalosti objektově orientovaného programování jsou naopak vítány. V systému Mathematica je sice možné prakticky doslova přepsat program napsaný v některém z těchto procedurálních jazyků, ale tím by byla zcela negována hlavní zbraň systému Mathematica, tj. funkcionalita, přehlednost, rychlost, kontrolovatelná přesnost a verifikovatelnost při modelování. Zejména z hlediska přehlednosti konstrukce modelů (a ve vyšší fázi použití nadstavby WorkBench pro vytváření projektů) jsou funkce typu “cyklus” naprosto nevhodné. Výhodou pro porozumění systému Mathematica  je znalost logiky jazyků Prolog, LISP (byť velmi starých, které v době svého vzniku neměly podporu v potřebné počítačové technice) .

(vii) Klávesové zkratky

Klávesove zkratky 1

http://reference.wolfram.com/mathematica/guide/SelectingAndTypingInNotebooks.html

Velmi uzitečné: Enter (pouze odřádkování v rámci buňky), Shift+Enter nebo  Enter na numerické klávesnici (pro odstartování výpočtu), F1 (návod k dané funkci), Ctrl+Shift+K (make template, nejdříve napíšeme funkci), Ctrl+Shift+B (Balance, kontrola uzavorkovani), Otevírání resp. zavírání označených buněk Ctrl+⇧+{ resp. Ctrl+⇧+} nebo z Option Inspector instalovat “Show Group Opener”

Templates

Integrate[f,{x,(Subscript[x, min]),(Subscript[x, max])}]

Integrate[(x^2),{x,y}∈Disk[]]

Integrate[(x^2)+(y^2),{x,y}∈Disk[{0,0}]]

Enter

3 4

3                                                                                                                           4

3                                                                                                               
4

Klávesove zkratky 2

vyhodna prevence neustaleho prehmatavani mezi mysi a klavesnici, da se vytisknout na dvou strankach podelne): http://media.wolfram.com/brochures/mathematicashortcuts.pdf

Viz také:
tutorial/KeyboardShortcutListing
Viz také: guide/NotebookShortcuts

Row[{Hyperlink[Button["Keyboard shortcuts"], 
    "paclet:tutorial/KeyboardShortcutListing"], 
   Hyperlink[Button["Notebook shortcuts"], 
    "paclet:guide/NotebookShortcuts"]}]

Další

Novinky verze 9, 10, 11 (Např.: Built-in Integration with R)

Row[{Hyperlink[Button["            RLink            "], 
    "paclet:RLink/tutorial/Introduction"], "   ", 
   Hyperlink[Button["Summary Of New Features In 10"], 
    "paclet:guide/SummaryOfNewFeaturesIn100"], "   ", 
   Hyperlink[Button["Summary Of New Features In 11"], 
    "paclet:guide/SummaryOfNewFeaturesIn11"]}]

http://www.wolfram.com/products/applications/unrisk/

http://www.wolfram.com/products/applications/timeseries/
(částečně integrováno ve verzi 11)

http://www.wolfram.com/products/applications/finance/features.html

http://www.karlin.mff.cuni.cz/~prokesov/Sbirka%20 uloh %20 z %20 financni %20 matematiky %20-%20 Klara %20 Jelenova.pdf

(viii) Další prameny

Printed Tutorial Collection

Manuály v PDF (volně ke stažení, trochu zastaralé):
http://www.wolfram.com/learningcenter/tutorialcollection/

Wolfram Demonstrations Project

k dispozici 10321 demonstrací (k 7. 10. 2015). Vyhledávání podle témat. Na dotaz “option pricing” 53 demonstrací. Zdrojový kód volně ke stažení (instruktivní!). Dosažitelné z Help nebo z:

http://demonstrations.wolfram.com/

Podivejte se na Latest, pak Search: Finance, Insurance, Economics, Probability, Statistics. Demonstrace je mozne stahnout a studovat. Zacnete studovat ty jednodussi. Cim hezci grafika, tim komplikovanejsi kod a pro zacatecnika hure srozumitelny.

Příklady

http://demonstrations.wolfram.com/PresentValueCalculator/

http://demonstrations.wolfram.com/BondPricing/

http://demonstrations.wolfram.com/FinancialEngineeringOfABond/

http://demonstrations.wolfram.com/DeterminantsOfTheNPVOfABond/

Jak získat zdrojový kód demonstrace?

V demonstraci v okénku vpravo ⟶ Download Author Code. Otevřít buňky (dvakrát poklepat na modrou závorku vpravo). Často se objeví zpráva:

⚠ This file contains potentially unsafe dynamic content.

Stiskněte modré pole “Enable Dynamics”.

Menu Evaluation ⟶ Dynamic Upadating Enabled

Nefunguje-li Vám program v otevřeném oknu, vyberte vše  (Ctrl+A), a zkopírujte do otevřeného notesu.

The Mathematica Journal

Pro opravdové zájemce: http://www.mathematica-journal.com/

Specializovana cisla, statistika viz  Vol. 9 (4)

Odkazy

Základní stránky

http://www.wolfram.com

http://www.mathematica.cz/

http://community.wolfram.com/

http://mathematica.stackexchange.com/

http://blog.wolfram.com/

Výhradní distributor v ČR a SR: http://www.elkan.cz/

Videa a jak co udelat (“How tos”):

(Vhodne tez jako cviceni poslechu anglictiny)

http://www.wolfram.com/broadcast/

(Přejít na Channels)

http://www.wolfram.com/broadcast/video.php?channel=108&video=439

Integrated Data Sources

http://reference.wolfram.com/mathematica/guide/ComputableDataOverview.html

http://reference.wolfram.com/mathematica/guide/FinancialAndEconomicData.html

http://reference.wolfram.com/mathematica/guide/Finance.html

Příklad

FinancialData["EUR/CZK"]

rateEURCZK:=FinancialData["EUR/CZK"]
timedrateEURCZK:={DateString[],rateEURCZK}
Dynamic[timedrateEURCZK,UpdateInterval->2]

priceBMW:=FinancialData["F:BMW"]
timedpriceBMW:={DateString[],priceBMW}

Dynamic[timedpriceBMW,UpdateInterval->2]

fil9={};
Do[Pause[2];AppendTo[fil9,{DateString[],FinancialData["EUR/USD"]}],{10}]
fil9

DateListPlot[fil9]

Instalace a licence (studentská L4697-4335)

Návod též na mé domovské stránce v pdf

MFF má do 27. 11. 2016 neomezenou akademickou licenci (Unlimited licence, v nejbližších dnech bude prodloužena o další rok), v současnosti verzi 11.0.1. Na http://user.wolfram.com si vytvořte účet a stáhněte instalační soubor  (All platforms nebo Windows, Linux, Mac). Velikost okolo 2GB.

Pokyny pro registraci.  Nepoužívejte diakritiku!

Name: Jméno Příjmení (žádné pseudonymy se nepřipouštějí)
Organization: Charles University
Department: Statistics (Mathematics, ...)

Podrobnosti pro vlastní instalaci

1. Na stránce http://user.wolfram.com si vytvořte „Wolfram Account“ (odkaz Create Account) a stáhněte instalační soubor.
2. Po spuštění instalačního programu odsouhlaste přednastavené volby.
3. Při přechodu na stránku vytvoření účtu se vás prohlížeč zeptá, zda má stahovat zabezpečené i nezabezpečené položky (zde POZOR!! otázka je někdy formulována „Chcete stahovat jen zabezpečené položky“ pak je třeba odpovědět NE; a v případě, že je otázka formulována „chcete stahovat zabezpečené i nezabezpečené položky, pak je třeba odpovědět ANO).
4. Vyplníte registrační informace a formulář odešlete.
5. Obratem vám dojde ověřovací e-mail s dalším odkazem, kterým potvrdíte správnost e-mailu.
6.  Aktivační klíč získate na
https://user.wolfram.com/portal/requestAK/19bce9af2a5e13230bdc385a0e41a7f8066ca8fb
7. Obratem vám přijde e-mail  s aktivačním klíčem s dalšími istrukcemi.

Wolfram Alpha

Vstup: “==” nebo “+“ vlevo:

WolframAlpha["world gdp",{{"History:GDP:WorldDevelopmentData",1},"FormattedData"}]

auxGDP=WolframAlpha["world gdp",{{"History:GDP:WorldDevelopmentData",1},"FormattedData"}]

auxGDPinDollars=Rest[auxGDP[[1]]][[All,2]] 1000000000000;
auxGDPinCZK=auxGDPinDollars FinancialData["USD/CZK"];
DateListPlot[{Rest[auxGDP[[1]]][[All,1]],auxGDPinCZK}//Transpose]

WolframAlpha["world gdp",{{"History",1},"NumberData"}]

{1.722`*^15,1.879`*^15,1.786`*^15}  FinancialData["USD/CZK"]

WolframAlpha["world gdp",{{"LocalCurrencyConversion",1},"ComputableData"}]

WolframAlpha["world gdp",{{"History:GDP:WorldDevelopmentData",1},"TimeSeriesData"}]
%//DateListPlot

WolframAlpha["world gdp",{{"History:GDP:WorldDevelopmentData",1},"FormattedData"}]

unemployment=WolframAlpha["world unemployment",{{"History:UnemploymentRate:WorldDevelopmentData",1},"TimeSeriesData"}];

timeseriesunemployment=TimeSeries[unemployment]

DateListPlot[timeseriesunemployment]

2016-10-04 Lekce 1

2016-10-11 Lekce 2

Viz Úvod

Konec 2016-10-11

2016-10-18 Lekce 3

FAQ

Základní techniky  a doporučené návyky

Frontend (To, co vidíte na obrazovce) ⟷ Kernel (Tam se počítá)

Práce v prostředí Frontendu probíhá v souboru, který se v systému Mathematica nazývá notebook (přípona *.nb).

Výpočet se aktivuje klávesami ⇧+⌤  nebo pouze ⌤ na numerické klávesnici.  Samotné Enter odřádkuje v rámci buňky. Pozor na lícovaní levého okraje!!!

Probíhající výpočet je indikován žlutě svítícím ohraničením buňky (cell). Při špatném zadání může výpočet probíhat neočekávaně dlouho. Pokud chceme výpočet přerušit, použijeme z Menu Evaluation nabídku Interupt Evaluation, v nejhorším případě nabídku Quit Kernel (Local).

Vaše práce se automaticky neukládá. (Jde to sice nastavit, ale vřele nedoporučuji.) Proto doporučuji čas od času rozdělanou práci uložit Ctrl+S, a zvláště tak učinit před každým “nejistým” výpočtem, lépe téměř před každým.

Palety: Menu ⟶ Palletes. Dost universální je Writing Assistent (u některých symbolů ukazuje také klávesovou zkratku). Je možné si vytvořit paletu vlastní.

Výběr z guide/NotebookBasics

F1 — get information or help
right-click — get a context-specific menu

Cell Groups and Outlining

double-click a group bracket — open or close a cell group
double-click cell brackets — close all other cells in a group
triple-click — select a function and its arguments
Subscript (Ctrl+ _): (Subscript[x, n])  ▪  Special Character  ▪  Convert to StandardForm  ▪  Why the Coloring?  ▪  
Superscript (Ctrl+ ^): (x^y)
Alt+7 — text cell (with default stylesheet) (Format ▶ Style ▶ ...)
Alt+4 — section-heading cell (with default stylesheet)

Všechny instrukce týkající se práce s notesy (notebooky)

Hyperlink[Button["Základy práce v notesu"],"paclet:guide/NotebookBasics"]

4 pilíře systému Mathematica

Numerické výpočty

Výpočet pomocí Shift + Enter nebo Enter na numerické klávesnici. Samotné Enter odřádkuje v rámci buňky.

1+1 
2+3
3+5 4

Ekonomičtěji:

{1+1,2+3, 3+4 5}

{(2^1000),N[(2^1000)],((2^20)/(3^25)),N[((2^20)/(3^25))]}

Chyba posledniho vystupu

1.2375665013239403`*^-6-N[((2^20)/(3^25)),100]

⚠ Potlačení výstupu: ; (středník: výpočet se však provede!)

πnadesettisicmist=N[π,10000];
πnadvacettisicmist=N[π,20000];
πnadesettisicmist-πnadvacettisicmist

Ale:

dvena10000000000000000=(2^10000000000000000);
N[dvena10000000000000000]

$MaxNumber

a=5; (* Je zřejmé, jaká hodnota bude přiřazena, proto středník. *)

π

DMSList[N[(π/°)]]

npi=N[π,15]

π==Pi

Sdruzovani vice vypoctu do jedne bunky

1+1
2+2
2+
3
(* ale *)
2
+3
(* radek musi koncit operatorem *)

{π,N[π],"log 2 numericky = ",Log[2.]," log 2 presne = ",Log[2],N[Log[2]]}

Kopie predchoziho 3.14159 do Input bunky:

3.141592653589793`
Precision[%]
$MachinePrecision

Symbolické výpočty

e1=Expand[(((x+y))^7)]

e2=Factor[e1]

TeXForm[e2/e1]

Převedení TEX výrazu do spočitatelného tvaru:

Clear[x];
e3=(((x-1))^2)//TraditionalForm//TeXForm

(**)ToExpression[ToString[e3],TeXForm]//Expand//TraditionalForm

Clear[a];
(a^2)-1/Integrate[Sin[(x^2)],x]//TraditionalForm
TeXForm[%]

Clear[a];
(a^2)-1/HoldForm[Integrate[Sin[(x^2)],x]]
TeXForm[%]

Ekvivalentní zápisy

{Expand[(((x-1))^5)],(((x-1))^5)//Expand,
Expand@(((x-1))^5)}

TraditionalForm@Expand[(((x-1))^5)]
TraditionalForm[Expand[(((x-1))^5)]]
Expand[(((x-1))^5)]//TraditionalForm

Pozor na zápis funcí!

Clear[x]
{((Sin[x])^2),((Sin[(π/3)])^2),(x^3),(Sin^2)[(π/3)],Sin Sin}//TraditionalForm

Text: (sin^2)(x), (3/4),(x^3)

Text@Grid[Table[{j,Sin[(π/j)]},{j,1,10}],Frame->All]

Clear[a,b,c,x];
(* Rovnice se zapisují pomocí dvojitého rovná se: == *)
reseni=Solve[a (x^2)+b x +c==0,x]

x/. reseni

(* Podrobnější analýza *)
Reduce[a (x^2)+b x +c==0,x]

?x

(* Pozor! *)
x=4;
Solve[a (x^2)+b x +c== 0,x]
?x

a (x^2)+b x +c=0
a (x^2)+b x +c//FullForm

Používejte srozumitelné názvy proměnných, prediktivní nápověda Vám umožní snadné doplnění. Vlastní identifikátory by měly začínat malým písmenem (všechny zabudované funkce začínají velkým písmenem.)

mesicniPredepsanePojistneMuzi=1000;
mesicniPredepsanePojistneZeny=2000;

mesicniPredepsanePojistneZeny

?reseni

Vypreparováni kořenů:

{x,x^2,y,z}/.{x->a,y->(y^2),t->0}

reseni

koreny=x/.reseni

4/. reseni

Clear[a,b,c,x];
i1=(∫_0^∞)(E^(-a (x^2)/2))\[DifferentialD]x

i1//FullForm

i1//TreeForm

i1[[1,2,1,2]]
{i1[[0]],i1[[1]],i1[[2]]}

{Assuming[a>0,(∫_0^∞)(E^(-a (x^2)/2))\[DifferentialD]x],(* ekvivalentně *)
Integrate[Exp[-a x^2/2],{x,0,Infinity},Assumptions->{a>0}]}

{i1,
(* Zatím obtížné: *)
i1/.ConditionalExpression[a_,b_]->a,i1[[1]]}

(* Také je možné *)
Integrate[Exp[-a x^2/2],{x,0,Infinity},GenerateConditions->False]

Seznam symbolů použitých v této seanci:

?Global`*

{Integrate[Exp[-a x^2/2],{x,0,Infinity},
GenerateConditions->True],Integrate[Exp[-a x^2/2],{x,0,Infinity},
GenerateConditions->False]}

Příklad složené funkce (různé zápisy)

{ArcTan[Tan[(π/4)]],(π/4)//Tan//ArcTan,ArcTan@Tan@(π/4)}

Částečné a nekonečné součty

Nasledujici vypocet je instruktivni a dela potize i u statnich zkousek. Kolik je celych cisel mezi celymi cisly a,b,a<b?

Clear[a,b];(∑_(i=a)^b)1//TraditionalForm

Variace na dane tema:

{(∑_(i=1)^n)(∑_(j=1)^i)1,(∑_(i=1)^n)i,Total[Range[100]],Apply[Plus,Range[100]]}//TraditionalForm
{(∑_(i=1)^n)(i^6),(∑_(n=1)^∞)(1/n),(∑_(n=1)^∞)(1/(n^2)),(∑_(n=1)^∞)(1/(n^4))}

Meze vícenásobných součtů, integrálů odpovídají matematickému zápisu: interpretují se zleva doprava.

{Sum[1,{i,n},{j,i}],(∫_0^n)(∫_0^x)\[DifferentialD]y\[DifferentialD]x}

{(∑_(i=1)^n)(∑_(j=1)^i)i j//Expand,
Integrate[x y (* soucin x a y *),{x,0,n},{y,0,x}]}//TraditionalForm

Grafika

Využití návrhu (Suggestion bar)

plotsinusxnadruhou=Plot[Sin[(x^2)],{x,0,π}]

Show[plotsinusxnadruhou,Background->RGBColor[0.97`,0.93`,0.68`]]

Show[plotsinusxnadruhou,Background->RGBColor[0.97`,0.93`,0.68`],AxesLabel->{HoldForm[x],HoldForm[y]},PlotLabel->HoldForm[Graf funkce sin (x^2)],LabelStyle->{FontFamily->"Aparajita",14,GrayLevel[0]}]

Plot[Sin[(x^2)],{x,0,π},PlotTheme->"Marketing"]

Show[plotsinusxnadruhou,Background->Directive[RGBColor[1.`,0.64`,0.28`],Opacity[0.254`]]]

Show[plotsinusxnadruhou,AxesLabel->{HoldForm[osa x],HoldForm[osa y]},PlotLabel->HoldForm[Sin (x^2)],LabelStyle->{16,GrayLevel[0]}]

Show[plotsinusxnadruhou,AxesLabel->{HoldForm[x],HoldForm[y]},PlotLabel->HoldForm[Sin[(x^2)]],LabelStyle->{FontFamily->"Arial",16,GrayLevel[0],Bold}]

Plot[Sin[x+x^2],{x,0,3π},PlotRange->{-5,5},Ticks->{{{0.5,"0.5"}},{Pi/2,Pi,2Pi}},FormatType->TraditionalForm,AxesLabel->{x,"Sin[x+(x^2)]\n"},TicksStyle->Directive[Orange,16]]
Plot[Sin[x+x^2],{x,0,π},PlotRange->{-5,5},Ticks->{{0,(Pi/2),Pi},{-Range[5],0,Range[5]}//Flatten},AxesLabel->{x,Style["\nSin[x+(x^2)]\n",Large]}]

"3D grafy je mozne otacet, zvetsovat ..."
p1=Plot3D[Sin[x+y^2],{x,0,π},{y,0,π}]

SetDirectory[NotebookDirectory[]]
Export["graffunkce.pdf",p1]

$ExportFormats

Plot3D[Sin[x+(y^2)],{x,0,π},{y,0,π}]

Options[Plot3D]//Length

?*Plot*

ještě jeden příklad (Srdcovka)

ContourPlot[((((x^2)+(y^2)-1))^3)-(x^2)(y^3)==0,{x,-1.3,1.3},{y,-1.1,1.3}]

ContourPlot[(x^2)+(y^2)==1,{x,-1,1},{y,-1,1}]

Ale:

{Plot[{(Sqrt[1-(x^2)]),-(Sqrt[1-(x^2)])},{x,-1,1},PlotStyle->Thick],Plot[{(Sqrt[1-(x^2)]),-(Sqrt[1-(x^2)])},{x,-1,1},PlotStyle->Thick,AspectRatio->1/GoldenRatio],
Plot[{(Sqrt[1-(x^2)]),-(Sqrt[1-(x^2)]),x,-x},{x,-1,1},PlotStyle->Thick,AspectRatio->Automatic]}

{GoldenRatio//FunctionExpand,(1/GoldenRatio)//FunctionExpand}

Manipulate[Plot[{(x^2),1-c (x^2)},{x,a,b}],{a,-1,1},{{b,1},-1,1},{{c,0},-1,1},SaveDefinitions->True]

Cela a zlomkova cast (Floor, FractionalPart)

Plot[{Floor[x],FractionalPart[x]},{x,-2.5,4},PlotTheme->"Detailed"]

Programovaní 1

Definice funkcí (Pokračování)

e1=Expand[(((x+y))^7)]

Clear[hu]; 
(* odstraňuje hodnoty a definice symbolu hu *)
hu[x_]:=(x^2)

(“=” a “:=”  znamená  globální pravidlo)
"=" je okamžité přiřazení (pravá strana se vyhodnotí a uloží), ":=" je odložené přiřazení: uloží se pravidlo, pravá strana se vyhodnotí až při použití pravidla

Levá strana libovolného pravidla může obsahovat vzory, v našem případě x_ zastupuje právě jeden argument. To může být libovolný objekt, číslo, matice, graf, ... .

hu[2]=🐺;
{hu[3],hu[2],hu[2.003]}

?hu

{hu[2],hu[Log[2]],hu[Log[2.]],hu[e1]}

Expand[hu[e1]]

Poznámka k sazbě: (x^2) se vysází jako x Ctrl ^ 2, (Subscript[x, 3]) jako x Ctrl _ 3, (Sqrt[x]) Ctrl2 x nebo z palety (Menu  Palettes Writing Assistant, Basic Math Assistant, Basic Math Input, Basic Typesetting  nebo pomoci Esc sekvenci)

Π ⟶ ⟶ ⟵  ↔  ↘  ↗  ⥮ Ctrl Esc ⌘

hu[x_,y_]:=x^y

{hu[2],hu[2.],hu[2,3],hu[2,3,4+5]}

🐺

{hu[🐺],hu[🐺,🐺],hu[🐺,🐺,🐺]}

🐺//FullForm

?hu

Konec 2016-10-18

2016-10-25 Lekce 4

FAQ

Volný vstup

(RowDefault[(∑_(n=1)^∞)(1/(n^2))==((π^2)/6)])

Načtení externích dat

Pomocí FinancialData nebo CountryData

Z jiných serverů

http://www.cnb.cz/cnb/STAT.ARADY_PKG.PARAMETRY_SESTAVY?p_sestuid=6546&p_strid=ACL&p_lang=CS

“http://www.cnb.cz/cnb/STAT.ARADY_PKG.VYSTUP?p_period=1&p_sort=2&p_des=50&p_sestuid=6546&p_uka=1&p_strid=ACL&p_od=200001&p_do=201609&p_lang=CS&p_format=2&p_decsep=.”

Hyperlink["Inflace","http://www.cnb.cz/cnb/STAT.ARADY_PKG.VYSTUP?p_period=1&p_sort=2&p_des=50&p_sestuid=6546&p_uka=1&p_strid=ACL&p_od=200001&p_do=201609&p_lang=CS&p_format=2&p_decsep=."]

$ImportFormats

(* Česky *)(inflacetext=Import["http://www.cnb.cz/cnb/STAT.ARADY_PKG.VYSTUP?p_period=1&p_sort=2&p_des=50&p_sestuid=6546&p_uka=1&p_strid=ACL&p_od=200001&p_do=201609&p_lang=CS&p_format=2&p_decsep=."<>".Text"])//FullForm

“http://www.cnb.cz/cnb/STAT.ARADY_PKG.PARAMETRY_SESTAVY?p_sestuid=21728&p_strid=ACBAA&p_lang=EN”

(* Anglicky *)Hyperlink["Inflation","http://www.cnb.cz/cnb/STAT.ARADY_PKG.PARAMETRY_SESTAVY?p_sestuid=21728&p_strid=ACBAA&p_lang=EN"]

(* Soubor uložíme jako 20161031_Inflation.Text *)

SetDirectory[NotebookDirectory[]]
FileNames[]//Sort

(data1=Import["20161031_Inflation.Text","Table"]);
(* Vymažeme prvních 5 řádků. *)
(data2=Drop[data1,5])//FullForm;
(* Pozor, je tam ještě něco nežádoucího na konci souboru!!! *)
Last[data2];
(* To musíme také vymazat. *)
data3=Most[data2];
(* Počet záznamů *)
Dimensions[data3]
(* Zpracování 1. řádku *)
(row1=data3[[1]])//FullForm
row1=StringSplit[row1,"|"]
({row1=row1//First,Length[row1]})//FullForm
(* Převod data do "nomrálního" tvaru a dalších položek ze String na Number *)
row1[[1]]=DateList[{row1[[1]],{"Day","Month","Year"}}][[1;;3]]
row1[[2;;14]]=Map[ToExpression,row1[[2;;14]]]
row1//FullForm

(* Operace,  které jsme provedli na prvním řádku, aplikujeme na celý soubor *)

data4=Map[First[StringSplit[#,"|"]]&,data3];
Dimensions[%]
data5First=Map[DateList[{#,{"Day","Month","Year"}}][[1;;3]]&,data4[[All,1]]];
data5Rest=Map[Map[ToExpression,#[[2;;14]]]&,data4];
(***)data5=Map[Prepend[#//Last,#//First]&,{data5First,data5Rest}//Transpose];

plotConsumerPrices=DateListPlot[{data5[[All,1]],data5[[All,2]]}//Transpose,PlotRange->All,PlotTheme->"Business"]

Show[plotConsumerPrices,PlotLabel->HoldForm[Monthly inflation],LabelStyle->{FontFamily->"Arial",14,GrayLevel[0],Bold}]

Programovaní 2

Definice funkcí (Dokončení)

Příklad

Clear[hu]; 
(* odstraňuje hodnoty a definice symbolu hu *)
hu[x_]:=(x^2)
hu[2]=🐺;
hu[x_,y_]:=x^y
{hu[3],hu[2],hu[2.],hu[2,π],hu[2.,π],hu[{1,2,3}],hu[{1,2,3},{1,2,3}],,hu[{1,2,3},{1,3}]}

hu[2]=0;
{hu[3],hu[2],hu[2.]}

?hu

{Unset[hu[2]],hu[2]}

?hu

hu[x_]:=(x/2)

hu[y]

?hu

Clear[hu] 
(* Vymaže hodnoty, odstraní definice symbolu hu. Symbol však zůstává známý v daném kontextu (= adresáři). Ekvivalentní zápis je hu=. *)

?hu

Remove[hu]
(* Odstraní symbol z daného kontextu.  *)
?hu

Vsechny symboly v dane seanci v kontextu Global` (zpětná čárka má podobný význam jako \ v DOS nebo / v Unixu].

?Global`*

Clear[jh];
jh[x_]:=Which[
x<-1,-1,
-1≤x<1,x,
True (* tj., ve všech ostatních případech *),1]
{jh[-3],jh[a],jh[2,3],jh[I]}
Plot[jh[x],{x,-3,3},PlotStyle->Thick,PlotTheme->"Marketing"]

Derivace a integral

{D[jh[z],z],(∫_1^10)jh[x]\[DifferentialD]x,Assuming[z>1/2,(∫_(1/2)^z)jh[x]\[DifferentialD]x],∫jh[x]\[DifferentialD]x}

Definice funkce pro argumenty prirozena a realna cisla

Clear[jh2];
jh2[x_]:=Which[
x∈Integers∧x>0,Factorial[x],
x∈Reals,x 🐺,
True,"Argument neni realne cislo."]
{jh2[10], jh2[1.5],"\n"jh2[1,2],jh2[{1,2}],"\n" jh2[I+1]}

Funkce jh2 aplikovana na list {1,2} zustava nevycislena, protoze Mathematica neumi vyhodnotit dotaz (neumi rozhodnout), zda

{1,2}>0 (* viz úplná forma: *)
{1,2}>0//FullForm
(* Ale je mozne pouzit Map *)
(**) Map[Greater,{1,2}]

Podivejte se do Help, s jakymi argumenty funkce Greater muze pracovat. Jiste vylepseni by bylo pri pouziti funkce Positive[x] misto x>0, ale jeste lepsi je omezit vypocet pouze na numericke hodnoty x. Nasledujici funkce zahaji vypocet pouze v pripade, ze argument je numericka hodnota (muze byt i komplexni cislo). Symbol /; znamena “udelej pouze za podminky, ze ...”

Vymena prvnich dvou prikazu v definici

Clear[jh22];
jh22[x_]:=Which[
x∈Reals,x 🐺,
x∈Integers∧x>0,Factorial[x],
True,"Argument neni realne cislo."]
{jh22[10], jh22[1.5],"\n"jh22[1,2],jh22[{1,2}],"\n" jh22[I+1]}

?jh22

(**)Clear[jh222];
jh222[x_Real]:=x 🐺
jh222[x_Integer]:=Factorial[x]/;x>0
{jh222[10], jh222[1.5],"\n"jh222[1,2],jh222[{1,2}],"\n" jh222[I+1]}

?jh222

(**)Clear[jh3];
jh3[x_]:=Which[
x∈Integers&&x>0,Factorial[x],
x∈Reals,x 🐺,
True,"Argument neni realne cislo."]/;NumericQ[x]
{jh3[10], jh3[1.5],jh3[{1,2}],jh3[I+1]}

Definice Hilbertovy matice ({i,n} znamena totez co {i,1,n}

HilbertMatrix (* zabudovaná funkce *)

Clear[hilbertovamatice];
hilbertovamatice[n_]:=Table[(1/(i+j-1)),{i,n},{j,n}]

(* ((()^( ** ))) Funkcionální definice *)
Clear[hmarray];
hmarray[n_]:=Array[(1/(#1+#2-1))&,{n,n}]
hmarray[3]

hilbertovamatice[3]
hmarray[3]

h3matrixform=hilbertovamatice[3]//MatrixForm

Připomínka: f[x] je totez, co x//f resp. f@x

Poznamka: h3matrixform neni totez co hilbertovamatice[3]!!! Příkazy typu MatrixForm, TableForm, TreeForm slouží pouze pro přehlednější výstup!

FullForm[h3matrixform]

FullForm[hilbertovamatice[3]]

S h3matrixform se neda pocitat:

{Det[h3matrixform],Det[hilbertovamatice[3]]}

Jak odstranit MatrixForm?
1. Nedefinovat symbol jako MatrixForm, ale MatrixForm pouzit pouze pro znazorneni:

(h4m=hilbertovamatice[3])//MatrixForm

S h4m pak mohu dale pocitat:

Det[h4m]

***(Nepovinné) 2. Aplikovat funkci Identity. Ta vymeni hlavicku vyrazu, tj. MatrixForm, za Identity. (Pro zacatecnika obtiznejsi.)

Apply[Identity,h3matrixform]//FullForm

Inverse[hilbertovamatice[3]]//MatrixForm
Inverse[h3matrixform]

Konec nepovinné části.

Symbol [[ se dostane jako Esc[[Esc

h20=hilbertovamatice[20];
Row@{"Prvni radek inverzni matice","\n",First[h20inv=Inverse[h20]]}
Row@{"Determinant presne  = " ,dh20=Det[h20],"\nDeterminant priblizne  = ",N[dh20]}
Det[h20inv]
Row@{"Soucin determinantu matice puvodni a matice inverzni  ",Det[h20]*Det[h20inv]}
First[h20.h20inv]
(* 2. radek matice*)
h20.h20inv[[2]] 
First[Rest[h20.h20inv]]

h20.h20inv==IdentityMatrix[20]

Priklad (nasobeni vektoru a matic)

(* {...} je vektor *)
(* {{...},...{...}} je matice *) 
xx={x1,x2,x3};yy={y1,y2,y3};
xx.yy
{xx*yy,xx×yy}
Transpose[xx]
{xx}//MatrixForm
Transpose[{xx}]//MatrixForm
{xx}.{yy}
Transpose[{xx}].{yy}//MatrixForm
{xx}.Transpose[{yy}]
({xx}.Transpose[{yy}])[[1,1]] (* !!! *)

(* Nepovinne *)
Outer[Times,xx,yy]//MatrixForm

Předefinování zabudované funkce

(0^0)

Dodefinujeme (0^0):=1

(0^0)=1

{(x^y)//FullForm,Attributes[Power]}

Unprotect[Power];
(0^0)=1;
(0^0)
Protect[Power];
{(0^0),(2^3)}

Tato definice platí jen pro tuto seanci. Po opuštění jádra (Kernel) je definice zrušena.

Definice funkce s jedním a více argumenty

x_	právě jeden argument (* _ Blank[ ] *)
x__	jeden a více argumentů
x___	žádný nebo více argumentů

Pri vyvolani procedury se nejdrive vyhodnoti argument. Nevyhovuje-li predepsanemu vzoru (v nasem pripade dvojite __ znamena jeden a vice argumentu), procedura se vubec nespusti. Viz priklad nize hj2[].

Clear[hj2];
hj2[x__]:=
Which[Length[{x}]==0,Print[x,"     No arguments"],
	  Length[{x}]==1,Print[x,"    Just one argument"],
          Length[{x}]>1,Print[{x},"   More than one argument so that ","\nThe sum of the elements = ",Total[{x}]];Return[]	]
{hj2[],hj2[{}],hj2[3],hj2[{1,2,3}],hj2[1,2,34,5,6],hj2[{1,2},{3,4,5}]}

Vysvetlivky

{Length[{}],Length[{{}}],Length[{1,2,3}],Length[{{1,2,3}}],Length[{{1,2},{3,4,5}}]}

Clear[hj3];
hj3[x___ (* žádný nebo více argumentů *)]:=
Which[Length[{x}]==0,Print[x,"     No arguments"],
	  Length[{x}]==1,Print[x,"    Just one argument"],
          Length[{x}]>1,Print[{x},"   More than one argument so that ","\nThe sum of the elements = ",Total[{x}]]		]
{hj3[],hj3[{}],hj3[3],hj3[{1,2,3}],hj3[1,2,34,5,6],hj3[{1,2},{3,4,5}]}(* ; *)

Místo Print je v následujícím příkladě výstupem seznam (List): { ... }, v posledním případě řetězec; podrobně prostudujte za cvičení. Aby fungovala funkce Total, je aplikována funkce Flatten.

StringJoin

(retezec1="abcd"<>"ABCD"<>"xyz")//FullForm
retezec2=StringJoin["abcd","ABCD","xyz"]
retezec1==retezec2

"\n"

Hyperlink[Button["Strings and Characters"], 
    "paclet:tutorial/StringsAndCharactersOverview"]

Clear[hj1];
hj1[x___]:=
Which[Length[{x}]==0,{x,"     No arguments"},
	  Length[{x}]==1,{x,"    Just one argument"},
          Length[{x}]>1,"\n"<>ToString[{x}]<>":   More than one argument so that "<>"the sum of the elements = " <>ToString[Total[{x}//Flatten]]]
{hj1[],hj1[3],hj1[{1,2,3}],hj1[1,2,34,5,6],hj1[{1,2},{3,4,5}]}

hj1[{1,2}⋂{3,4}]

**Další vymoženosti

Použití Option Inspector (Menu Format)

Cas vypoctu vlevo dole: Format ⟶ Global Preferences ⟶  Notebook Options ⟶ Evaluation Options ⟶ EvaluationCompletionAction

SeedRandom[13]; (* Zaručuje reprodukovatelnost *)
tabmilion=Table[Random[],{1000000}];
Sort[tabmilion];//Timing
{Mean[tabmilion],Variance[tabmilion]}
%-{(1/2),(1/12)}

Jednoduche otevirani a zavirani odstavcu, sekci, ... (^ vlevo od nadpisu) :  Format ⟶ OptionInspector ⟶  Global Preferences ⟶  Cell Options ⟶ Display Options ⟶ ShowGroupOpener

Integrated Data Sources

?*Data

ExampleData[]
ExampleData["Text"]

Short[ExampleData[{"Text","OriginOfSpecies"}],20]
ExampleData[{"Text","OriginOfSpecies"}]//Short[#,20]&

ExampleData[{"Text","UNHumanRightsChinese"}]

FinancialData["EUR/CZK"]

(* Zlato *) FinancialData[{"XAU","CZK"}]

Dynamic[Refresh[FinancialData["EUR/CZK","LatestTrade"],UpdateInterval->1]]

(* Dynamic[Refresh[FinancialData["USD/CZK","LatestTrade"],UpdateInterval->1]]
Dynamic[Refresh[FinancialData["EUR/CZK","LatestTrade"],UpdateInterval->1]] *)

FinancialData[]

Ekonomicka a jina data

CountryData[]

CountryData["Properties"]

{CountryData["CzechRepublic","GiniIndex"],CountryData["CzechRepublic","AdultPopulation"]}

CountryData["CZ","Flag"]

?*Data

Konec 2016-10-25

2016-11-01 Lekce 5

FAQ

Doplněn příklad zpracování externího souboru v úvodu minulé lekce:

Dotazy

Speak["Are there any questions?"]
Speak["Jsou nejake dotazy?"]

Date[]//ToString

Row[{Button["Dotazy",Print[Text[Style["\nPrávě teď "<>ToString[Date[]]<>" očekávám dotazy.\n",Red,30]]]],Button["Animate",ListAnimate[Table[Text[Style["???  Zase je všechno jasné?",Blue,i]],{i,10,50}]]//Print],Button["OK",Print[Text[Style["Tak to je dobře ...",Red,30]]]]},"  "]

Dotaz 1

Dotaz 2

Dotaz 3

Vnitřní struktura systému Mathematica a jeho jazyk 1

Výrazy (Expressions)

Všechno v systému Mathematica je výraz. Každý výraz má hlavičku (Head): Hlavička je část výrazu s indexem nula.

{Head[7],Head[(1/7)],Head[7.0],Head[2+I],Head[π],Head[Pi],Head["haf"]}
{7[[0]],(1/7)[[0]],"atd."[[0]]}

Někdy užitečný vlastní zápis zabudované funkce.

h=Head;
{h[f],h[Integrate],h[π],h[EulerGamma],h[EulerGamma//N],h[hj2]}

h["Toto je retezec."]

?h

Clear[a,b,c];
FullForm[a+b+c]

{Head[{a,b,c}],FullForm[{a,b,c}]}

Length[{a,b,c}]
{Transpose[{{a,b,c}}],Transpose[{{a,b,c}}]//MatrixForm}
{Length[{{a,b,c}}],Length[Transpose[{{a,b,c}}]]}
{Dimensions[{{a,b,c}}],Dimensions[Transpose[{{a,b,c}}].{{a,b,c}}]}
Length[a+b+c]
Length["Toto je retezec."]

Záludnosti:

aa=1;
{Dimensions[aa],Length[aa]}

aa={1,2};bb={{2},{1}};cc="String";
{Dimensions[aa],Dimensions[bb],Dimensions[cc]}
{Length[aa],Length[bb],Length[cc]}

Clear[a,b,c,x];
expr=Sin[x](a (x^2)+b x +c)
Head[expr]
FullForm[expr]
TreeForm[FullForm[expr]]

soucet=aa+b
FullForm[soucet]
{Part[soucet,0],Part[soucet,1],Part[soucet,2],Part[soucet,3]}
(* V tomto případě je chybová hláška dříve než výstup *)
{soucet[[0]],soucet[[1]],soucet[[2]],soucet[[3]]}

TreeForm[soucet]

Rozdil mezi [ ] a [[ ]] (argument funkce a část výrazu)

Clear[aa,a];
aa=Table[a[i],{i,-4,4}]
{aa[[0]],aa[[5]],aa[[5]]}
{a[0],a[5]}

{1,4,7}[[2]]

Pozor na stejně vypadající výstup symbolů a řetězců!!!

{"a",a,"3",3}
{"a",a,"3",3}//FullForm
"a"+a
{ToExpression["a"]+a,"3"+3,ToExpression["3"]+3}

{"Co dostanu teď?"//Length,Length[π],Length[{π}],Dimensions[{{{π}}}]}
"Co dostanu teď?" (* Nejsou zobrazeny uvozovky *)
FullForm["Co dostanu teď?"]
Head["Co dostanu teď?"]
{"Co dostanu teď?"[[0]],"Co dostanu teď?"[[1]],π[[1]],{π}[[1]],{{{π}}}[[1,1,1]],{{{π}}}[[1]][[1]][[1]],{{{π}}}//First//First//First}
Characters["Co dostanu teď?"]
Length[%]
StringJoin[%%]

expr//Length

Table[{j,expr[[j]]},{j,0,3}]//TableForm

{expr[[0]],expr[[1]],expr[[2]],expr[[1,3]],expr[[1,3,2]],expr[[1,3,2,2]]}

Definice, náhodná čísla, histogram

Okamžité a odložené přiřazení (globální pravidlo, immediate and delayed assignment): “=” a “:=”

Příklad 1

SeedRandom[13] 
(* Startuje generátor náhodných čísel vždy ze stejné hodnoty. Velmi důležité pro reprodukovatelnost výsledků založených na simulacích. *)
r1=Random[]
SeedRandom[13]
r2:=Random[]

{r1,r1,r1}
{r2,r2,r2}
SeedRandom[13]
{Random[],Random[],Random[]}
{r2,r2,r2}

SeedRandom[13]
Table[Random[],{6}]

?r1

?r2

Příklad 2

Úvodní poznámka:

k[x_?Positive]:=Log[x]
{k[2],k[2.],k[-2]}

Clear[fdelayed,fimmediate,a]
fdelayed[a_?Positive]:=(∫_0^∞)Log[a x] Exp[-(x^2)]\[DifferentialD]x
(fimmediate[a_?Positive]=Integrate[Log[a x]Exp[-(x^2)],{x,0,∞}])//Timing

{fdelayed[2]//Timing,fimmediate[2]//Timing,fimmediate[2]//Simplify//Timing}

Náhodná čísla z jiných rozdělení

NormalDistribution[ ] je N(0,1). NormalDistribution[μ, σ] je N(μ,(σ^2))!!! Ve Wolfram Language je druhým argumentem směrodatná odchylka!!!

?*Distribution

SeedRandom[13]
Histogram[RandomVariate[NormalDistribution[],{1000}]]

SeedRandom[13]
Histogram[RandomVariate[NormalDistribution[],{1000 }](* počet generovaných náhodných čísel *),
Automatic,"PDF" (* hustota, Probability Density Function *),
Epilog->First@Plot[PDF[NormalDistribution[0,1],x],{x,-4,4},PlotStyle->Red]]
(* to lze najít v Helpu *)

nebo také

SeedRandom[13]
Show[Histogram[RandomVariate[NormalDistribution[],1000],Automatic,"PDF"],Plot[PDF[NormalDistribution[0,1],x],{x,-4,4},PlotStyle->Red]]

SeedRandom[13]
Histogram[RandomVariate[NormalDistribution[],1000]]

(* Náhodná matice 2x10 *) RandomVariate[NormalDistribution[],{2,10}]

SeedRandom[13]
 Map[Histogram[#,Automatic,"PDF"]&,RandomVariate[NormalDistribution[],{6,10000}]]

Nahodna cisla z diskretniho rovnomerneho rozdeleni

SeedRandom[13]
Histogram[Table[RandomVariate[DiscreteUniformDistribution[{100,999}]],{9000}]]

Funkce definované po částech, Exclusions, Evaluate, porovnávání, periodické funkce

Příklady funkcí definovaných po částech

Clear[g];
g[x_]:=(x^3)/;(*za podminky *)x≤0
g[x_]:=x/;0<x≤1
g[x_]:=Sin[x]/;x>1
GraphicsRow@{Plot[g[x],{x,-1,2},PlotStyle->Thick],Plot[g[x],{x,-1,2},PlotStyle->Thick,Exclusions->{x==1}
(* Nevykresli svislou caru v bode x=1. 
V novějších verzích ji již nevykreslí automaticky.(?) Naopak, chceme-li svislé čáry vykreslit, musíme použít volbu Exclusions -> None *)]}

(**)Clear[g1];
g1[x_]:=Piecewise[{
{(x^3),x≤0},
{x,0<x<1},
{Sin[x],x≥ 1}
				}]
Plot[g1[x],{x,-1,2},Exclusions->{x==1},PlotTheme->"Detailed"]

Konstrukce, kterou vřele doporučuji:

Clear[g2]; 
g2[x_]:=Which[x<0,(x^3),
			0≤x<1,x,
			x≥1,Sin[x]
			]
{g2[1],g2[I]}
Plot[g2[x],{x,-1,2},Exclusions->{x==1},PlotTheme->"Classic",PlotStyle->Thick]

Clear[g2i]; 
(* Přípustný argument je pouze typu Real, tj. s hlavičkou Real *)
g2i[x_Real]:=Which[x<0,(x^3),
			0≤x<1,x,
			True,Sin[x]
			]
{g2i[1.],g2i[3.5π],g2i[(7/2)π],g2i[1],g2i[I]}

protože

{1.[[0]],1[[0]]}

Derivace g,2(x):

D[g2[x],x]

Parcialni derivace funkce dvou promennych (trikrat podle x, petkrat podle y)

derivacestrasnehovyrazu=D[strasnyvyraz=Sin[(x^3)+Cos[(Sqrt[y])]]Exp[Tanh[x+y]],{x,3},{y,5}]

Plot3D[derivacestrasnehovyrazu,{x,0.5,1.5},{y,0.5,1.5}]

Odstraneni barvy plochy mimo zobrazovany rozsah (Clipping)

Plot3D[derivacestrasnehovyrazu,{x,0.5,1.5},{y,0.5,1.5},ClippingStyle->None]

Plot3D[derivacestrasnehovyrazu,{x,0.5,1.5},{y,0.5,1.5},PlotRange->All]

Graf derivace (použití funkce Evaluate, hodí se i v jiných situacích):

Plot[D[g2[x],x],{x,-1,2}]

*** Zde je videt jista zaludnost systemu: bez aplikace funkce Evaluate se funkce nezobrazi a objevi se chybova zprava. Viz Help k funkci Evaluate. Souvisi to s atributy funkce Plot HoldAll). Prilis to nemusite studovat, spokojte se s tim, ze kdyz se nektera funkce nechce zobrazit, aplikujte na ni Evaluate.

(***) Attributes[Plot]

Nyni jiz funguje :

Plot[D[g2[x],x]//Evaluate,{x,-1,2},PlotTheme->"Business"]

Další možností je definovat derivaci jako funkci (pozor, musí být s okamžitým přiřazením!) a tu pak graficky znázornit:

Clear[derivaceg2]
derivaceg2[x_]=D[g2[x],x]
Plot[derivaceg2[x],{x,-1,2},AspectRatio->1(* Zaruci stejne meritko na obou osach. *)]

U nasledujicich definici si vsimnete rozdilu mezi vyvolanim s potlacenym vystupem ( ; ) a bez nej. g3 totiž nemá vlastní výstup, a jejím výstupem je tedy “Null”. Print je mezivýstupem!

Clear[g3];
g3[x_]:=Which[2≤x≤3,Print[Style["Haf",Blue,Italic,24]],
			  True,Print[Style["Haf, Haf",Red,Bold,24]]]
{g3[0],g3[2.5]};

{g3[0],g3[2.5]}

Ale (O symbolu a nic nevíme):

Clear[a];
g3[a]

Priklad, kdy vyloucene body jsou zadane podminkou:

GraphicsRow@{Plot[Tan[x],{x,-3,3},Exclusions->None],Plot[Tan[x],{x,-3,3},Exclusions->{Cos[x]==0}]}

Porovnávání (je levá strana rovna pravé straně?)

Clear[x,y,a,b];
{x==y (* Equal *),x===y(* doslovne porovnani, SameQ *),x===x}
{2==2.,2===2.}
{Exp[x]==0,Exp[-∞],2+1===3,Exp[-∞]==0,Exp[-∞]===0}

Poslední výsledek může vypadat překvapivě, ale musíme si uvědomit, že nejprve se provede vyhodnocení výrazů na obou stranách a teprve potom se porovnávají.

{2<5,5<2,a<3,a==b,a===b,a==a,a===a}

Příklad

Uziti Simplify pripadne FullSimplify

Clear[x]
int1=Integrate[e1=((1+(x^4))/(1+(x^3))),x]

{D[int1,x],D[int1,x]//Simplify}

{e1==x+(2/(3 (1+x)))-((-1+2 x)/(3 (1-x+(x^2)))),e1===x+(2/(3 (1+x)))-((-1+2 x)/(3 (1-x+(x^2))))}

e1==x+(2/(3 (1+x)))-((-1+2 x)/(3 (1-x+(x^2))))//Simplify

1+1/GoldenRatio-GoldenRatio
1+1/GoldenRatio-GoldenRatio==0
1+1/GoldenRatio-GoldenRatio=== 0
((1+1/GoldenRatio-GoldenRatio)//Simplify)===0

Definice periodických funkcí (použití funkce Mod, zbytek po dělení)

Periodicke rozsireni funkce f(x)=x-1 pro 0≤x<1 a f(x)=(((x-1))^4) pro 1≤x≤2 na celou primku

Použijeme funkce Mod a Thread (provléknutí)

{Mod[1.5,2],Mod[2.5,2]}

Thread[x==2Range[-10,10]]

Clear[g4];
g4[x_]:=Mod[x,2]-1/;0≤Mod[x,2]<1
g4[x_]:=(((Mod[x,2]-1))^4)/;1≤Mod[x,2]≤2
Plot[g4[x],{x,-10,10},Exclusions-> Thread[x==2Range[-10,10]],PlotTheme->"Detailed"]

Alternativní definice:

Clear[g4a];
g4a[x_]:=Which[0≤Mod[x,2]<1,Mod[x,2]-1,
		               1≤Mod[x,2]≤2,(((Mod[x,2]-1))^4)]
Plot[g4a[x],{x,-10,10},Exclusions->None, PlotTheme->"Detailed"]

nebo také můžeme použít univerzálnější konstrukci  (podrobně prostudujte):

Reduce[(Mod[x,2]==0)∧(-10≤x≤10),x]

Reduce[(Mod[x,2]==0)∧(-10≤x≤10),x]//ToRules

x/.{(Reduce[(Mod[x,2]==0)∧(-10≤x≤10),x]//ToRules)}
exclusions=Thread[x==%]

Plot[g4[x],{x,-10,10},Exclusions->exclusions,PlotTheme->"Scientific"]

Solve[Cos[x]==0,x]
Reduce[Cos[x]==0,x]

Konec 2016-11-01

2016-11-08 Lekce 6 odpadá, děkanský den

2016-11-15 Lesson 7

FAQ

AlarmClock

Hyperlink[Button["Budík"],"http://demonstrations.wolfram.com/AlarmClock/"]

ArrayPlot

ArrayPlot[{(1/4)(Range[5]-1),{1,0,1,0,2},{Green, Pink, Red,Yellow,Magenta}}]

QuantityMagnitude

QuantityMagnitude

{Quantity[3.4 ,"Meters"],4 Quantity[3.4 ,"Meters"],Quantity[5 ,"Meters"] ((Quantity[2 ,"Seconds"])^2)}

?*Quantity*

{QuantityMagnitude[(Quantity[3.4, "m", meters, "Meters"])]//FullForm,Quantity[(Quantity[3.4, "m", meters, "Meters"])]//FullForm}

FormulaData[]

FormulaData["CircleArea"]

Vnitřní struktura systému Mathematica a jeho jazyk 2

Predikáty, vzory a booleovské operace

Predikáty (predicates)

Viz též (připomenutí)

Hyperlink[Button["Predikáty (predicates) a vzory (patterns)"],"http://www.karlin.mff.cuni.cz/~slavik/math_ls_2015_16/ulohy_7.pdf"]

Dává odpověď True nebo False. Zabudované predikáty:

?*Q

{PrimeQ[144],NextPrime[10000000],PrimeQ[NextPrime[10000000]]}

{OddQ[21],EvenQ[21]}

IntegerQ[5/9]

{NumberQ[π],NumberQ[∞],NumberQ[5/9],NumberQ[1+4.5I]}

{NumericQ[π],NumericQ[∞],NumericQ[5/9],NumericQ[1+4.5I]}

{AtomQ["asbhjo \\[Wolf]\\. n"],Length["asbhjo \\[Wolf]\\. n"]}
"asbhjo \\🐺\\. n"

"asbhjo \\🐺\\. n"

{ListQ[{a,{b,c}}],VectorQ[{a,{b,c}}],MatrixQ[{a,{b,c}}],MatrixQ[{{a,b},{b,c}}]}

Příklad

Je Hilbertova matice positivně definitní?

(* V přesné aritmetice *)
PositiveDefiniteMatrixQ[HilbertMatrix[20]]
HilbertMatrix[20]//Det//N
Text@Grid[Table[{j,PositiveDefiniteMatrixQ[HilbertMatrix[j]]},{j,10,20}]//Transpose,Frame->All]

ale

(* v reálné aritmetice *)Text@Grid[Table[{j,PositiveDefiniteMatrixQ[HilbertMatrix[j]//N]},{j,10,20}]//Transpose,Frame->All]

Determinanty:

Text@Grid[Table[{j,HilbertMatrix[j]//N//Det},{j,10,20}],Frame->All]

Další predikáty

MemberQ[{a,b,c},b]

(***)IntervalMemberQ[Interval[{3,4}],π]

(***)
?Interval*

(***)IntervalMemberQ[Interval[{1,1}],1]
Complement[Interval[{1,2}],Interval[{1,1}]]

Predikaty jsou take <, >, <=, >=, == ,!= ,≠.

Vzory, předlohy (patterns)

_  vzor jednoho libovolneho vyrazu v systemu Mathematica 
_h vzor  jednoho libovolneho vyrazu v systemu Mathematica s hlavickou h
__  vzor posloupnosti jednoho nebo vice libovolnych vyrazu v systemu Mathematica oddelenych carkami
__h vzor posloupnosti jednoho nebo vice libovolnych vyrazu v systemu Mathematica  s hlavickou h oddelenych carkami
___  vzor posloupnosti zadneho nebo vice libovolnych vyrazu v systemu Mathematica oddelenych carkami
___h vzor posloupnosti zadneho nebo vice libovolnych vyrazu v systemu Mathematica  s hlavickou h oddelenych carkami

MatchQ[x,y]: Odpovídá x vzoru y? Vyhovuje x předloze y?

{MatchQ[12345,_],MatchQ[12345,__],MatchQ[12345,___]}

{MatchQ[12345,_Integer],MatchQ[12345.,_Integer]}

FullForm[a+b]

{MatchQ[Plus[a,],Plus[_,___]],MatchQ[Plus[a],Plus[_,___]],MatchQ[Plus[a,b,c],Plus[_,_]],MatchQ[Plus[a,b,c],Plus[_,__]],MatchQ[Plus[a],Plus[___]],MatchQ[Plus[],Plus[___]]}

Matching

MatchQ[(x-1)(1 + 2 x + 3 x^2),Plus[_,__]]
(x-1)(1 + 2 x + 3 x^2)//FullForm

MatchQ[Expand[(x-1)(1 + 2 x + 3 x^2)],Plus[_,__]]
Expand[(x-1)(1 + 2 x + 3 x^2)]//TraditionalForm
Expand[(x-1)(1 + 2 x + 3 x^2)]//FullForm

{MatchQ[1+1,Plus[_,_]],
MatchQ[HoldForm[1+1],Plus[_,_]],MatchQ[HoldForm[1+1],HoldForm[Plus[_,_]]]}

(* GoldenRatio - česky "Zlatý řez" *)
FunctionExpand[GoldenRatio]
MatchQ[1+1/GoldenRatio-GoldenRatio,0]

(* Instruktivní chyba *) Simplify[1+1/GoldenRatio-GoldenRatio]MatchQ[Simplify[1+1/GoldenRatio-GoldenRatio],0]

(* Instruktivní chyba *) {Simplify[1+1/GoldenRatio-GoldenRatio],
MatchQ[Simplify[1+1/GoldenRatio-GoldenRatio],0]}

(* Důležité: *)
Clear[z,x]
Grid[Table[{(z^i),MatchQ[(z^i),((x_)^(y_))]},{i,0,3}],Frame->True]

(* Důvod *)
Grid[Table[{(z^i),FullForm[(z^i)]},{i,0,3}],Frame->True]

(* Funkce _. Default *)  
MatchQ[z,((x_)^(y_.))]

Grid[Table[{(z^i),MatchQ[(z^i),((x_)^(y_.))]},{i,0,3}],Frame->True]

{MatchQ[(z^2),((_)^(_))],MatchQ[(z^2),((x_)^(x_))],MatchQ[(z^z),((x_)^(x_))]}

Vzory (patterns) pokračování

x_, x__, x___, x_Head

Clear[f];f[x_]:=(x^2)
{f[a],f[{a,b}],f[a,b]}

Clear[f1];f1[x_List]:=(x^2)
hodnoty1={f1[a],f1[{a}],f1[{a,b}],f1[{b,a}]}

Clear[katerina];katerina[x__List]:=(x^2)
hodnotyKaterina={katerina[a],katerina[{a}],katerina[{a,b}],katerina[{a,b},{c,d}],katerina[{b,a},{a,b,c}]}

Cvičení. Definujte funkci katerina2 tak, aby katerina2[{a,b},{c,d}]->{(a^2),(b^2)},{(c^2),(d^2)}.

Chceme vypreparovat vyrazy s (a^2):

Dulezite priklady!!!!

(* Seznamy, které mají na prvním místě výraz (a^2) *)
hodnoty1
Cases[hodnoty1,{(a^2),___}]
(* Seznamy, které mají výraz (a^2) kdekoli *)Cases[hodnoty1,{___,(a^2),___}]

hodnotyKaterina
Cases[hodnotyKaterina,{___,(a^2),___}]
Cases[hodnotyKaterina,{___,(a^2),___},Infinity]

Připomeňme

{hodnoty1[[2]],hodnoty1[[2]][[1]],Part[hodnoty1,2]//First,Most[hodnoty1]//Last//First}
{Take[hodnoty1,{2}],Take[hodnoty1,{2}]//First//First}
Flatten[{a,{b,{c,{d,f,g,h,{g}}}}}]
Flatten[Take[hodnoty1,{2}]][[1]]

{{(a^2)}}[[1,1]]

Implicitní nastavení hodnoty argumentu:

(* Funkce : Optional *)

Clear[f2];f2[x_:1]:=2x
{f2[3],f2[]}

FindRoot a (pripadne) odlisna reseni pro ruzna pocatecni reseni:

Clear[f3];
f3[f_,x0_:1]:=FindRoot[f[y]==y,{y,x0}]
Row@{f3[Sin,2],"   ",f3[Sin],"\n",f3[Cos]," To je ekvivalentni s: ",FindRoot[Cos[x]==x,{x,1}],"\n",f3[Log[#]+1&]," To je ekvivalentni s: ",f3[Function[x,Log[x]+1]]}

Vyhodnocení postfixového a prefixového zápisu funkcí

Vyhodnocení je zleva doprava.

Clear[h]
Sin@(π/4)//h

Příklad

Solve[(x^2)+3x-5==0,x]//N

Různé počáteční hodnoty:

Text@Grid[(koreny=Table[{j,FindRoot[(x^2)+3x-5==0,{x,j}]},{j,-6,5}]),Alignment->Right,Frame->True]

koreny
koreny[[All,2]]

x/.koreny[[All,2]]

Select[x/.koreny[[All,2]],#<0&]
Select[x/.koreny[[All,2]],#<0&]//Union

Kopie předchozí dvojice

{-4.192582403567252`,-4.192582403567251`}

Vetší přesnost:

(**)Grid[(koreny20=Table[{j,FindRoot[(x^2)+3x-5==0,{x,j},AccuracyGoal->20,WorkingPrecision->20]},{j,-6,5}]),Alignment->Right,Frame->True]
(x/.koreny20[[All,2]])//Union

Kopie:

{-4.19258240356725201570143809246500256941`20.,-4.19258240356725201562542425867149882959`20.,-4.1925824035672520156253552460322510649`20.,-4.19258240356725201562535524577016483947`20.,-4.19258240356725201562535524577016477817`20.,1.19258240356725201562535524577016477817`20.,1.19258240356725201562535524577016480724`20.,1.19258240356725201562535524577936748855`20.,1.1925824035672520156253552460322510649`20.,1.1925824035672520156253569500848584894`20.,1.19258240356725201562542425867149882959`20.,1.19258240356725201570143809246500256941`20.}

(**)Grid[(koreny80=Table[{j,FindRoot[(x^2)+3x-5==0,{x,j},WorkingPrecision->80]},{j,-6,5}]),Alignment->Right,Frame->True]

(x/.koreny80[[All,2]])//Union

Booleovské funkce a logické operace

7<5

{Equal[3,7-4,6/2],3==7-4==6/2}
HoldForm[3==7-4==6/2]//FullForm

Nekdy je nutne pouzit funkci Simplify:

{ (((x^4)-1)/((x^2)+1))//Simplify,equal=((x^2)-1== (((x^4)-1)/((x^2)+1))),equal//Simplify}

Tan[z]==((Sin[z])/(Cos[z]))

Reduce[(x^2)-1== (((x^4)-1)/((x^2)+1)),x]

reseni2=Solve[(x^2)+1==0,x]

Cvičení: Prohlédněte Help Reduce

{(x^2)-1,(((x^4)-1)/((x^2)+1))}/.{x->-I}

6≠5

{6≠12/2,Unequal[6,12/2]}

Doslovne (literal) porovnani (===)

Logické spojky

{p||q,p&&q,!p}
(* ekvivalentne *)
{p∨q,p∧q,¬p}
{p∨q,p∧q,¬p}//TraditionalForm

{3<5||5<3,3<5&&5<3,!(3<5)}
{3<5∨5<3,3<5∧5<3,¬(3<5)}

**Pravdivostní tabulka (Truth Table (Example of Distribute and a Table) (Detailní prostudování je dosti obtížné cvičení)

TruthTable[vars_List,expr_]:=Distribute[Table[{True,False},{Length[vars]}],List,List,List,{##,Function[vars,expr][##]}&]
DisplayTruthTable[vars_List,expr_]:=With[{t=ReplaceAll[TruthTable[vars,expr],{True->"T",False->"F"}]},Grid[Prepend[t,Append[vars,expr]],GridFrame->True,RowLines->Prepend[Table[0,{Length[t]-1}],2],ColumnLines->Append[Table[0,{Length[vars]-1}],2]]]

Sestrojte pravdivostni tabulku vyrazu (A∨B)⟹C

Proč svítí C černě? Je to v této seanci známý symbol:

?C

DisplayTruthTable[{A,B,C},Implies[Or[A,B],C]]

DisplayTruthTable[{A,B,C,D},Implies[Or[A,B],Or[C,D]]]

DisplayTruthTable[{A,B,C,D},Implies[(A∨B),(C∨D)]]

DisplayTruthTable[{A,B},A∧B]

DisplayTruthTable[{A,B},Xor[A,B]]

*Atributy, zvláště atribut Listable

Attributes[Plus]

Plus[{a,b},{c,d}]

Plus[Plus[a,b]]//FullForm

Attributes[Sin]

Range[10]

Sin[{1,2,3}]
Sin[(π/4)(Range[10]-1)]

Remove[druhemocniny];
druhemocniny[x_]:=(x^2)+Length[x]
druhemocniny[Range[3]]
{Map[druhemocniny,Range[3]] (* to je totez jako *),Table[druhemocniny[i],{i,3}]}
{Length[3],druhemocniny[3]}
Attributes[druhemocniny]
SetAttributes[druhemocniny,Listable]
Attributes[druhemocniny]
druhemocniny[Range[3]]

Vysvetleni:

?druhemocniny

Length[1]

Clear[f6];
f6[x_]:=Sin[x].Cos[x]

{f6[{1,2}],f6[{{1,2}}]}

(***)
Remove[plus];
plus[a,plus[b,c]]
SetAttributes[plus,Flat]
plus[a,plus[c,b]]
SetAttributes[plus,Orderless]
plus[a,plus[c,b]]

?IntegerQ

?Positive

Attributes[IntegerQ]

Rozdíl mezi Clear a Remove

x=2;
?x
Clear[x]
?x

x=2;
?x
Remove[x]
?x

Funkce koncici na Q daji vzdy odpoved True nebo False.

Attributes[IntegerQ]

{IntegerQ[-3],IntegerQ[a]}
IntegerQ[{-3,a}]

Attributes[Positive]

Positive[{5,a,-5}]

IntegerQ[{1,2,3}]

Tuto funkci ucinime listovatelnou:

Remove[integerQ];
integerQ[x_]:=IntegerQ[x]
integerQ[{1,2.5,3}]
SetAttributes[integerQ,Listable]
integerQ[{1,2.5,3}]

Pozor, Clear nezrusi atributy u symbolu integerQ!!! Nejjednodussi je uplne odstraneni symbolu pomoci Remove.

Clear[integerQ];
?integerQ

Attributes[IntegerQ]

Rozdil mezi Remove a ClearAll: Remove odstrani symbol z globalniho kontextu uplne a ClearAll odstranuje nejenom hodnoty, ale i atributy, zpravy, ...

ClearAll[integerQ]
?integerQ
Remove[integerQ]
?integerQ

Ryzí, anonymní funkce,  (Pure functions)

Hyperlink[Button["Ryzí (anonymní) funkce (pure functions, λ-functions)"],"http://www.karlin.mff.cuni.cz/~slavik/math_ls_2015_16/ulohy_8.pdf"]

Prohlédněte si též odpovídající *.nb. Tam je více podrobností a vysvětlivek.

Anonymní funkce nejsou svázány s identifikátorem. V symbolické logice též λ-funkce.

Ryzí funkce ma formu Function[proměnná, předpis]. Podivejte se též na Help. Druhá mocnina:

Function[x,(x^2)]

f=Function[x,(x^2)]
{f[x],f[3],f[I],f[y]}
{Function[x,(x^2)][x],Function[x,(x^2)][3],Function[x,(x^2)][I],Function[x,(x^2)][y]}

Alternativní zápisy (šipka pomocí \[Function,] nebo EscfnEsc, pozor, ta šipka na paletě je jiná!!!)

x|->(x^2)

{(x|->(x^2)) [x],(x|->(x^2))[3],(x|->(x^2))[I],(x|->(x^2))[y]}

V úsporném zápise   # značí proměnnou ryzí funkce a & značí ryzí funkci. Na symbol & se nesmí zapomenout!!! Ekvivalentni zapis druhe mocniny

((#)^2)&

{((#)^2)&[x],((#)^2)&[3],((#)^2)&[I],((#)^2)&[y]}

Dvě proměnné v anonymní funkci se zadávají ve formě seznamu:

{Function[{x,y},x+y][cc,bbbb],Function[#1+#2][cc,bbbb],
(#1+#2)&[cc,bbbb],({x,y}|->x+y)[cc,bbbb]}

Další příklady

Function[x,x.x][{aa,bb,cc}]

Function[x,x.x][q]
Function[x,x.x][{q}]
Function[x,x.x][(({{a, b, c}, {d, e, f}, {g, h, i}}))]//MatrixForm
Function[x,x.x][(({{a, b, c}, {d, e, f[g]}, {g, h, i}}))]

Zrušení chybové hlášky (error message)

(({{a, b, c}, {a1, a2, a3}, {d, e, ff}, {g, h, i}})).(({{a, b, c}, {a1, a2, a3}, {d, e, ff}, {g, h, i}}))

Off[Dot::"dotsh"]
(({{a, b, c}, {a1, a2, a3}, {d, e, ff}, {g, h, i}})).(({{a, b, c}, {a1, a2, a3}, {d, e, ff}, {g, h, i}}))
On[Dot::"dotsh"]

Nebo také:

(({{a, b, c}, {a1, a2, a3}, {d, e, ff}, {g, h, i}})).(({{a, b, c}, {a1, a2, a3}, {d, e, ff}, {g, h, i}}))//Quiet

Konec 2016-11-15

2016-11-22 Lesson 8

FAQ

Základy funkcionálního přístupu

Zásady

Elementární princip: není zapotřebí znát rozměry objektů, jejich charakter (všechno v systému Mathematica jsou výrazy (expressions)), seznamy se neprozkoumávají sekvenčně jako v procedurálním programování, ale hledí se na ně jako na objekty.

Functional programming means programming by using functions as the arguments of the other functions.

Složené výrazy (Coumpound expressions)

Výrazy oddělené středníkem, výstupem je poslední výraz. Použití v případě, že kod není možné “přehledně” napsat na jeden řádek. Tato konstrukce se však více používá v dále uvedených složitějších konstrukcích (modulech).

x=2;y=6;x+y
Clear[x,y]
{x,y}

Module (lokalizace proměnných, prirazeni globalnim promennym)

Module je základní konstrukce pro uživatelem definované složitější funkce a procedury. Pokud nejsou v modulu požadovány mezivýstupy (např, příkazem Print), je výstupem modulu poslední příkaz složeného příkazu. Tím může být cokoli, jedno číslo, vektor řešení soustavy rovnic, graf, databáze, kombinace všeho předchozího.

Funkce Module (případně Block) má dva argumenty: seznam lokálních (vnitřních) proměnných modulu s případně přiřazenými počátečními hodnotami a složeným příkazem:

x=6789;y=8888;
(* Oba následující moduly jsou ve svém důsledku ekvivalentní. *)
{Module[{x=5,y=a},x+y],Module[{x,y},x=5;y=a; x+y]}
{x,y}

?Global`*

Posledním výrazem v níže definovaném modulu je seznam o třech prvcích {Sin[x],Cos[y],graf obou funkcí} a ten je také výstupem:

Clear[f];
f[x_,y_]:=Module[{xsin,ycos,plot},
		xsin=Sin[x];			ycos=Cos[y];							    plot=Plot[{Sin[z],Cos[z]},{z,x,x+2π},PlotTheme->"Detailed"];
		{xsin,ycos,plot}]
f[1.,2]

Chceme-li pouze graf:

{xsin,ycos,plot}=f[2,3];
plot

nebo

f[2,3][[3]]

With (lokalizace proměnných, jednorázový výpočet)

With[{x=(Subscript[x, 0])},expr] specifies that all occurrences of the symbol x in expr should be replaced by (Subscript[x, 0]).

Clear[a]
x=5;y=π;
With[{x=7,y=a+1},x/y]

?x

With je rychlejší než Module, viz (hledej “faster” v Help funkce With):

Hyperlink["With","paclet:ref/With"]

{Timing[Do[Module[{x=5},x;],{10^5}]],Timing[Do[With[{x=5},x;],{10^5}]]}

Map, Apply, Thread (provlečení?, vlákno?)  (Obecný princip)

Map přeskočí hlavičku druhého argumentu a aplikuje první argument na to, co je za hlavičkou.
Apply vymění hlavičku druhého výrazu za první.

Clear[f,g,a,b,c];
Map[f,g[a,b,c]]
Apply[f,g[a,b,c]]

{a,b,c}//Head
(* Hlavička je List. *)
Map[Sin,{a,b,c}]
Apply[Plus,{a,b,c}]

Funkce Sin je “listovatelná” (viz Attributes[Sin]), takže tady stačí

Sin[{a,b,c}]

Ale

Attributes[NumberQ]
NumberQ[{1,2,3,b}]
Map[NumberQ,{1,2,3,b}]

Odpomoc je snadná. Uvedem dvě možnosti:

1. Zrušíme ochranu funkce NumberQ (Unprotect) a přidáme atribut Listable pomocí SetAttributes[NumberQ,Listable]. Vřele nedoporučuji. Wolfram dobře věděl, proč tam onen atribut nepřidal sám.

2. Definovat vlastní funkci numberQ (s malým n!):

Clear[numberQ];
numberQ[x_]:=NumberQ[x]
numberQ[{1,2,3,b}]
Map[numberQ,{1,2,3,b}]
SetAttributes[numberQ,Listable]
numberQ[{1,2,3,b}]
ClearAttributes[numberQ,Listable]
numberQ[{1,2,3,b}]

Obecně však přesto obecně doporučuji použít funkci Map.

{3+4+5//Head,Unevaluated[3+4+5]//Head,HoldForm[3+4+5]//Head}

Clear[a,b,c,d];
Apply[Times,a+b+c]
Apply[Times,3+4+5]
{Apply[Times,Unevaluated[3+4+5]],Apply[Times,HoldForm[3+4+5]]}
a=3;b=4;Apply[Times,a+b+c]
Clear[a,b];

a+b+c-d//FullForm
Apply[Times,a+b+c-d]

Thread[f[{a,b,c}]]

Clear[x,y,z];
Thread[f[{a,b,c},x]]

Thread[f[{a,b,c},{x,y,z}]]
Thread[f[{a,b,c},{x,y}]]

Vytvoří soustavu rovnic:

{a,b,c}=={x,y,z}
Thread[{a,b,c}=={x,y,z}]

Priklad

xx={x1,x2,x3};
aa=HilbertMatrix[3];
bb={2,3,4};
(soustava=Thread[aa.xx==bb])//MatrixForm
(* V tomto pripade funguje i bez Threa *)
(xx/.Solve[soustava,xx])
(xx/.Solve[soustava,xx])[[1]]
(xx/.Solve[soustava,xx])[[1,2]]

V této verzi (11.0.1) již použití Thread není nutné:

Solve[aa.xx==bb,xx]

Aplikuje funkci na obe strany rovnice:

Thread[Sin[x==y],Equal]

!!!Důležitá poznámka k Apply

{Plus[{a,b,c}],Plus[a,b,c]}

Clear[f,a,b,c];
{Apply[f,{a,b,c}],Apply[List,f[a,b,c]]}

První příkaz vytvoří ze seznamu posloupnost, druhý z posloupnosti seznam.

Apply[List,Plus[{a,b,c}]]
Plus[{a,b,c}]//FullForm

Apply[Plus,{a,b,c}]

Příklad (důležitý, nutnost použití Apply nebo Sequence)

Clear[f,a,b,c];
(* funkce tří proměnných: *)
f[x_,y_,z_]:=x+y+z

{f[{a,b,c}],f[a,b,c]}

V prvním případě nemůže fungovat, protože funkce f je definována jako funkce tří argumentů. Funkce Apply vymění hlavičku listu za hlavičku funkce:

Apply[f,{a,b,c}]

a,b,c je posloupnost argumentů, takže alternativní řešení je nahradit hlavičku seznamu hlavičkou posloupnost:

f[{a,b,c}]/.List->Sequence

Příklad (aritmetický průměr)

Příklad výpočtu aritmetického průměru s pojistkou na to, aby argument funkce byl vektor délky alespoň jedna. (Existuje ovšem zabudovaná funkce Mean.)

Clear[prumer];
prumer[x_]:=((Apply[Plus,x])/(Length[x]))/;VectorQ[x]&&Length[x]>0
{prumer[{a,b,c}],prumer[{{a},b,c}],prumer[a,b,c],prumer[2],prumer[{2}]}

Použití zabudované funkce Total (pozor na formu vstupu!!!):

{{{a}},b,c}//Total
{{{a}},b,c}//Total//Flatten
{{{a}},b,c}//Flatten//Total

{{{a}},b,c}//Total//Flatten//First
{{{a}},b,c}//Total//Flatten//Flatten
{{{a}},b,c}//Flatten

Grid[Map[{#,Attributes[#]}&,{Total,Plus}],Frame->All]

Total[{{a,d},b,c}]
Total[{{{a,d}},b,c}]

Plus[{{a,d},b,c}]
Plus[{{{a,d}},b,c}]

Clear[pr1];
pr1[data_]:=((Total[dt=data])/(Length[dt]))
pr1[{{{a,d}},b,c}]

Clear[pr2];
pr2[data_]:=((Total[dt=data//Flatten])/(Length[dt]))
{pr2[{{{a,d}},b,c}],pr2[],pr2[{}]}

Pozor!!!

Length[{{{a,d}},b,c}]
Dimensions[{{{a,d}},b,c}]

**Alternativně

prumerJH[x_?(VectorQ[#]&&Length[#]>0&)]:=((Apply[Plus,x])/(Length[x]))
{prumerJH[{a,b,c}],prumerJH[{{a},b,c}],prumerJH[a,b,c],prumerJH[2],prumerJH[{2}]}

Příklad (výpočet rozptylu)

Zabudovaná funkce Variance.

?prumer

rozptyl[x_?VectorQ]:=prumer[(((x-prumer[x]))^2)]
{rozptyl[Range[5]],rozptyl[{Range[5]}],rozptyl[{}]}

VectorQ[{}]

Clear[a,b,c,d,e]
ch5=CharacterRange["a","e"]
{prumer[ch5],prumer[{a,b,c,d,e}]}
%//FullForm

prumer[ch5]/.{"a"->1,"b"->2,c->3}

(* Analyzujte pomoci FullForm *)
{rozptyl[ch5],rozptyl[{a,b,c,d,e}]}//Simplify

(*(( ** )^( ** ))***){prumer[{3+I,2+5 I}],Mean[{3+I,2+5 I}]} 
{rozptyl[{3+I,2+5 I}],Variance[{3+I,2+5 I}]}

Seznamy (Lists) 1

Množinové operace

Clear[a,aa,b,c,e,f,g];
(* mnozinove sjednoceni: *)
Join[{b,c,a,aa},{d,e,f,e,a}]
(* Setřídí a odstraní duplicity: *)
Union[{b,c,a,aa},{d,e,f,e,a}]
(* Mnozinovy prunik (setřídí): *)
Intersection[{b,c,a,aa},{d,e,f,e,a,c}]

{b,c,a,aa}⋃{d,e,f,e,a}
{b,c,a,aa}⋂{d,e,f,e,a}
(* Mnozinovy doplnek *)
Complement[{a,b,c,d,e},{a,c},{d}]

Průnik bez setřídění (dulezite!!!)

Příklad (průnik bez setřídění, instruktivní)

Clear[a,b,c,d];
seznam1={a,a,c,c,b};
seznam2={d,d,c,c,b};
(* Prunik se setridenim *)
Intersection[seznam1,seznam2]

(* Průnik bez setřídění a bez odstraneni duplicit *)
Position[seznam1,c]
(* Na kterych pozicich se v seznamu 1 vyskytuji prvky seznamu 2? *)
pozice=Map[Position[seznam1,#]&,seznam2]
(***)pozice=Map[Position[seznam1,#]&,seznam2]//Flatten
(***)Map[seznam1[[#]]&,pozice]
(***)Map[seznam1[[#]]&,pozice]//DeleteDuplicates

Třídění

SeedRandom[23]
r8=RandomInteger[{-4,4},15]
Sort[r8] (* viz Help *)
Union[r8]

(* Trideni sestupne *)
Sort[r8,#1>#2&]
(* Ekvivalentne *)
Sort[r8,Greater]
(* Ekvivalentne *)
Reverse[Sort[r8]]

(* Trideni podle druhe slozky *)
Sort[r23={{a,2},{c,1},{d,3}},#1[[2]]<#2[[2]]&]
(* !!!Ekvivalentne *)
Map[Reverse,r23]
Sort[Map[Reverse,r23]]
Map[Reverse,Sort[Map[Reverse,r23]]]

!!!Cvičení. Všimněte si rozdílu mezi:

Map[Reverse,r23]//MatrixForm

a

Reverse[r23]//MatrixForm

Výběry prvků ze seznamu

r8={1,-4,-3,-3,-4,0,-1,3,2,2,0,-1,4,-1,-4};

Použití funkce Select (2. argument je kritérium, test)

Clear[x]
Map[Positive,{0,1,x}]

(* Ekvivalentní příkazy pro výběr prvků větších než  0 *)
{Select[r8,Positive],Select[r8,#>0&],Select[r8,Function[x,x>0]]}

Všechny prvky větší než 1:

{Select[r8,Function[x,x>1]],Select[r8,#>1&],Select[r8,Positive[#-1]&]}

Použití funkce Cases (2. argument musí být předloha, vzor, pattern )

Jak z predikátu pred dostanu předlohu: _?pred

{Cases[r8,_?Positive],Cases[r8,x_/;x>0],Cases[r8,_?(#>0&)],(* ale nefunguje: *)Cases[r8,(#>0&)]}

(* Nápověda: (#>0&) není vzor: *)
(#>0&)[3]

Cases[r8,1]

Všechny prvky větší než 1:

{Cases[r8,x_/;x>1],Cases[r8,_?(#>1&)]}
{Select[r8,#>1&],Select[r8,Function[x,x>1]]}

Některé rozdíly mezi Select a Cases

Select[f[1,a,2,b,3],IntegerQ]
Cases[f[1,a,2,b,3],_Integer]
Cases[f[1,a,2,b,3],_?IntegerQ]
(* ale pozor, zde nejsou vzory jako druhy argument!!! *)
{Cases[f[1,a,2,b,3],IntegerQ],Cases[{1,a,2,b,3},IntegerQ]}

Testování a hledání v seznamech

{Position[li={a,b,c,d,e},c],Position[{a,b,c,d,e},cc]}

(* cetnost vyskytu a *)Count[li2={a,b,a,c,a,d,c,b,b,b,a,e,e},a]

Union[li2]

Četnosti prvků v listu li2

Map[Count[li2,#]&,Union[li2]]

{Union[li2],Map[Count[li2,#]&,Union[li2]]}//Transpose//TableForm

(* Elegantněji a zároveň přehledněji *)

Map[{#,Count[li2,#]}&,Union[li2]]//TableForm
Map[Function[x,{x,Count[li2,x]}],Union[li2]]//TableForm

Avsak  existuje zabudovana funkce Tally:

Tally[li2]

?*Chart

BarChart[Apply[Labeled,Reverse[{{a,4},{b,4},{c,2},{d,1},{e,2}},2],{1}]]
PieChart[Apply[Labeled,Reverse[{{a,4},{b,4},{c,2},{d,1},{e,2}},2],{1}]]

Za cviceni zkuste pro stejny ucel pouzit funkci MemberQ:

{MemberQ[li2,a],MemberQ[li2,f]}

({True,False,False}//Total)
({True,False,False}//Total)/.{False->0,True->1}

Boole[{True,False,False,True,True}]
%//Total

Nalezeni zakonitosti v posloupnosti

(* Pokusí se najít obecný předpis: *)
FindSequenceFunction[{1,1,2,3},n]
%//FunctionExpand
Plot[%,{n,0,4}]

Plot[x!,{x,-3.5,3}]

Fibonacciova čísla v obecně presentovaném tvaru (použití velmi důležité funkce FunctionExpand)

Simplify[Fibonacci[n]//FunctionExpand]
Simplify[Fibonacci[n]//FunctionExpand,Assumptions->{n∈Integers}]

Dalsi priklad

{t1=Table[3k,{k,1,10,2}],Length[t1]}
FindSequenceFunction[t1,n]//TraditionalForm
FindSequenceFunction[t1]

Vytváření seznamů

Table[(i^2),{i,1,5}] (* spatne z hlediska funkcionalniho programovani *)
Table[(i^2),{i,5}] (* spatne z hlediska funkcionalniho programovani *)
((Range[5])^2) (* spravne z hlediska funkcionalniho programovani *)

Range[4,8]
malaabeceda=CharacterRange["a","z"]
CharacterRange["a","z"]//FullForm

**Detaily

paclet:tutorial/CharacterCodes

(* Greek and other characters *)
CharacterRange[913,1009]

(* Chinese *)
CharacterRange[12288,35839]

(* Wolfram special characters *)
CharacterRange[61440,63487]
Position[%,\[WolframLanguageLogo]]
Position[%%,🐺]

Konec 2016-11-22

2016-11-29 Lesson 9

FAQ

HoldForm

expr1=HoldForm[1+1]
ReleaseHold[expr1]

Select  a Cases

Některé rozdíly mezi Select a Cases

Select[f[1,a,2,b,3],IntegerQ]
Cases[f[1,a,2,b,3],_Integer]
Cases[f[1,a,2,b,3],_?IntegerQ]
(* ale pozor, zde nejsou vzory jako druhý argument!!! *)
{Cases[f[1,a,2,b,3],IntegerQ],Cases[{1,a,2,b,3},IntegerQ]}

Cases bývá rychlejší než Select.

Seznamy (Lists) 2

Tabulky

Table[{i,Expand[(((1+α))^i)]},{i,3}]//TableForm

Text@Grid[{Range[3],Expand[(((1+α))^(Range[3]))]}//Transpose,Frame->{False,All},Frame->True]

Text@Grid[{Range[5],Expand[(((1+α))^(Range[5]))]}//Transpose,Background->{None,{{Pink,Yellow}}},Frame->{All,False},Frame->True]

Nekdy je vsak prehlednejsi pouzit proceduralni pristup (s iteratorem):

Table[i+j,{i,5},{j,1,i}]//TableForm

Porovnání dob výpočtů pri vytvareni stejneho seznamu

Vsimnete si pouziti potlaceneho vystupu ;          Vypocet spustte nekolikrat za sebou a pozorujte ruzne casy vypoctu.

Timing[Table[Sin[π k/4],{k,0,250000}];]
Timing[Sin[(Range[250001]-1)π/4];]
Timing[Map[Sin,(Range[250001]-1)π/4];]
Print[Style["Úspora "<> ToString[(1-((%)/(%%%))//First)100]<>"%",18]]

Ještě porovnáme dobu výpočtu vlastních čísel Hilbertovy matice při postupu 1. nejdříve H. matice přesně, pak numerickou hodnotu, 2. nejdříve převedeme Hilbertovu matici na realny tvar a pak vypočteme vlastní čísla.

(HilbertMatrix[60]//Eigenvalues)//First

{(* 1. *)Timing[hen=HilbertMatrix[60]//Eigenvalues//N;],
(* 2. *)Timing[hne=HilbertMatrix[60]//N//Eigenvalues;]}

Nepřesnost, rozdíl mezi oběma postupy (odečteme vektory vlastních čísel, spočteme vektor absolutních hodnot odchylek a z nich maximum):

Max[Abs[hen-hne]]
$MachinePrecision

Vytvoření positivně definitní matice a příbuzné výpočty (důležité)

Vytvoříme náhodnou čtvercovou matici C. Ta je s. j. regulárni. Potom C.(C^T) je s. j. positivně definitní.

Clear[nahodnactvercovamatice];
nahodnactvercovamatice[n_]:=RandomReal[{0,1},{n,n}]
(* Vlastni cisla *)

Vyzkoušíme, všechna vlastní čísla positivně definitivní matice musí kladná:

SeedRandom[131];
Eigenvalues[nahodnactvercovamatice[3].Transpose[nahodnactvercovamatice[3]]]

To je ovšem konstrukce obsahujici hrubou chybu!!! Matice nahodnactvercovamatice[3] se volá dvakrát, pokaždé je jiná: pri druhem volani procedury generator nahodnych cisel startuje z pozice zanechane po prvnim volani.

SeedRandom[131];Row[Map[MatrixForm,{nahodnactvercovamatice[3],nahodnactvercovamatice[3]}]]

Při správné konstrukci použijeme lokalizační funkci With:

SeedRandom[131];Eigenvalues[With[{c=nahodnactvercovamatice[3]},c.Transpose[c]]]

Celá procedura:

Clear[vytvorenipositivnedefinitnimatice];
(* Druhý argument je případně uživatelem zadané semínko generátoru náhodných čísel. Výstup procedury je seznam (vektor), jehož 1. složka je positivně definitní matice, 2. resp. 3. složka je maximální resp. minimální vlastní číslo a 5. složka je graf vlastních čísel na logaritmické stupnici (Scree plot). 4. složka je "nový řádek"!!! *)
vytvorenipositivnedefinitnimatice[n_,randomseed_:131]:=Module[{pom},SeedRandom[randomseed];pom=nahodnactvercovamatice[n];{pom=pom.Transpose[pom],Max[pom=Eigenvalues[pom]],Min[pom],"\n",ListLogPlot[pom,Joined->True,PlotRange->All,PlotLabel->"Eigenvalues",PlotTheme->"Scientific"]}]

Příklady:

(* Matice řádu 3 *)
vytvorenipositivnedefinitnimatice[3]

vytvorenipositivnedefinitnimatice[3][[5]]

(* Matice řádu 50 *)
vytvorenipositivnedefinitnimatice[50][[5]]
Text@Row@{"Determinant pos. def. matice P, 50×50:   ",Det[vytvorenipositivnedefinitnimatice[50][[1]]]}
Text@Row@{"Vlastní čísla matice P, 50×50:   ",Eigenvalues[vytvorenipositivnedefinitnimatice[50][[1]]]}
Text@Row@{"Její maximální vlastní číslo  = ",vytvorenipositivnedefinitnimatice[50][[2]]}
Text@Row@{"|(PP^(-1))| = ",Det[(p=vytvorenipositivnedefinitnimatice[50][[1]]).Inverse[p]]}

Vytvoříme 100 matic výše uvedenou procedurou dimenzi 1×1, 2×2, ..., 99×99, 100×100 a otestujeme je na positivní definitnost pomoci zabudované funkce PositiveDefiniteMatrixQ. Zajimá nás, zda tímto testem projdou všechny matice, takže stačí použít funkci Union.

Map[PositiveDefiniteMatrixQ[vytvorenipositivnedefinitnimatice[#][[1]]]&,Range[100]]//Union
(* Nebo procedurálně *)
Union[Table[PositiveSemidefiniteMatrixQ[vytvorenipositivnedefinitnimatice[i][[1]]],{i,100}]]

Spektrální rozklad reálne symetrické matice

I když to není v návodu přímo napsáno, ze zkušenosti se zdá, že Eigenvalues (Subscript[λ, 1])≥(Subscript[λ, 2])≥...≥(Subscript[λ, n]) symetrické positivně semidefinitní matice A (n×n) jsou setříděné sestupně podle velikosti a jim odpovídající vlastní vektory (Eigenvectors) (Subscript[x, 1]),...,(Subscript[x, n]) jsou ortonormální. Pak je odpovídající spektrální rozklad

A=(∑_(i=1)^n)(Subscript[λ, i])(Subscript[x, i])(Subscript[x, i]^T)=X,Λ,(X^T),

kde X=((Subscript[x, 1]),...,(Subscript[x, n])) je n×n matice ortonormálních vlastích vektorů a Λ=diag((Subscript[λ, i])) je diagonální matice s vlastními čísly na diagonále.

Otestujeme na matici (5×5). Přitom užijeme užitečnou funkci Tuples.

Clear[a,b,c];
Tuples[{a,b,c},2]
Tuples[{a,b,c},3]

p5=vytvorenipositivnedefinitnimatice[5][[1]];
cisla5=Eigenvalues[p5];
vektory5=Eigenvectors[p5];

(* Vytvoříme všechny dvojice vlastních vektorů *)
tup5=Tuples[vektory5,2];Text@Row@{"Počet dvojic:  ",Length[tup5]}
Text@Row@{"První dvě dvojice {(Subscript[x, 1]),(Subscript[x, 1])} a {(Subscript[x, 1,])(Subscript[x, 2])}:"}
tup5[[{1,2}]]//MatrixForm

(* Všech 25 skalárních součinů (funkce Dot), funkce Chop "usekne" bezvýznamné číslice za desetinnou tečkou, funkce Partition s druhým parametrem 5 vytvoří z vektoru těchto součinů matici (5×5) *) 
Partition[Map[#[[1]].#[[2]]&,tup5],5]//Chop//MatrixForm

Vidíme tedy, že vlastní vektory jsou ortonormální.

Oveříme, zda vlastní čísla jsou seřazena podle velikosti:

cisla5==Sort[cisla5,GreaterEqual]

Poznámka (Test, zda n-tice čísel je permutace)

nahodnapermutace=RandomSample[Range[10],10]
(* Test *)
Sort[nahodnapermutace]==Range[Length[nahodnapermutace]]

Vytvoříme spektrální rozklad a odečteme původní matici:

Transpose[vektory5].DiagonalMatrix[cisla5].vektory5-p5
%//Chop//MatrixForm

Až na zaokrouhlovací chyby souhlasí s naší hypotézou.

***Symetrická odmocninová matice (symetrická matice (A^(1/2)) s vlastností A = (A^(1/2))(A^(1/2))

Buď ze spektrálního rozkladu nebo jednodušeji použitím zabudované funkce MatrixPower. Ta se také používá při výpočtu matic přechodu přes několik období. Spektrální rozklad A:

(A^(1/2))=(∑_(i=1)^n)(Sqrt[(Subscript[λ, i])])(Subscript[x, i])(Subscript[x, i]^T).

(Transpose[vektory5].DiagonalMatrix[(Sqrt[cisla5])].vektory5-MatrixPower[p5,(1/2)]//Chop)//MatrixForm

Rozměry

Length[mat24={Range[4],((Range[4])^2)}]
Length[mat42={Range[4],((Range[4])^2)}//Transpose]
{Dimensions[mat24],Dimensions[mat42]}

Dimensions[r10={Range[4],((Range[4])^2)}]
Dimensions[{Range[3],((Range[4])^2)}]
Dimensions[{Range[3],((Range[4])^2)},Infinity]
Dimensions[{{{{a,b}}}}]

Části seznamů

r11=Range[7];
Text@Row@{"Vezmi prvni dva:  ",Take[r11,2],"   Vynech poslednich pet:   ",Drop[r11,-5]}
Text@Row@{"Vezmi posledni dva:  ",Take[r11,-2],"   Vynech prvnich pet:   ",Drop[r11,5]}
Text@Row@{"Vezmi treti az paty prvek:  ",Take[r11,{3,5}],"   ekvivalentně:  ",r11[[3;;5]]," (Pozor na syntaxi!)"}
(* Take pracuje s libovolnou hlavickou, nejenom s hlavickou List, jako i mnoho jinych funkci *)
Take[a+b+c+d+e+f,3]

Cviceni:

Take[(({{11, 12, 13, 14, 15}, {21, 22, 23, 24, 25}, {31, 32, 33, 34, 35}, {41, 42, 43, 44, 45}, {51, 52, 53, 54, 55}})),{2,4}]//MatrixForm

Take[(({{11, 12, 13, 14, 15}, {21, 22, 23, 24, 25}, {31, 32, 33, 34, 35}, {41, 42, 43, 44, 45}, {51, 52, 53, 54, 55}})),{2,4},{3,5}]//MatrixForm

Take[(({{11, 12, 13, 14, 15}, {21, 22, 23, 24, 25}, {31, 32, 33, 34, 35}, {41, 42, 43, 44, 45}, {51, 52, 53, 54, 55}})),{1,-1,2},{1,-1,2}]//MatrixForm

Cviceni: Prozkoumejte funkce Most, Rest, First, Last, ;; (Span)

;;

Viz Help k Take.

Příklad (výpočet výnosů z cen aktiva)

Clear[ceny,s];
ceny=Array[s,10]
(vynosy(* returns *)=((Rest[ceny]-Most[ceny])/(Most[ceny])))//TraditionalForm

Alternativně

((Differences[ceny])/(Most[ceny]))//TraditionalForm

Konkrétní data

{FinancialData[(* Ticker *)"AAPL","Company"],FinancialData["AAPL","Name"]}

FinancialData["AAPL"]

pricesApple= FinancialData["AAPL",{{2012,10,11},{2016,11,24}}];
DateListPlot[%,Joined->True,PlotTheme->"Marketing",PlotLabel->"Apple"]

returnsApple= FinancialData["AAPL","Return",{{2012,10,11},{2016,11,24}},"Value"];
ListPlot[returnsApple,Joined->True,PlotTheme->"Detailed"]

20150923 VW Crisis

(* today, VOW is the ticker of VW *)
FinancialData["F:VOW"]
(* last year *)
pricesVW=FinancialData["F:VOW",{2014,9,22}];
returnswithdatesVW=FinancialData["F:VOW","Return",{2014,9,22}];
returnsVW=Map[Last,returnswithdatesVW];
{pricesVW//Last,returnsVW//Last}
DateListPlot[pricesVW(* //Take[#,-15]& *),PlotRange->All]

(***)
ListPlot[CorrelationFunction[returnsVW,{20}]//Rest,Filling->Axis,PlotRange->All,PlotStyle->PointSize[0.02]]

**Časové řady

(* 20151028 *)
(* modelVW=TimeSeriesModelFit[pricesVW] *)

Today
modelVW=TimeSeriesModelFit[pricesVW]

DateListPlot[{modelVW["TemporalData"],TimeSeriesForecast[modelVW,{30}]},PlotStyle->Thick]

**Rozdělení

*Směs rozdělení

MixtureDistribution

𝒟mixture=MixtureDistribution[{1/20,17/20,2/20},{NormalDistribution[-3,1/2],NormalDistribution[],NormalDistribution[3.5,1/2]}];
Plot[PDF[𝒟mixture,x],{x,-5,5},PlotLabel->"Hustota směsi"]

SmoothHistogram[returnsVW]

SmoothHistogram[returnsApple,PlotRange->All]

FindDistribution[returnsVW,3,All]

(distributionOfReturnsVW=FindDistribution[returnsVW,3])//TableForm
{Mean[returnsVW],StandardDeviation[returnsVW]}

(***)
Map[DistributionFitTest[returnsVW,#]&,{distributionOfReturnsVW,NormalDistribution[-0.0006584200885881907`,0.023003308312179883`]}//Flatten]

Plot[Map[PDF[#,x]&,distributionOfReturnsVW]//Evaluate,{x,-0.07,0.07}]

Show[Histogram[returnsVW,Automatic,"PDF",Epilog->First@Plot[PDF[distributionOfReturnsVW//First,x],{x,-0.07,0.07},PlotStyle->Red]]]

Kernel density - jádrová hustota

Show[Histogram[returnsVW,Automatic,"PDF",Epilog->First@Plot[PDF[SmoothKernelDistribution[returnsVW],x],{x,-0.07,0.07},PlotStyle->Red]],PlotRange->All]

*Seznamy: Řetězce

Vybrané funkce (základní operace, převody řetězec ⟷ výraz)

Row@{Hyperlink[Button["Přehled zacházení se řetězci","paclet:tutorial/StringsAndCharactersOverview"]],Spacer[10],Hyperlink[Button["Zacházení se řetězci"],"paclet:tutorial/OperationsOnStrings"],Spacer[10],Hyperlink[Button["Znaky v řetězcích"],"paclet:tutorial/CharactersInStrings"]}

Základní zabudované funkce pracující primárně se řetězci jsou analogické funkcím s ostatními objekty, mají však předponu String (např. Join ⟷ StringJoin). Po odklepnutí funkce v tabulce po provedení následujícího příkazu dostaneme stručnou nápovědu, po stisknutí “≫” na konci této nápovědy se dostaneme na Help

?String*

Jsou však také další funkce vztahující se k práci se řetězci a se znaky.

?*String*

?*Character*

Výběr často užívaných funkcí, jsou vyznačeny žlutým pozadím (Background v Menu Format)  (všímejte si též běžně užívaných zkratek: “<>”, “ “

s1=StringJoin["Toto" ," ","jsou" ," retezce","."]
StringJoin["Toto jsou"," retezce","."]
(* alternativne *)
"Toto"<>" "<>"jsou"<>" retezce"<>"."//FullForm

Jednotlive znaky a  znovu dohromady:

(ch1=Characters[s1])
StringJoin[ch1]//FullForm
StringLength[StringJoin[ch1]]

Tally[ch1] (* Zjistí četnosti znaků v souboru ch1, rozlišuje velká a malá písmena *)
(* _____________________*)
Tally[ToLowerCase[ch1]](* Tentokrát nerozlišuje velká a malá písmena *)

StringReverse[{"ALENA","ROMA"}]

Připomínka Reverse:

Reverse[{a,b,c}]
Reverse[Range[7]]
(Reverse[{{a,b},{c,d}}])//MatrixForm

Jak dostat {{b,a},{d,c}}?

Map[Reverse,{{a,b},{c,d}}]//MatrixForm

Téhož výsledku dosáhneme

Transpose[{{a,b},{c,d}}]//Reverse//Transpose//MatrixForm

Velmi důležité:
Převody: výrazy ⟷ řetězce, expressions ⟷ strings, ToString ⟷ ToExpression

Využívá se hlavně při importu externích souborů z jiných aplikací. Převést na řetězec je možné téměř cokoli, převést na výraz (expression) je možné jen něco. Do systému Mathematica převádíme obvykle objekty, které neumíme v původní aplikaci zpracovat. Výpočty se provedou v systému Mathematica a exportují se ve formátu původní aplikace.

{"4+2",ToExpression[{"Haf",2^3,"4+2"}]//FullForm}

Převést na výraz (expression) je možné jen něco.

{charrange4=CharacterRange["1","4"],Total[charrange4],Total[ToExpression[charrange4]]}

***Cvičení: **Zběžně prostudovat funkci Outer:

(indicesCharacters=Outer[StringJoin,CharacterRange["1","4"],CharacterRange["1","8"]])//FullForm
indicesExpressions=ToExpression[indicesCharacters]

indicesCharacters[[1,1]]+indicesCharacters[[1,2]]

({ToString["11"+"12"],("11"+"12")//ToExpression,ToString["11"+"12"]//ToExpression})//FullForm

***Řecká abeceda a jiné

Hyperlink[Button["Useful information concerning character coding"],"paclet:tutorial/CharacterCodes"]

CharacterRange[913,1009]

Konstrukce seznamů 1

!!!NestList, FoldList, Range, Table, Array

NestList[f,x,5]

Potřebujeme-li jen poslední:

Nest[f,x,5]

Podobně

FoldList[f,x,{a,b,c,d,e}]

Fold[f,x,{a,b,c,d,e}]

Příklad (částečné součty, funkce vhodná pro generovaní náhodné procházky)

xx[n_]:=Array[(Subscript[x, #])&,n]
xx[5]
FoldList[Plus,0,xx[5]]
(* alternativně, pozor vynechává počáteční hodnotu, zde 0! *)
Accumulate[xx[5]]

Příklad

Několik možností, jak vytvořit posloupnost prvních 6 mocnin čísla 2 (včetně nulté):

(* procedurálně *)
Table[(2^i),{i,0,5}]

NestList[Function[x,2x],1,5]
(* ekvivalentní s: *)
NestList[2*#&,1,5] 
(2^(Range[6]-1))
Array[(2^(#-1))&,6]
Normal[SparseArray[{i_->2^(i-1)},6]]

Select a TakeWhile

Select[{1,3,7,4,10,2},#<5&]

TakeWhile[{1,3,7,4,10,2},#<5&]

!Příklad na postupná maxima (rekordy)

Clear[f,x,a,b,c,d];
FoldList[f,x,{a,b,c,d}]
FoldList[Plus,0,{a,b,c,d}]

r6=FoldList[Max,0,{5,3,6,3,2,77,4,88}]

tj. Max[0], Max[Max[0],5], Max[Max[Max[0,5],3],...

r6modifikovane=FoldList[Max,First[seznam={5,3,6,3,2,77,4,88}],seznam]

First[seznam ...] je startovací hodnota pro FoldList.

Alternativně:

FoldList[Max,First[seznam={5,3,6,3,2,77,4,88}],seznam//Rest]

(* rekordy *)
r7=Rest[r6modifikovane]
Union[r7]
ListPlot[{seznam,r7},Joined->True,AxesLabel->{"time","value"},PlotTheme->"Business"]

Cviceni: Kdy rekordy nastaly? (Vystup: dvojice {cas, rekord})

Clear[rekordy];
rekordy[x_?VectorQ]:=Union[Rest[FoldList[Max,First[x],x]]]
rekordy[{5,3,6,3,2,77,4,88}]
rekordy[-{5,3,6,3,2,77,4,88}]

Rozdíl mezi NestList a FoldList

NestList nemůže pracovat se souborem např. {a,b,c,d,e}. Přiblizná charakteristika:

Nest, NestList: (Subscript[a, n+1])=f((Subscript[a, n])).

Fold, FoldList: (Subscript[a, n+1])=f((Subscript[a, n]),(Subscript[b, n])).

Konec 2016-11-29

2016-12-06 Lesson 10

FAQ

N

Viz Accuracy

{Accuracy[1.2],Accuracy[1.2`20],Accuracy[4],Accuracy[3/4]}

{N[Pi^10,{Infinity,5}],N[Pi^10,{Infinity,1}],N[Pi^10,{Infinity,20}],N[Pi^10,{Infinity,∞}]}

{$MinPrecision,$MaxPrecision}

IRR

cf0=174056;cftable=Table[-1650,{130}];cfT=-336;
cf={cf0,cftable,cfT}//Flatten;
ListPlot[cf,PlotStyle->PointSize[0.015]]

(* Vzorec pro PV prvni polozka (Subscript[CF, 0]) *)
Clear[pv]
pv[cf_,i_]:=cf.(1/(((1+i))^(Range[Length[cf]]-1)))
(pvPriklad1=pv[{c0,c1,c2},i])//TraditionalForm

IRR

Solve[pvPriklad1==0,i]

solutioncf=NSolve[pv[cf,i]==0,i]

solutioncf//Length

Vybereme pouze kladne koreny:

koreny=i/.solutioncf

kladne=Select[koreny,(Im[#]==0&&Re[#]>0)&]//First

TimeValue[Cashflow[cf],kladne,0]

Plot[pv[cf,i],{i,0.001,0.01},PlotTheme->"Detailed"]

nebo

Plot[TimeValue[Cashflow[cf],i,0],{i,0.001,0.01},PlotTheme->"Detailed"]

FindRoot[TimeValue[Cashflow[cf],i,0],{i,0.003}]

Histogram ⟶ hustota

data=FinancialData["F:VOW",{2015,10,1},"Value"];

Histogram[data]

Histogram coby hustota:

GraphicsRow@{Histogram[data,Automatic,"PDF"],Histogram[data,20,"PDF"]}

Manipulate[SmoothHistogram[data,bw(* band width, sirka okenka *)],{{bw,2},0.5,15,Appearance->"Labeled"}]

Konstrukce seznamů 2

Příklad: Modelování ceny akcie pomocí náhodné procházky

Počáteční cena s0, maximální možná změna v následující periodě ±5% ( = 1/20 ) počáteční ceny. Následující definice jsou ekvivalentní:

Clear[cena,cenanest,cenanest2];
cena[s0_?NumericQ,delka_?IntegerQ]:=FoldList[Plus,s0,RandomReal[{-s0/20,s0/20},delka]]
cenanest[s0_,delka_]:=NestList[#+RandomReal[{-s0/20,s0/20}]&,s0,delka]
cenanest2[s0_,delka_]:=NestList[Function[x,x+RandomReal[{-s0/20,s0/20}]],s0,delka]

SeedRandom[131313];
cena[100,10]
SeedRandom[131313];
cenanest[100,10]
SeedRandom[131313];
cenanest2[100,10]
SeedRandom[131313];
ListPlot[cenanest[100,250],PlotTheme->"Scientific",Joined->True]

Cvičení. Pro stejný účel použijte funkci Accumulate.

Příklad (generováni 50 trajektorií vývoje ceny akcie délky 1000)

Jedna se vlastne o 50 scenaru, realizace nahodneho procesu pro 50 ruznych ω: (Subscript[ω, 1]),...,(Subscript[ω, 50]).  Vsimnete si, ze “Table” se vztahuje k poctu trajektorii!!!

SeedRandom[131313];
ListPlot[tab100=Table[cena[100,1000],{50}],Joined->True,PlotRange->All]
Dimensions[tab100]

Ceny v case 500 a jejich charakteristiky (řez v čase 500 v předchozím grafu):

ceny500=tab100[[All,500]];
Text@Row@{"Min   ",Min[ceny500],"  Max   ",Max[ceny500],"  Prumer   ",Mean[ceny500],"  Median   ",Median[ceny500],"\nSmerodatna odchylka   ",StandardDeviation[ceny500]}
GraphicsRow@{Histogram[ceny500,8],SmoothHistogram[ceny500]}

{Mean[unif1=UniformDistribution[{-s0/20,s0/20}]],Variance[unif1]}
%/.s0->100

Ilustrace, jak funguje CLV (centralni limitni veta). Delka rady 100, pocet rad 1000, rozdeleni hodnoty (Subscript[S, 100])=(Subscript[S, 0])+(∑_(n=1)^100)(Subscript[U, n]), kde (Subscript[U, n]) jsou nezavisle stejne rozdelene nahodne veliciny s rozdelenim R(-(Subscript[S, 0])/20,(Subscript[S, 0])/20).

CLV:

Necht (Subscript[U, 1]),(Subscript[U, 2]),... je posloupnost nezavislych stejne rozdelenych nahodnych velicin (iid) s konecnym nenulovym rozptylem (σ^2) a stredni hodnotou μ. Potom

(((∑_(n=1)^N)(Subscript[U, n])-n μ)/(σ(Sqrt[n])))

konverguje v distribuci k N(0,1).

Konvergence je pomerne rychla.

SeedRandom[131313];tab1000=Table[cena[100,100],{1000}];
poslednihodnoty=Map[Last,tab1000];
Show[Histogram[poslednihodnoty,Automatic,"PDF"],Plot[PDF[NormalDistribution[100,(Sqrt[100  (25/3)])],x],{x,0,200}]]

Text@Row@{"p-hodnota  ",ℋ=DistributionFitTest[poslednihodnoty,Automatic,"HypothesisTestData"]}

ℋ["TestDataTable",All]

Show[Histogram[poslednihodnoty,Automatic,"ProbabilityDensity"],Plot[PDF[ℋ["FittedDistribution"],x],{x,0,200},PlotStyle->Thick]]

Cviceni. Ve vyse uvedenem priklade jsme pouzili maximalni rust  resp. minimalni pokles o 5 %. Vytvorte proceduru, kde dalsim parametrem bude _procento znamenajici  maximalni rust  resp. minimalni pokles.

Příklad (Pokračování): Růst nebo pokles z předchozí (a ne počáteční) ceny

Drive

cenanest[s0_,delka_]:=NestList[#+RandomReal[{-s0/20,s0/20}]&,s0,delka]

a nyni

Clear[cenanestdynamicky];
cenanestdynamicky[s0_,delka_]:=NestList[#+RandomReal[{-#/20,#/20}]&,s0,delka]

SeedRandom[131313];
ListPlot[Table[cenanestdynamicky[100,1000],{10}],Joined->True,PlotRange->{0,300},PlotLabel->"Nyní"]
(* Porovnani s puvodnim vyse uvedenym vyvojem *)
SeedRandom[131313];
ListPlot[Table[cena[100,1000],{10}],Joined->True,PlotRange->{0,300},PlotLabel->"Dříve"]

**Sparse arrays (Řídká pole, matice)

Často se řesi problémy, ve kterých vystupují matice velkých rozměrů, ale s relativně málo nenulovými prvky (řídké matice). Zde jsou reprezentovány objektem SparseArray. Zabírají méně paměti a pro zacházení s nimi jsou vyvinuty speciální algoritmy.

sa1=SparseArray[{3->x,4->y},15]

“Zviditelnění”:

Normal[sa1]
ArrayPlot[{sa1//Normal}]

Počítat můžeme normálně:

sa1.sa1
sa1*sa1
%//Normal

{Head[sa1],Head[Normal[sa1]]}
Normal[sa1*sa1]

SparseArray[{i_->(i^2)},5]//Normal

SparseArray[{2->a,5->b}]//Normal

SparseArray[{{1,2}->a,{3,2}->b,{3,3}->c}]//MatrixForm

(tab1=Table[{i,j},{i,4},{j,i}])//Length
tab1//TableForm
Flatten[tab1,1]
(SparseArray[(indexy1=Flatten[tab1,1])->Range[Length[indexy1]]]//Normal)//MatrixForm

**Sparse arrays: pásy, bands

Band znamená pás. Z příkladů je zřejmé, jak se zabudovaná ffunkce Band používá. V maticích Band[{m,n}] znamená pozice s indexy (m,n),(m+1,n+1),....

SparseArray[{Band[{1,1}]->x,Band[{2,1}]->y,Band[{1,2}]->z},{5,5}]//MatrixForm

SparseArray[{i_,i_}->1,{4,4}]//MatrixForm
(* Totéž dostaneme IdentityMatrix[4] *)

To, co už je zadáno se nepřepíše. Záleží tedy na pořadí zadávání lokálních pravidel (substitucí). Zde: na diagonále 1, ve 3. sloupci a, na 2. řádku b.

{SparseArray[{{i_,i_}->1,{_,3}->a,{2,_}->b},{4,4}]//MatrixForm,
SparseArray[{{_,3}->a,{2,_}->b,{i_,i_}->1},{4,4}]//MatrixForm}

Ukázka okamžité aplikace lokálního pravidla -> (substituce) a odložené :->

SeedRandom[13];SparseArray[{i_,i_}->RandomReal[],{4,4}]//MatrixForm
SeedRandom[13];
SparseArray[{i_,i_}:> RandomReal[],{4,4}]//MatrixForm

(* Vektor, ktery bude mit na sudych pozicich p a na ostatnich druhou mocninu *)
SparseArray[{_?EvenQ->p,i_-> (i^2)},{15}]//Normal
(* Alternativne *)
SparseArray[{i_/;EvenQ[i]->p,i_-> (i^2)},{15}]//Normal

(* V obracenem poradi se druhe pravidlo vubec neaplikuje, protoze vsechny pozice jsou obsazeny: *)
SparseArray[{i_-> (i^2),_?EvenQ->p},{15}]//Normal

(* Matice 4×4, pozor, zde je "nebo" vyjadreno jako jedna kolma cara "|", zatimco logicke nebo jsou dve kolme cary "||". *)
(* V prvnim nebo tretim radku a ve druhem nebo ctvrtem sloupci a *)
(* V 1. nebo 3. radku a 2. nebo 4. sloupci dosad a 
*)
SparseArray[{1|3,2|4}->a,{4,4}]//MatrixForm
SparseArray[{1|3,2|4}->a,{4,4}]//ArrayPlot

Map[(3<#<7)&,Range[10]]
Map[Function[x,3<x<7],Range[10]]

(* Ekvivalentni zapisy *)
Clear[p]
SparseArray[_?((3<#<7)&)->p,{10}]//Normal
SparseArray[i_/;3<i<7->p,{10}]//Normal

Další příklady bez komentáře (za cvičení)

Clear[aasparse]
aasparse[n_]:=SparseArray[{i_,j_}/;Abs[i-j]==1->i+j,{n,n}]//MatrixForm
aasparse[5]

SparseArray[{i_,j_}/;Abs[i-j]<2->i+j,{5,5}]//MatrixForm

SparseArray[{Band[{1,1}]->2Range[5],Band[{1,2}]->2Range[4]+1,Band[{2,1}]->2Range[4]+1}]//MatrixForm

Nepredvidatelny vysledek:

(sprec=SparseArray[{Band[{1,1}]->2Range[5],Band[{1,2}]->2Range[4]+1,Band[{2,1}]->2Range[10]+1}])//MatrixForm
Dimensions[sprec]

(sprec=SparseArray[{Band[{1,1}]->2Range[5],Band[{1,2}]->2Range[4]+1,Band[{2,1}]->2Range[10]+1},{10,10}])//MatrixForm
Dimensions[sprec]

Nespecifikovana pole jsou misto nul nahrazeny karetnimi symboly

SparseArray[{i_,j_}/;Abs[i-j]<2->i+j,{5,5},♡♢♣♠]//MatrixForm

***Sparse arrays (Priklad, porovnani se standardnim Array, Table, ...) Nepovinné,  ale jinak užitečné cvičení

Clear[aasparse];
aasparse[n_]:=SparseArray[{i_,j_}/;Abs[i-j]==1->i+j,{n,n}]

aasparse[5]//MatrixForm

aa=Array[0&,{5,5}];
(* dve ekvivalentni vyjadreni *)
{ReplacePart[aa,{i_,j_}:> i+j/;Abs[i-j]==1]//MatrixForm,
ReplacePart[aa,{i_,j_}/;Abs[i-j]==1->i+j]//MatrixForm}

Clear[aastandard]
aastandard[n_]:=Module[{aux},
aux=Array[0&,{n,n}];
ReplacePart[aux,{i_,j_}/;Abs[i-j]==1->i+j]
					  ]

aastandard[5]//MatrixForm

{ByteCount[0],ByteCount[0.],ByteCount[2.],ByteCount[2.`50]}

{Timing[aasparse1000=aasparse[1000];],Timing[aastandard1000=aastandard[1000];]}
{ByteCount[aasparse1000],ByteCount[aastandard1000]}

aasparse500=aasparse[500];
aastandard500=aastandard[500];{Timing[invsparse500=Inverse[aasparse500];],Timing[invstandard500=Inverse[aastandard500];]}

{ByteCount[invsparse500],ByteCount[invstandard500]}

Duvod: obe matice jsou identicke

Take[invsparse500,10,10]//MatrixForm

Take[invsparse500,10,10]-Take[invstandard500,10,10]//MatrixForm

Map[Abs,{{1,2},{I+1,-4}}//Flatten]

Max[Map[Abs,(invsparse500-invstandard500)//Flatten]]

Cviceni: Provedte tez srovnani pro numericke verze matic.

Seznamy: Extrakce dat z webové stránky

Row@{Hyperlink[Button["Clean Up Data Imported from a Website"],"paclet:howto/CleanUpDataImportedFromAWebsite"],Spacer[10],Hyperlink[Button["Clean Up Data Imported from a ZIP"],"paclet:howto/CleanUpDataImportedFromAZIPFile"]}

Příklad (Matice přechodu ratingových tříd, Credit Rating Transition Probabilities)

Zpracování dat z kopie části souboru PDF!!!!

Source

Dimitrios Kavvathas 
Goldman Sachs Group, Inc.
Estimating Credit Rating Transition Probabilities for Corporate Bonds,
AFA 2001 New Orleans Meetings

http://papers.ssrn.com/sol3/papers.cfm?abstract_id=252517

Pozor, po nasledujicim prikazu bude mit vytvoreny notebook 166Mb!!!

importCreditTransitionProbabilities=Import["http://www.karlin.mff.cuni.cz/~hurt/CreditTransitionProbabilities.pdf"]

Staci vsak jenom zkopirovat prislusnou pasaz z pdf souboru, strana 50. Zkopírovaný blok opatříme uvozovkami.

**Zpracování 1 (Processing, některé části jsou obtížnější, ilustrace možností, sledujte jenom osnovu. Jednodušší řešení následuje. )

mat1="AAA AA A BBB BB B CCC D
AAA 94.46% 4.77% 0.60% 0.10% 0.07% 0.01% 0.00% 0.00%
AA 0.49% 91.79% 6.94% 0.59% 0.07% 0.09% 0.02% 0.01%
A 0.10% 1.87% 91.99% 5.22% 0.55% 0.25% 0.01% 0.01%
BBB 0.04% 0.32% 5.47% 88.19% 4.96% 0.83% 0.07% 0.11%
BB 0.04% 0.14% 0.84% 6.75% 83.88% 7.13% 0.72% 0.50%
B 0.01% 0.07% 0.27% 0.60% 5.62% 84.79% 4.81% 3.84%
CCC 0.12% 0.01% 0.51% 0.46% 1.70% 8.91% 54.01% 34.28%";

mat2=StringReplace[mat1,"%"->" "]

(* Obtížná konstrukce objektu m3, tvorba h1, h2, h3 je již triviální *)
(m3=StringReplace[mat2,x:NumberString..:>ToExpression[x]])//FullForm
h1=First[m3]
(h2=StringReplace[h1,"\n"~~__->""])//FullForm
(h3=StringSplit[h2])//FullForm

m4=Select[m3,NumberQ]

m5=Apply[List,m4]/100 (* m5 odpovida matici 7×8, ale ve tvaru vektoru o 56 slozkach *)

(* Přidáme poslední řádek odpovídající pohlcujícímu stavu (absorption state) D, tj. Default. Z něj není úniku. V literatuře se neuvádí protože jde o nadbytečnou informaci, ale pro účely výpočtů v markovských řetězcích potřebujeme kompletní (čtvercovou) matici přechodu *)
m6=Append[m5,{Table[0.,{7}],1.}]//Flatten; (* m6 odpovida matici 8×8, ale ve tvaru vektoru o 64 slozkach *)

?PaddedForm

m7=Map[PaddedForm[#,{4,4}]&,m6]

(m8=Partition[m7,8])//MatrixForm

Úprava na presentovatelný tvar:

mh9=Append[h3,m7]//Flatten

mh10=Append[{"   ",h3}//Flatten,Transpose[Partition[mh9,8]]//Flatten]//Flatten

(mh11=Partition[mh10,9]//Transpose)//MatrixForm

Text@Grid[mh11,Frame->All,Alignment->Left]

(Text@Grid[mh11,Frame->All,Alignment->Left])//TeXForm

Matice přechodu po třech letech (předpokládáme, že se jedná o homogenní Markovův řetězec)

Text@Grid[MatrixPower[Partition[m6,8],3],Frame->True]

Vysvětlivky

Zpětná čárka za číslem  “ ` ” : jedná se o číslo reálné, nepřesné, případně s uvedenou přesností.

{2.,FullForm[2.],2.`30}

Rationalize[2.`]

Attributes[StringReplace]
StringReplace[{"AAA","BAB"},"B"->""]
StringReplace["AAA","BAB","B"->""]
StringReplace[StringExpression["AAA","BAB"],"B"->""]//FullForm

Map[ToExpression,{"AOOOO","3.4"}]//FullForm

Zpracování 2 (Jednodušší řešení)

mat1//FullForm

mat2=StringReplace[mat1,"%"->" "];
(mat3alternativni=StringSplit[mat2])//FullForm

mat4alternativni=Map[ToExpression,mat3alternativni]
(vyslednamaticeprechodushlavickou=Partition[{" ",mat4alternativni}//Flatten,9])//MatrixForm

Vypreparovani matice prechodu

(vyslednamaticeprechodubezprvnihoradku=Drop[vyslednamaticeprechodushlavickou,1])//MatrixForm

(vyslednamaticeprechodubezprvnihosloupce=Map[Drop[#,1]&,vyslednamaticeprechodubezprvnihoradku])//MatrixForm

V matici prechodu je posledni radek (D je pohlcujici stav)

posledniradek={Table[0,{7}],100}//Flatten

(vyslednamaticeprechodu=Append[vyslednamaticeprechodubezprvnihosloupce,posledniradek]/100)//MatrixForm

Matice prechodu po peti letech

MatrixPower[vyslednamaticeprechodu,5]//MatrixForm

Příklad (Zpracování stránky z Wall Street Journal, Zero coupon bonds, STRIPS)

http://online.wsj.com/mdc/public/page/2_ 3020-tstrips.html

http://community.wolfram.com/groups/-/m/t/159357?p_p_auth=3G9JlLh8 (Robert Rimmer)

Ke konci stranky je odkaz (otevre notebook v novem okne):

NotebookPut@Import["http://pages.suddenlink.net/rhr/fin07/TreasuryZeroes.nb"];

V notebooku vyber vse (Ctrl+A), Menu ⟶ Cell ⟶ Cell Properties ⟶ Open (asi dvakrat)

Nenechte se odradit pri chybovych zpravach! Casto jsou zpusobeny chybami pri cteni webove stranky.

$ImportFormats//Length

ARAD Systém časových řad ČNB

Row@{Hyperlink[Button["ARAD Systém časových řad ČNB"],"http://www.cnb.cz/docs/ARADY/HTML/index.htm"],Spacer[20],Hyperlink[Button["Inflace 1"],"http://www.cnb.cz/cnb/STAT.ARADY_PKG.PARAMETRY_SESTAVY?p_sestuid=21437&p_strid=ACBB&p_lang=CS"],Spacer[20],Hyperlink[Button["Inflace 2"],"http://www.cnb.cz/cs/statistika/inflace/"]}

http://www.cnb.cz/cs/statistika/inflace/

http://www.cnb.cz/docs/ARADY/HTML/index.htm

http://www.cnb.cz/cnb/STAT.ARADY_PKG.PARAMETRY_SESTAVY?p_sestuid=21437&p_strid=ACBB&p_lang=CS

Příklad (Kurzy ČNB)

Analýza a zpracování jednotlivých položek (HTML)

i1=Import["http://www.cnb.cz/miranda2/m2/cs/financni_trhy/devizovy_trh/kurzy_devizoveho_trhu/vybrane.txt?mena=EUR&od=01.01.2015&do=31.12.2015","Elements"]

Import["http://www.cnb.cz/miranda2/m2/cs/financni_trhy/devizovy_trh/kurzy_devizoveho_trhu/vybrane.txt?mena=EUR&od=01.01.2015&do=31.12.2015","Data"]

(i2=Import["http://www.cnb.cz/miranda2/m2/cs/financni_trhy/devizovy_trh/kurzy_devizoveho_trhu/vybrane.txt?mena=EUR&od=01.01.2015&do=31.12.2015","Data"]//Drop[#,2]&)//FullForm

(maly1=List["02.01.2015|27",700]//ToString )//FullForm

(maly2=StringReplace[maly1,{"."->"/","|"->" ",", "->".","{"->"","}"->""}])//FullForm

(maly3=StringSplit[maly2])//FullForm

(maly4={DateList[{maly3[[1]],{"Day","Month","YearShort"}}],maly3[[2]]//ToExpression})//FullForm

Kompletní zpracování (HTML)

To, co jsme na jedné položce seznamu nyní vyzkoušeli, aplikujeme jednodušše pomocí funkce Map.

i21=Map[ToString,i2]

(i22=Map[StringReplace[#,{"."->"/","|"->" ",", "->".","{"->"","}"->""}]&,i21])//FullForm

(i23=Map[StringSplit,i22])//FullForm

(i24=Map[{DateList[{#[[1]],{"Day","Month","YearShort"}}],#[[2]]//ToExpression}&,i23])//FullForm

DateListPlot[i24,PlotTheme->"Detailed",PlotStyle->Black,PlotLegends->"EUR/CZK"]

Import (Text)

StringReplace["02.01.2015|27,700",{"."->"/","|"->" ",", "->".","{"->"","}"->"",","->"."}]

(iText1=Import["http://www.cnb.cz/miranda2/m2/cs/financni_trhy/devizovy_trh/kurzy_devizoveho_trhu/vybrane.txt?mena=EUR&od=01.01.2015&do=31.12.2015","Text"])//FullForm

(iText2=StringSplit[iText1,"\n"])//FullForm

iText3=Drop[iText2,2]//FullForm

StringSplit[StringReplace["02.01.2015|27,700",{"."->"/","|"->" ",", "->".","{"->"","}"->"",","->"."}]]

Import (Excel)

Hyperlink[Button["Kurzy ČNB"],"http://www.cnb.cz/cs/financni_trhy/devizovy_trh/kurzy_devizoveho_trhu/vybrane_form.jsp"]

$Path

SetDirectory[NotebookDirectory[]]
FileNames["*.xls"]

(iExcel1=Import["20151116_Kurs_EUR_CNB.xls"])//FullForm

Flatten

iExcel2=Flatten[iExcel1,1]

(iExcel3=Drop[iExcel2,3])//FullForm

DateList[{"02/01/2015",{"Day","Month","YearShort"}}]

malyExcel2=MapAt[StringReplace[#,"."->"/"]&,{"02.01.2015",27.7`},1]
MapAt[DateList[{#,{"Day","Month","YearShort"}}]&,malyExcel2,1]
(* Poslední dva příkazy dohromady: *)
malyExcel3=MapAt[Function[x,DateList[{StringReplace[x,"."->"/"],{"Day","Month","YearShort"}}]],{"02.01.2015",27.7`},1]

iExcel4=Map[MapAt[Function[x,DateList[{StringReplace[x,"."->"/"],{"Day","Month","YearShort"}}]],#,1]&,iExcel3]

DateListPlot[iExcel4]

Seznamy: Různé

Pridavani, odstranovani a modifikovani prvku seznamu

Prepend[m={a,b,c},aa]
Append[m,aa]
AppendTo[m,aa]
m
AppendTo[m,aa]

Nasledujici Riffle je michani (karet). Neplest s Rifle.

Clear[a,b,c,x,y,z]
Riffle[m={a,b,c},x]
Riffle[m={a,b,c},{x,y,z}]

{ReplacePart[m,2->x],m,m[[2]]=xx;m}
mat🐺=ReplacePart[mat={{a,b,c},{d,e,f}},{1,2}->🐺]

mat🐺[[2]]=🐺🐺🐺
mat🐺

(mat={{a,b,c},{d,e,f}})//MatrixForm
mat[[All,1]]={x,y};
mat//MatrixForm

Kombinace listu

Join[{a,b,c},{x,y},{t,u},{b,c},a]
Join[{a,b,c},{x,y},{t,u},{b,a,c},{a}]
Join[{a,b,c},{x,y},{t,u},{{b,a},c},{a}]

(* Pozor na rozdílné výstupy: Union třídí, DeleteDuplicates ne. *)Union[{a,b,c},{x,y},{t,u},{b,c},{a}]
DeleteDuplicates[{{a,b,c},{x,y},{t,u},{b,c},{a}}//Flatten]
%//Sort

Deleni a vyplnovani seznamu (partitioning)

Clear[a, b, c, d, e, f, g, h, x]; 
Partition[{a, b, c, d, e, f, g}, 3]
Partition[{a, b, c, d, e, f, g, h}, 3]

Dělení s překrytím (offset)

MatrixForm[Partition[{a, b, c, d, e, 
    f, g}, 3, 1]]

*** Nepovinné

Partition[{a, b, c, d, e, f, g}, 3, 3, 
  1]
Partition[{a, b, c, d, e, f, g}, 3, 3, 
  1, x]
Partition[{a, b, c, d, e, f, g}, 3, 3, 
  1, {x, y, z, v, w}]
Partition[{a, b, c, d, e, f, g}, 3, 1, 
  {1, 1}, x]

Viz tez PadLeft a pribuzne funkce.

Aplikace: Test podle znamének diferencí a test extremálních bodů později.

Associations (Asociovaná též asociativní pole) 1

Úvod

Clear[a,b,c,v,w,x,xx,y,yy,z];

Asociativní pole je pole, jehož prvky nejsou indexovány pomocí posloupnosti celých čísel, ale pomocí klíčů. Klíčem může být číslo, textový řetězec (nejčastěji), symbol a jiné. Význam asociativního pole spočívá v jednodušším zápisu programu, při kterém odpadají konstrukce pro vyhledávání prvku v poli. Viz též hash.

Obrovskou výhodou je přehlednost. Vidíme, co z pole vytahujeme, narozdíl od číselného indexu, který nám mnohdy nic neříká. Díky vnitřní reprezentaci (hashing) je také vyhledávání podstatně rychlejší. Každé číselně indexované pole lze zapsat jako pole asociativní.

V asociaci se klíči přiřazuje hodnota. Klíčem může být prakticky cokoli (je vhodné ale klíče volit uvážlivě), hodnotou může být cokoli.

Clear[a,b,c,x,y,z]
asociace0=Association[{a->x,b->y,c->z}]
(* ekvivalentní zápis: *)
\[LeftAssociation]a->x,b->y,c->z\[RightAssociation]

Ukázky

(Zde pozor na rozdíl mezi symbolem a a řetězcem “a”. Pozdější asociace se stejným klíčem nahrazuje předchozí. To platí i pro většinu dalších operací s asociacemi.)

asociace1=\[LeftAssociation]a->x,"a"->{xx,yy},b->{y,v,33},c->z,a->w\[RightAssociation]

Převod asociace na seznam lokálních pravidel:

rules1=asociace1//Normal

Převod seznamu lokálních pravidel na asociaci:

Association[rules1]

Keys[asociace1]
Keys[asociace1]//FullForm

Values[asociace1]

Výběr částí asociací

{asociace1[b] ,(* ekvivalentně (jenže to ztrácí význam asociací) *)asociace1[[3]]}

asociace1[b][[2]]

Není možné:

asociace1[[b,2]]

Ale pokud je klíčem řetězec (String), pak to možné je:

asociace1[["a",2]]

Ale většinou použijeme konstrukci

asociace1["a"][[2]]

Ve všech případech pozor na závorkování: [ ] a [[ ]] !!!
Funkcí aplikované na asociace jsou většinou transparentní, “průhledné”: funkce se aplikuje na hodnotu a ne na klíč!

asociace0
{Total[asociace0],Sin[asociace0]}

Vybrané funkce s vybranými aplikacemi (pokračování)

AssociationMap

?Assoc*

AssociationMap[f,{a,b,c,d,e}]

Následující příkaz provede výměnu klíče ⟷ hodnoty:

AssociationMap[Reverse,asociace1]
Keys[%]
Values[%%]

AssociateTo

AssociateTo[a, klíč->hodnota] změní asociaci a přidáním dvojice klíč-hodnota. V případě, že klíč již existuje, pak změní hodnotu.

Poznamenejme, že všechny funkce končící na “To” jsou nebezpečné: mění první argument!!! Týká se funkcí jako PrependTo, AppendTo, .... Týká se to i jiných funkcí, např. později níže uvedené KeyDropFrom

asociace1

asociace2=asociace1
(* nový klíč *)AssociateTo[asociace2,novýKlíč->w]
asociace2

asociace2=asociace1
(* existující klíč b; hodnota je  nahrazena novou hodnotou *)AssociateTo[asociace2,b->"nováHodnota"]
asociace2

AssociationThread

Mj. použití v případě, že máme zvlášť pole klíčů a pole hodnot.

klice=CharacterRange["h","z"];
hodnoty=Prime[Range[Length[klice]]]
asociace3= AssociationThread[klice->hodnoty]
asociace3["u"]

*Merge (v obecnosti obtížné, pozornost věnovat následujícím příkladům)

Prosté spojení

Merge[{<|a->1,b->2|>,<|a->5,b->10,c->15|>},Identity]

Totéž použitím Flatten:

Merge[{<|a->1,b->2|>,<|a->5,b->10,c->15|>},Flatten]

Merge[{asociace1,asociace2},Identity]
(* ale pozor *)
Merge[{asociace1,asociace2},Flatten]

Merge[{<|a->1,b->2|>,<|a->5,b->10|>,<|c->6,d->"puvodniHodnota"|>},Identity]

Ke stejným klíčům přidává případné nové hodnoty

Merge[{<|a->1,b->2|>,<|a->5,b->10|>,<|c->6,d->"puvodniHodnota"|>,<|d->"novaHodnota"|>},Identity]

asociaceMerge1=Merge[{<|a->1,b->2|>,<|a->5,b->10|>},f]
(%/.f->Identity)//Simplify

Cvičení

Merge[{<|a->1,b->2|>,<|a->5,b->10|>},Total]
Merge[{<|a->1,b->2|>,<|a->5,b->10|>},Identity]
%//Total

?*From

Konec 2016-12-06

2016-12-13 Lesson 11

FAQ

Pravděpodobnost P(|X-μ|<σ)

Probability[Abs[x-μ]<σ,x\[Distributed]NormalDistribution[μ,σ]]//N

Table[{k,Probability[Abs[x-μ]<σ,x\[Distributed]StudentTDistribution[μ,σ,k]]//N},{k,10}]//TableForm

{Mean[ExponentialDistribution[1/θ]],StandardDeviation[ExponentialDistribution[1/θ]]}
Plot[PDF[ExponentialDistribution[1],x],{x,0,5},PlotStyle->Thick]

Probability[Abs[x-θ]<θ,x\[Distributed]ExponentialDistribution[1/θ]]//N

Dvojitě exponenciální rozdělení (Laplaceovo)

LaplaceDistribution

{Mean[LaplaceDistribution[μ,β]],StandardDeviation[LaplaceDistribution[μ,β]]}
Plot[PDF[LaplaceDistribution[],x],{x,-4,4},PlotStyle->Thick]

Probability[Abs[x-μ]<(Sqrt[2]) β,x\[Distributed]LaplaceDistribution[μ,β]]//N

Associations (Asociovaná též asociativní pole) 2

Vybrané funkce s vybranými aplikacemi (dokončení)

Clear[a,b,c,v,w,x,xx,y,yy,z];
asociace0=Association[{a->x,b->y,c->z}]
asociace1=\[LeftAssociation]a->x,"a"->{xx,yy},b->{y,v,33},c->z,a->w\[RightAssociation]

KeyDropFrom

Odstraňuje element z asociace podle klíče. Užitečná operace vyžadující jisté opatrnosti. Přepisuje.

asociace6=asociace1
KeyDropFrom[asociace6,b]
asociace6

KeyMap

KeyMap[f, <|a->1,b->2,c->3|>]

Užitečné v případě, že jsme “líní” neustále psát uvozovky. Ze symbolů vytvoříme řetězce a pak zpětně symboly:

KeyMap[ToString,<|a->1,b->2,c->3|>]
%//FullForm
KeyMap[ToExpression,%%]//FullForm

PositionIndex

PositionIndex[{c,a,b,b,a,a,b,c,a,c,b,a,a}]

Příklad (hodnotou může být cokoli)

Clear[grafSin,grafSinxSquared,tableOfTheFirst50Primes]
(* tady to jsou symboly *)
(klicePriklad=Map[ToString,{grafSin,grafSinxSquared,tableOfTheFirst50Primes}])//FullForm

hodnotyPriklad={Plot[Sin[x],{x,0,3π}],Plot[Sin[(x^2)],{x,0,3π},PlotTheme->"Detailed",PlotStyle->Thick],Table[{n,Prime[n]},{n,50}]//TableForm};

asociacePriklad=AssociationThread[klicePriklad,hodnotyPriklad];

asociacePriklad["grafSinxSquared"]

Associations (Asociovaná též asociativní pole) 3

**Beta Estimation from Monthly Returns (Market portfolio = SP500)

Lineární regrese

Hyperlink[Button["Demonstrace lineární regrese"],"http://demonstrations.wolfram.com/MeanFittedValueErrorAndResidualInSimpleLinearRegression/"]

This Demonstration simulates the simple linear regression (Subscript[y, i])=a+b (Subscript[x, i])+(Subscript[ϵ, i]), i=1,…,10. The red line is the plot of y=a+b x, while the blue line is the plot of (OverHat[y])=(OverHat[a])+(OverHat[b])x, where (OverHat[a]) and (OverHat[b]) are the least-squares estimates. The x's are ordered from smallest to largest and for any particular observation number i that is selected, a double arrow is used to indicate (Subscript[μ, i])=a+b (Subscript[x, i]), (Subscript[(OverHat[y]), i])=(OverHat[a])+(OverHat[b])(Subscript[x, i]), (Subscript[ϵ, i])=(Subscript[y, i])-(Subscript[μ, i]), or (Subscript[e, i])=(Subscript[y, i])-(Subscript[(OverHat[y]), i]). In the thumbnail, μ has been selected with i=5, so the double arrow shows the value of (Subscript[μ, 5]). The numerical values of these quantities are displayed when you mouseover one of the data points. Select some other observation numbers. Can you give approximate values for the quantities shown by the arrows? Check your answer by mousing over the selected observation.

Manipulate[Module[{x,e,y,pts,mu,ϵ,yHat,ans,aH,bH,mrk,t1,t2,t3,t4,tt,pts2},
SeedRandom[sr];
x=Sort[RandomVariate[UniformDistribution[{0,10}],n]];
e=RandomVariate[NormalDistribution[0,1.5], n];
y=a+b*x+e;
pts=Transpose[{x,y}];
mu = a+b x;
ϵ=y-mu;
yHat=(ans=Fit[pts,{1,𝔵},{𝔵}])/.𝔵->x;
{aH,bH}=CoefficientList[ans,𝔵];
e=y-yHat;
mrk=Switch[ind,
"μ",{Arrowheads[{-Asz,Asz}],Arrow[{{x[[iObs]],0},{x[[iObs]],mu[[iObs]]}}]},
OverHat["y"],{Arrowheads[{-Asz,Asz}],Arrow[{{x[[iObs]],0},{x[[iObs]],yHat[[iObs]]}}]},
"ϵ",{Arrowheads[If[Abs[ϵ[[iObs]]]<1,{0.01,0.01},{-Asz,Asz}]],Arrow[{{x[[iObs]],mu[[iObs]]},{x[[iObs]],y[[iObs]]}}]},
"e",{Arrowheads[If[Abs[ϵ[[iObs]]]<1,{0.01,0.01},{-Asz,Asz}]],Arrow[{{x[[iObs]],yHat[[iObs]]},{x[[iObs]],y[[iObs]]}}]}
];
t1=Row[{"ϵ = ",#}]&/@ϵ;
t2=Row[{"μ = ",#}]&/@mu;
t3=Row[{Style["e",Italic]," = ",#}]&/@e;
t4=Row[{ OverHat[Style["y",Italic]]," = ",#}]&/@yHat;
tt=Transpose[{t1,t3,t2,t4}];
pts2=MapThread[Tooltip[#1,#2]&,{pts,tt}];
ListPlot[pts2,Axes->False,Frame->True,FrameLabel->{Style["x",Italic],Style["y",Italic]},PlotRange->{{mnx,mxx},{0,10}},PlotStyle->{Brown,PointSize[Large]},RotateLabel->False,Epilog->{mrk,
Thickness[Large],Red,Opacity[0.5],Line[{{mnx,a+b*mnx},{mxx,a+b*mxx}}],
Blue,Opacity[0.5],Line[{{mnx,aH+bH*mnx},{mxx,aH+bH*mxx}}]},
PlotLabel->Row[{Style["true line",Red]," and ",Style["estimated line",Blue]}],ImageSize->1.15{450,350}]
],
{{iObs,5,"observation number"},1,n,1,Appearance->"Labeled"},
{{ind,"μ","indicate: "},{"μ"->"μ",OverHat["y"],"ϵ"->"ϵ","e"->Style["e",Italic]}},
{{sr,5983,"random seed"},4971,72345,1,Appearance->"Labeled",ControlPlacement->Top,AnimationRate->1/2},
TrackedSymbols:>{sr,iObs,ind},
AutorunSequencing->{1,3},
Initialization:> (
n=10;a=1.0; b=0.7;mnx=0.0;mxx=10.0;Asz=0.025;
)
]

Coke, Coca-Cola, VW, Apple

{startDate=(Today//Normal)[[1;;2]]-{5,0},endDate=(Today//Normal)[[1;;2]]}
companies={"SP500","Coke","KO","F:VOW","AAPL"};
DateObject[]
Text@Grid[Prepend[ Map[{#,FinancialData[#,"Company"],FinancialData[#]}&,companies],{"Ticker","Name","Actual Price"}],Frame->All]

DateObject[]
returnsMonthlyWithDates=Map[FinancialData[#,"Return",{startDate,endDate,"Month"}]&,companies];
returnsMonthlyValues=Map[FinancialData[#,"Return",{startDate,endDate,"Month"},"Value"]&,companies];

returnsAssociation=Association[Thread[companies->returnsMonthlyValues]];
Keys[returnsAssociation]
Map[Length,Values[returnsAssociation]]

DateListPlot[returnsMonthlyWithDates,PlotLegends->companies,PlotRange->All,PlotStyle->Thick]

linearModelsCompanies=Association[Thread[Rest[companies]->Map[LinearModelFit[Transpose[{returnsAssociation["SP500"],returnsAssociation[#]}],x,x]&,Rest[companies]]]]

Estimates of α, β, their standard errors, t-statistic, p-value, (R^2):

parameterTableCompanies=Map[{#["ParameterTable"],#["RSquared"]}&,linearModelsCompanies]

95 per cent confidence intervals for α, β:

(parameterConfidenceIntervalsCompanies=Map[#["ParameterConfidenceIntervals"]&,linearModelsCompanies])//Dataset

parametersCompanies=Map[#["BestFitParameters"]&,linearModelsCompanies]

Recall CAPM  for asset n: (Subscript[r, n])-(Subscript[r, 0])=(Subscript[β, n])((Subscript[μ, M])-(Subscript[r, 0])). From the estimated regression equation (Subscript[r, n])=(OverHat[(Subscript[α, n])])+(OverHat[(Subscript[β, n])])(Subscript[μ, M])  we may estimate the risk free rate as (OverHat[(Subscript[r, 0])])=(OverHat[(Subscript[α, n])])/(1-(OverHat[(Subscript[β, n])])):

Row@{"Risk free rate estimates (OverHat[(Subscript[r, 0])]):  ",(riskFreeRateEstimate=Map[((#[[1]])/(1-#[[2]]))&,parametersCompanies]),"\nAverage of the above:   " ,Mean[riskFreeRateEstimate] }

DJI

membersDJI={"3M","American Express","Apple","Boeing","Caterpillar","Chevron","Cisco","Coca-Cola","Disney","DuPont","Exxon Mobil","General Electric","Goldman Sachs","Home Depot","Intel","IBM","Johnson & Johnson","JPMorgan Chase","McDonald's","Merck & Co.","Microsoft","Nike","Pfizer","Procter & Gamble","Travelers","UnitedHealth","United Technologies","Verizon Communications","Visa","Wal-Mart Stores"};
Clear[MMM,AXP,AAPL,BA,CAT,CVX,CSCO,KO,DIS,DD,XOM,GE,GS,HD,INTC,IBM,JNJ,JPM,MCD,MRK,MSFT,NKE,PFE,PG,TRV,UNH,UTX,VZ,V,WMT]
tickersDJI=Map[ToString,{MMM,AXP,AAPL,BA,CAT,CVX,CSCO,KO,DIS,DD,XOM,GE,GS,HD,INTC,IBM,JNJ,JPM,MCD,MRK,MSFT,NKE,PFE,PG,TRV,UNH,UTX,VZ,V,WMT}];
(* Add the returns of the market portfolio, i. e., SP500 *)tickersDJI=Join[{"SP500",tickersDJI}]//Flatten

{startDate=(Today//Normal)[[1;;2]]-{5,0},endDate=(Today//Normal)[[1;;2]]}

DateObject[]
returnsMonthlyWithDates=Map[FinancialData[#,"Return",{startDate,endDate,"Month"}]&,tickersDJI];
returnsMonthlyValues=Map[FinancialData[#,"Return",{startDate,endDate,"Month"},"Value"]&,tickersDJI];

2015-12-12 The above operation timing 126 sec, 67 sec, 44 sec

returnsAssociation=Association[Thread[tickersDJI->returnsMonthlyValues]];
iKeys=Keys[returnsAssociation]
iLengths=Map[Length,Values[returnsAssociation]]

Sometimes it may happen that two or more companies have only one element. The above list looks like {59,59,59,1,59,...,59,1,59,59,...}. Obviously wrong. What are these companies? We use the following construction with a possible result:

Select[returnsAssociation,Length[#]==1&]
\[LeftAssociation]"HD"->Missing["NotAvailable"],"JNJ"->Missing["NotAvailable"]\[RightAssociation]

(* Select[returnsAssociation,Length[#]==1&] *)

It follows that at the moment of downloading the data of these two companies were not available.

DateListPlot[returnsMonthlyWithDates,PlotLegends->tickersDJI,PlotRange->All,PlotStyle->Thick]

Next we perform the linear regression of the company return on the return of SP500 (proxy for the market portfolio) for all 30 companies. Explanation: The first element In tickersDJI are the returns SP500. We simply use Rest to work with dependent variables returns DJI only. The result is the association.

linearModelstickersDJI=Association[Thread[Rest[tickersDJI]->Map[LinearModelFit[Transpose[{returnsAssociation["SP500"],returnsAssociation[#]}],x,x]&,Rest[tickersDJI]]]]

Estimates of α, β, their standard errors, t-statistic, p-value, (R^2):

parameterTabletickersDJI=Map[{#["ParameterTable"],#["RSquared"]}&,linearModelstickersDJI]

95 per cent confidence intervals for α, β:

(parameterConfidenceIntervalstickersDJI=Map[#["ParameterConfidenceIntervals"]&,linearModelstickersDJI[[1;;15]]])//Dataset
(parameterConfidenceIntervalstickersDJI=Map[#["ParameterConfidenceIntervals"]&,linearModelstickersDJI[[16;;30]]])//Dataset

(* Estimated {α,β} for every company *) parameterstickersDJI=Map[#["BestFitParameters"]&,linearModelstickersDJI]

Recall CAPM  for asset n: (Subscript[r, n])-(Subscript[r, 0])=(Subscript[β, n])((Subscript[μ, M])-(Subscript[r, 0])). From the estimated regression equation (Subscript[r, n])=(OverHat[(Subscript[α, n])])+(OverHat[(Subscript[β, n])])(Subscript[μ, M])  we may estimate the risk free rate as (OverHat[(Subscript[r, 0])])=(OverHat[(Subscript[α, n])])/(1-(OverHat[(Subscript[β, n])])):

Row@{"Risk free rate estimates (OverHat[(Subscript[r, 0])]):  ",(riskFreeRateEstimate=Map[((#[[1]])/(1-#[[2]]))&,parameterstickersDJI]),"\n\nAverage of the above:   " ,Mean[riskFreeRateEstimate] }

Histogram[riskFreeRateEstimate]

***Auxilliary calculations and actual prices

DateObject[]
Text@Grid[Prepend[ Map[{#,FinancialData[#,"Company"],FinancialData[#]}&,tickersDJI],{"Ticker","Name","Actual Price"}],Frame->All]

***Relationship between SP500 and DJI

{startDate=(Today//Normal)[[1;;2]]-{5,0},endDate=(Today//Normal)[[1;;2]]}
indicesSP500DJI={"SP500","^DJI"};
DateObject[]
Text@Grid[Prepend[ Map[{#,FinancialData[#,"Company"],FinancialData[#]}&,indicesSP500DJI],{"Ticker","Name","Actual Price"}],Frame->All]

DateObject[]
returnsMonthlyWithDates=Map[FinancialData[#,"Return",{startDate,endDate,"Month"}]&,indicesSP500DJI];
returnsMonthlyValues=Map[FinancialData[#,"Return",{startDate,endDate,"Month"},"Value"]&,indicesSP500DJI];

2015-11-06 The above operation timing 126 sec, 67 sec, ...

returnsAssociation=Association[Thread[indicesSP500DJI->returnsMonthlyValues]];
iKeys=Keys[returnsAssociation]
iLengths=Map[Length,Values[returnsAssociation]]

djiReturns=FinancialData["^DJI","Return",{startDate,endDate,"Month"},"Value"]

Sometimes it may happen that two or more companies have only one element. The above list looks like {59,59,59,1,59,...,59,1,59,59,...}. Obviously wrong. What are these companies? We use the following construction with a possible result:

Select[returnsAssociation,Length[#]==1&]
\[LeftAssociation]"HD"->Missing["NotAvailable"],"JNJ"->Missing["NotAvailable"]\[RightAssociation]

Select[returnsAssociation,Length[#]==1&]

(* Select[returnsAssociation,Length[#]==1&] *)

It follows that at the moment of downloading the data of these two companies were not available.

DateListPlot[returnsMonthlyWithDates,PlotLegends->indicesSP500DJI,PlotRange->All,PlotStyle->Thick]

Next we perform the linear regression of the company return on the return of SP500 (proxy for the market portfolio) for all 30 companies. Explanation: The first element In indicesSP500DJI are the returns SP500. We simply use Rest to work with dependent variables returns DJI only. The result is the association.

linearModelsindicesSP500DJI=Association[Thread[Rest[indicesSP500DJI]->Map[LinearModelFit[Transpose[{returnsAssociation["SP500"],returnsAssociation[#]}],x,x]&,Rest[indicesSP500DJI]]]]

Estimates of α, β, their standard errors, t-statistic, p-value, (R^2):

parameterTableindicesSP500DJI=Map[{#["ParameterTable"],#["RSquared"]}&,linearModelsindicesSP500DJI]

95 per cent confidence intervals for α, β:

(parameterConfidenceIntervalsindicesSP500DJI=Map[#["ParameterConfidenceIntervals"]&,linearModelsindicesSP500DJI[[1;;15]]])//Dataset
(parameterConfidenceIntervalsindicesSP500DJI=Map[#["ParameterConfidenceIntervals"]&,linearModelsindicesSP500DJI[[16;;30]]])//Dataset

(* Estimated {α,β} for every company *) parametersindicesSP500DJI=Map[#["BestFitParameters"]&,linearModelsindicesSP500DJI]

Recall CAPM  for asset n: (Subscript[r, n])-(Subscript[r, 0])=(Subscript[β, n])((Subscript[μ, M])-(Subscript[r, 0])). From the estimated regression equation (Subscript[r, n])=(OverHat[(Subscript[α, n])])+(OverHat[(Subscript[β, n])])(Subscript[μ, M])  we may estimate the risk free rate as (OverHat[(Subscript[r, 0])])=(OverHat[(Subscript[α, n])])/(1-(OverHat[(Subscript[β, n])])):

Row@{"Risk free rate estimates (OverHat[(Subscript[r, 0])]):  ",(riskFreeRateEstimate=Map[((#[[1]])/(1-#[[2]]))&,parametersindicesSP500DJI]),"\n\nAverage of the above:   " ,Mean[riskFreeRateEstimate] }

Histogram[riskFreeRateEstimate]

Porovnání rychlostí (“výkonostní porovnání”)

Podrobnosti viz

Zdeněk Buk
zdenek.buk@fel.cvut.cz
Katedra počítačů, FEL, ČVUT

http://www.mathematica.cz/download/doc/2014/setkani/Buk-2014-Mathematica10Novinky.zip

Úloha: Dány vektory {identifikátor, číslo1, ..., číslo10}, konkrétně třeba {“id-52”,3,5,5,3,2,3,9,1,9,2}. Z této množiny vektorů  vybrat podmnožinu s předem zadanými identifikátory.

Seznam (List)

Clear[n]
n=100000;

(* Permutace *)RandomSample[{a,b,c,d}]

SeedRandom[13];
(* Náhodná permutace vektorů typu" *)
(* {"id-52",3,5,5,3,2,3,9,1,9,2} *)
lData=RandomSample@Table[Join[{"id-"<>ToString[i]},RandomInteger[{1,10},{10}]],{i,n}];
Take[lData,7]

ByteCount[lData]/1024^2.

Select[lData,#[[1]]=="id-1000"&]

AbsoluteTiming[Table[id="id-"<>ToString@i;
Select[lData,#[[1]]==id&],
{i,1,100}]
]

Rychlejší je použití Cases:

Cases[lData,{"id-1000",___}]

AbsoluteTiming[Table[id="id-"<>ToString@i;
Cases[lData,{id,___}],
{i,1,100}]
]

Lokální pravidla (Rules)

rData=Map[First[#]->#&,lData];
Take[rData,3]

"id-1000"/.rData

AbsoluteTiming[Table[id="id-"<>ToString[i];
id/.rData,
{i,1,100}];
]

Asociace (Associations)

aData=Association[Map[First[#]->#&,lData]];
Take[aData,3]

aData["id-1000"]

AbsoluteTiming[Table[id="id-"<>ToString[i];
aData[id],
{i,1,100}];
]

Keys[aData]

***Příklad (reálná data VW okolo krize září 2015, ARIMA model, predikce)

Autoregressive integrated moving average ARIMA(p,d,q) process

(Integrovaný smíšený proces řádu p,d,q)

Time series (Subscript[X, 0]),(Subscript[X, 1]),...

(1-(∑_(i=1)^p) (Subscript[ϕ, i])(L^i))(((1-L))^d) (Subscript[X, t])= (1+(∑_(i=1)^q)(Subscript[θ, i]) (L^i) )(Subscript[ϵ, t])

Here L is the lag operator (operátor zpoždění): L,(Subscript[X, t])=(Subscript[X, t-1]), (L^2)(Subscript[X, t])=L(L,(Subscript[X, t]))=L,(Subscript[X, t-1])=(Subscript[X, t-2]), &c. The error terms (Subscript[ϵ, t]) are generally assumed to be uncorrelated or independent, identically distributed variables (iid), (Subscript[θ, i]), (Subscript[ϕ, i]) are parameters.

Speciální případy:

Clear[arima];arima[p_,d_,q_,drift_:0]:=Module[{iexpand},iexpand=Expand[(1-(∑_(i=1)^p)(Subscript[ϕ, i])(L^i))(((1-L))^d)(Subscript[X, t])==drift+(1+(∑_(i=1)^q)(Subscript[θ, i])(L^i))(Subscript[ϵ, t])];
iexpand/.{L (Subscript[X, t])->(Subscript[X, t-1]),L (Subscript[ϵ, t])->(Subscript[ϵ, t-1]),(L^(i_))(Subscript[X, t])->(Subscript[X, t-i]),(L^(i_))(Subscript[ϵ, t])->(Subscript[ϵ, t-i])}//Simplify//TraditionalForm]

Náhodná procházka:

arima[0,1,0]

Náhodná procházka s driftem:

arima[0,1,0,c]

Autoregresní posloupnost 1. řádu a 2. řádu:

{arima[1,0,0],arima[2,0,0]}

Klouzavé součty 1. řádu a 2. řádu :

{arima[0,0,1],arima[0,0,2]}

Něco složitějšího:

arima[0,2,0]

arima[2,2,2]//FullSimplify

Volkswagen data

(* today *)
Text@Row@{"Price VW   ",DateString[],"  ",FinancialData["F:VOW"]}
(* Prices and returns for the period Aug 31 2014 to Aug 31 2015 *)
pricesVW=FinancialData["F:VOW",{{2014,8,31},{2016,12,9}}];
returnswithdatesVW=FinancialData["F:VOW","Return",{{2014,8,31},{2016,12,9}}];
returnsVW=Map[Last,returnswithdatesVW];
Text@Row@{"Cena   ",pricesVW//Last,"   Výnos   ",returnswithdatesVW//Last}
plotpricesVW=DateListPlot[pricesVW,PlotRange->All,PlotLabel->"Prices VW",PlotStyle->Thick]

Find the best model from the wide class of models (see Help to TimeSeriesModelFit).

(* old *)modelVW=TimeSeriesModelFit[pricesVW]
%//Normal

This is a random walk with drift -0.00286071. Sundays, Saturdays, and public holidays are not the trading days. Hence the data have been resampled (missing observations have been interpolated).

(* new *)modelVW=TimeSeriesModelFit[pricesVW]
%//Normal

arima[0,1,3,c]

Simulations of this for the next 30 days: 50 paths (trajectories) - possible development:

Show[plotpricesVW,DateListPlot[RandomFunction[modelVW,{1,30},50],Joined->True],PlotRange->All]

95 per cent confidence interval for the end of September, the forecast, and the actual price:

Text@Row@{"Interval     ",modelVW["PredictionLimits"][{2015,9,30}],"\nForecast    ",TimeSeriesForecast[modelVW,{30}]//Normal//Last//Last,"\nActual price    ",FinancialData["F:VOW",{{2015,9,30},{2015,9,30}}]}

Text@Row@{"Interval     ",modelVW["PredictionLimits"][{2015,12,9}],"\nForecast    ",TimeSeriesForecast[modelVW,{30}]//Normal//Last//Last,"\nActual price    ",FinancialData["F:VOW"]}

(* *** *)propertiesVW=modelVW["Properties"]
Map[modelVW,propertiesVW]

DateListPlot[{modelVW["TemporalData"],TimeSeriesForecast[modelVW,{30}]}]

Forecast and reality:

Show[{DateListPlot[FinancialData["F:VOW",{{2015,9,1},{2015,9,30}}]],DateListPlot[TimeSeriesForecast[modelVW,{30}],PlotStyle->Red]}]

A more complicated model ARIMA[2,2,2]:

modelVWARIMA222=TimeSeriesModelFit[pricesVW,{"ARIMA",{2,2,2}}]
%//Normal

Show[{DateListPlot[FinancialData["F:VOW",{{2015,9,1},{2015,9,30}}]],DateListPlot[TimeSeriesForecast[modelVWARIMA222,{30}],PlotStyle->Red]}]

The returns:

DateListPlot[returnswithdatesVW]

**Attempts to find automatically the the “best” distribution of returns. Here the best three distributions. Resulted in a nonsense:

FindDistribution[returnsVW,3,All]

(distributionOfReturnsVW=FindDistribution[returnsVW,3])//TableForm
{Mean[returnsVW],StandardDeviation[returnsVW]}

Map[Plot[PDF[#,x],{x,-.3,.3}]&,distributionOfReturnsVW]

Map[DistributionFitTest[returnsVW,#]&,{distributionOfReturnsVW,NormalDistribution[0.00020305514487322865`,0.01697335610163311`]}//Flatten]

Plot[Map[PDF[#,x]&,distributionOfReturnsVW]//Evaluate,{x,-.3,0.3},PlotRange->All]

Show[Histogram[returnsVW,Automatic,"PDF",Epilog->First@Plot[PDF[distributionOfReturnsVW//First,x],{x,-0.07,0.07},PlotStyle->Red]]]

Principy programování 1

Příklady definicí

Definice (funkce logaritmus)

Definice je prepisovaci pravidlo, ktere je automaticky pouzito na libovolny vyraz. Priklad na definici logaritmu:

Clear[log];
log[x_*y_]:=log[x]+log[y]
{log[2x (y^2)],log[2x y y]}
{(y^2)//FullForm, (y y)//FullForm,HoldForm[y y]//FullForm}

Prestoze z matematickeho hlediska je (y^2) (Power) totez, co y*y (Times), potrebujeme dalsi prepisovaci pravidlo, protoze porovnani vzoru (pattern matching) je v zasade syntakticke, a ne semanticke!

log[((a_)^(n_))]:=n*log[a]
log[2x (y^2)]
?log

log[x*2*y^3*z]

Definice primitivní funkce

Hyperlink[Button["Defining Your Own Integration Function"],"paclet:tutorial/AnExampleDefiningYourOwnIntegrationFunction"]

Vlastni definice funkce integrate[f,x]=∫f[x]dx

Principy

({{mathematical form, Mathematica definition}, {∫(y+z)dx==∫ydx+∫zdx, integrate[y_+z_,x_]:=integrate[y,x]+integrate[z,x]}, {∫cydx==c∫ydx (c independent of x), integrate[c_y_,x_]:=c integrate[y,x]/;FreeQ[c,x]}, {∫cdx==cx, integrate[c_,x_]:=cx/;FreeQ[c,x]}, {∫(x^n)dx==((x^((n+1)))/(n+1)), n≠-1, integrate[x_^n_.,x_]:=x^(n+1)/(n+1)/;FreeQ[n,x]&&n!=-1}, {∫(1/(ax+b))dx==((log(ax+b))/a), integrate[1/(a_.x_+b_.),x_]:=Log[ax+b]/a/;FreeQ[{a,b},x]}, {∫(e^(ax+b))dx==(1/a) (e^(ax+b)), integrate[Exp[a_.x_+b_.],x_]:=Exp[ax+b]/a/;FreeQ[{a,b},x]}})

tutorial/OptionalAndDefaultArguments

Hyperlink[Button["Default _."],"paclet:tutorial/OptionalAndDefaultArguments"]

Realizace:

Clear[integrate,a,b,c];

integrate[y_+z_,x_]:=integrate[y,x]+integrate[z,x]

integrate[a x+b x^2+3,x]

integrate[c_ y_,x_]:=c integrate[y,x]/;FreeQ[c,x]

integrate[a x+b x^2+3,x]

integrate[c_,x_]:=c x/;FreeQ[c,x]

integrate[a x+b x^2+3,x]

Chybí-li exponent, doplní se nula:

integrate[x_^n_.,x_]:=x^(n+1)/(n+1)/;FreeQ[n,x]&&n!=-1

integrate[a x+b x^2+3,x]

(* Jestliže chybí a, dosadí se místo něj 1, chybí-li b, dosadí se 0: *)integrate[1/(a_. x_+b_.),x_]:=Log[a x+b]/a/;FreeQ[{a,b},x]

integrate[1/x,x]

integrate[1/(2 p x-1),x]//TraditionalForm

integrate[Exp[a_. x_+b_.],x_]:=Exp[a x+b]/a/;FreeQ[{a,b},x]

?integrate

***Apart

(1/((1+x)(1+2x)(1+(x^2))))//Apart

Dobré i při počítání s vytvořujícími funkcemi pravděpodobností.

iP=Product[(1/(((1+i x))^i)),{i,5}]
p5=D[iP,{x,5}]//Simplify
iPApart=iP//Apart
p5Apart=D[iPApart,{x,5}]//Simplify
p5/.x->0

D[1/((((1+x))^10)(((1+2x))^5)),x]

Různé programovací styly 1 (Četnosti)

Nasledujici funkce zjistuji cetnosti v posloupnosti prirozenych nahodnych cisel 1,...,10. (Diskretni rovnomerne rozdeleni R(1,...,10)

Proceduralni styl

SeedRandom[130];
(* data=Table[Random[Integer,{1,10}],{100}]; *)
data=RandomInteger[{1,10},{100}];

proc[x_]:=Module[{bins=Table[0,{10}]},
Do[bins[[x[[i]]]]++,{i,1,Length[x]}];bins]
pr=proc[data]
Total[pr]

Funkcionalni styl (Dulezite!)

Clear[fun];
fun[x_?VectorQ]:=fun[Function[y,{y,1}],x]
fun[x_?VectorQ]:=fun[Map[{#,1}&,x]]
fun[{1,2,3,2}]

Poznamka: _ prave jeden argument, __ jeden a vice argumentu, ___ nula a vice argumentu, x___

fun[{a___,{b_,n_},c___,{b_,m_},d___}]:=fun[{a,{b,n+m},c,d}]
fun[{1,2,3,2}]

SeedRandom[131313];
rc1=RandomChoice[Range[5],15]
fun[rc1]

fun[a_List]:=Map[Last,a];
fun[rc1]
fun[rc1//Sort]

My ale jeste chceme znat hodnoty, ke kterym se cetnosti vztahuji. Pozor, přepíše horní definici fun[a_List]:=Map[Last,a]!!!

fun[a_List]:=a//Sort;
Text@Grid[(cetnosti=fun[rc1]),Frame->True]

?fun

Mathematica styl

SeedRandom[130];
(* data=Table[Random[Integer,{1,10}],{100}]; *)
data=RandomInteger[{1,10},{100}];

Table[{i,Count[data,i]},{i,10}]

Lepsi realizace je ale:

Map[Count[data,#]&,Union[data]]
Map[{#,Count[data,#]}&,Union[data]]

Funkce Tally 1

Tally[{c,b,a,a,a,b,a,c,b,a}]
%//Sort

*Funkce Tally 2

Slozitejsi priklad: za identicke se povazuji elementy se stejnou hlavickou.

t1=Tally[{{a,b},{w,x,y,z},E,a,vvv,11111,{w,x,y,z},2,3,4,5,E},Head[#1]===Head[#2]&]
Map[{Head[#//First],#//Last}&,t1]

Tally[Map[Head,{{a,b},{w,x,y,z},E,a,vvv,11111,{w,x,y,z},2,3,4,5,E}]]

Vsimneme si, jake jsou hlavicky prvku v uvedenem listu:

Map[Head,{{a,b},{w,x,y,z},E,a,vvv,11111,{w,x,y,z},2,3,4,5,E}]

*Funkce Tally 3 (komplikovany, ale dulezity priklad, zahrnuje též úvod do práce s importovanymi soubory a jejich zpracování, zpracování textu Shakespeare Hamlet)

Nejdrive ukazka funkce FileNames[ ]:

$Path

Directory[]
FileNames[]

Klicova konstrukce pro export a import (usnadnuje prenositelnost). Nastavi adresar na stejny adresar, ve kterem je spusten tento notebook.

SetDirectory[NotebookDirectory[]]
FileNames[]

Sada datovych souboru, nekdy je nutne pripojeni k Internetu

ExampleData[]

ExampleData["Text"]

ExampleData[{"Text","UNHumanRightsChinese"}]

textHamlet=StringTake[ExampleData[{"Text","Hamlet"}],1000(* 10000*)];

StringTake[ExampleData[{"Text","Hamlet"}],1000]

Cetnosti podle vyskytujicich se znaku v poradi, jak se v textu vyskytuji:

tallyHamlet=Tally[Characters[textHamlet]]
Dimensions[%]

Overime, kolik tech znaku je (dva zpusoby):

{Total[Map[Last,tallyHamlet]],Total[Transpose[tallyHamlet][[2]]]}

Total[tallyHamlet]//Last

Nejcetnejsi znaky

Map[Reverse,Sort[Map[Reverse,tallyHamlet]]]//Reverse

Lze také užít

Sort[tallyHamlet,#1[[2]]>#2[[2]]&]

Cetnosti slov (Nejdrive pouzijeme funkci StringSplit)

StringSplit[kratkyretezec="StringSplit rozdeli retezec na podretezce, bez dalsi specifikace podle mezer. Je vsak mozne pouzit i jine oddelovace. Ukazeme v uplne forme."]//FullForm

Je vhodne ignorovat velka a mala pismena:

ToLowerCase[kratkyretezec]
ToLowerCase[StringSplit[kratkyretezec]]

Funguje i na cestinu:

ToLowerCase["Řeči, Šupiny"]

Aplikace na Hamleta:

vsechnyznaky=Union[Characters[textHamlet//ToLowerCase]]
Text@Row@{"Vsechny znaky, ktere nejsou pismeny:\n",(vsechnyznakykterenejsoupismeny=Complement[vsechnyznaky,CharacterRange["a","z"]])//InputForm (* pouzito misto FullForm *)}
(* Doplnek doplnku *)Complement[vsechnyznaky,Complement[vsechnyznaky,CharacterRange["a","z"]]]

vsechnyznakykterenejsoupismeny

slovaslovaslova=StringSplit[textHamlet]//ToLowerCase;
cetnostislovaslovaslova=Tally[slovaslovaslova]

(* Setridene podle abecedy *)
Sort[cetnostislovaslovaslova]
%//Length

Vidime jistou nedokonalost naseho postupu - “all” a “all,” jsou povazovana za dve ruzna slova. Spravne bychom museli pouzit i oddelovace “,”, “.”, “!”, “?” a mozna i jine. Takove znaky jsou vsak jiz v souboru

vsechnyznakykterenejsoupismeny//FullForm

Takze

slovaslovaslovanew=StringSplit[textHamlet,vsechnyznakykterenejsoupismeny]//ToLowerCase;
cetnostislovaslovaslovanew=Tally[slovaslovaslovanew]

Sort[cetnostislovaslovaslovanew]
%//Length

Setridene podle cetnosti vzestupne, tedy podle druheho elementu

cetnostislovaslovaslovanewsort=Sort[cetnostislovaslovaslovanew,#1[[2]]<#2[[2]]&]

Setridene podle cetnosti sestupne  a v pripadech, kdy jsou cetnosti stejne, pak podle abecedy.

Realizace: Nejdrive se setridi podle slov (cetnostislovaslovaslovanew//Sort) a potom podle druhe slozky setridime sestupne. To prvni trideni zustane zachovano.

(* Setridene podle cetnosti sestupne *)
Sort[cetnostislovaslovaslovanew//Sort,#1[[2]]≥#2[[2]]&]

Ilustrace predchozich kroku na matici 5×3 (Prostudujte Help pro funkci Sort)

SeedRandom[130];
(souborN0153=RandomVariate[NormalDistribution[],{5,3}])//TableForm
(* Trideni podle 2. sloupce *)
Sort[souborN0153,#1[[2]]<#2[[2]]&]//TableForm
(* ekvivalentne *)
Sort[souborN0153,Function[{x,y},x[[2]]<y[[2]]]]//TableForm

(* Trideni podle 3. sloupce *)Sort[souborN0153,#1[[3]]<#2[[3]]&]//TableForm

Vybrat vsechna slova s cetnosti 5

Select[cetnostislovaslovaslovanewsort,#[[2]]==5&]

Substitucni pravidla (lokalni pravidla, replacement rules, rule-based programming)

Lokalni pravidla se aplikuji zleva doprava, kazde jenom jednou

{1,2,3,2,3,1,2,4}/. 3->"a"/.x_Integer->0

(* Pocet vyskytu cisla 3 v uvedenem seznamu *)v1={1,2,3,2,3,1,2,4}/. 3->"a"/.x_Integer->0/."a"->1
Total[v1]

Clear[pravidla];
pravidla[data_List,n_]:=
Total[data/.n->"a"/.x_Integer->0/."a"->1]
pravidla[data={1,2,3,2,3,1,2,4},2]
pravidla[{1,2,3,2,3,1,2,4},3]

Map[pravidla[data,#]&,Range[10]-1]
Map[{#,pravidla[data,#]}&,Union[data]]

char2=Characters["Map[pravidla[data,#]&,Range[10]] Map[pravidla[data,#]&,Union[data]]'"]

Clear[pravidla2];
pravidla2[data_List,n_]:=
Count[data,n]
pravidla2[{"a","p","[","p","r","a","v"},"p"]

(cetnosti2={u2=Union[char2],Map[pravidla2[char2,#]&,u2]}//Transpose)//TableForm

Pozor, pri importu souboru (napr. z Excelu) mohou vzniknout zaludnosti tohoto typu (opticky se mezera v obou pripadech tvari stejne).

{" "//FullForm," "//FullForm}

" "

Nejcetnejsi znak:

sort2=Sort[cetnosti2,#1[[2]]>#2[[2]]&]

Vybrat znaky s cetnosti 2:

vsechnycetnosti=Union[Map[Last,sort2]]//Reverse
Select[sort2,#[[2]]==2&]//Sort

Znaky se stejnymi cetnostmi jsou v jednom listu (ukazka vnorene ryzi (anonymni) funkce):

sdruzenecetnosti=Map[Function[x,Select[sort2,#[[2]]==x&]//Sort],vsechnycetnosti]//TableForm

Setrideni uvnitr seznamu se stejnou cetnosti sestupne

Map[Sort[#,Smaller]&,sdruzenecetnosti]

Sort[{{"i",3},{"n",3},{"t",3}},#1[[1]]>#2[[1]]&]

{CharacterRange["a","c"],{1,2,3}}//Transpose//Reverse

SeedRandom[131];
randomarray=RandomReal[{0,1},{4,3}]
Sort[randomarray]
Sort[randomarray,#1[[2]]>#2[[2]]&]

Sort[{CharacterRange["a","c"],{1,2,3}}//Transpose,#1[[1]]>#2[[1]]&]

Prehledne usporadani

(tab2=Map[Function[x,Select[sort2,#[[2]]==x&]//Sort],vsechnycetnosti])//TableForm

Partition[Flatten[tab2],2]//TableForm

Map[Reverse,Partition[Flatten[tab2],2]]//TableForm

Poznamka (připomenutí: rozdil v pouziti Reverse, v prvnim pripade na radky, v druhem pomoci Map na sloupce)

mat123=(({{a, b}, {c, d}, {e, f}}));
Reverse[mat123]//MatrixForm
Map[Reverse,mat123]//MatrixForm

Principy programování 2

Různé programovací styly 2 (Ilustrace Fibonacci a řešení diferenčních rovnic)

Fibonacciova posloupnost je definovana rekurentne (Subscript[f, n])=(Subscript[f, n-1])+(Subscript[f, n-2]) s pocatecnimi hodnotami (Subscript[f, 1])=1, (Subscript[f, 2])=1.

Fibonacci A

Remove[fibS];
fibS[1]=1;
fibS[2]=1;
fibS[n_]:=fibS[n-1]+fibS[n-2]

Toto je primocara, ale spatna definice,  (ma mnoho nedostatku, nektere jsou patrne ihned, nektere odhalime pozdeji)

Table[fibS[j],{j,6}]
Map[fibS,Range[6]]

Toto nefunguje:

fibS[3.5]

fibS[270]

$RecursionLimit

$RecursionLimit=5000;
fibS[3.5]

fibS[270]

fibS[-3]

Trivialni definice, s kosmetickymi vylepsenimi:

Remove[fibA];
fibA[1]=1;
fibA[2]=1;
fibA[n_?IntegerQ]:=fibA[n-1]+fibA[n-2]/;Positive[n]

(* ekvivalentne *)
fibA2[1]=1;
fibA2[2]=1;
fibA2[n_?(IntegerQ[#]&&Positive[#]&)]:=fibA2[n-1]+fibA2[n-2]

Tady uzivame test, zda n je cele cislo a navic, jestli je kladne.

{fibA[3],fibA[4],fibA[-6],fibA[3.4],fibA[10]}
{fibA2[3],fibA2[4],fibA2[-6],fibA2[3.4],fibA2[10]}

Casova narocnost je velka (za cviceni zjistete řád a proč).

fibA[29]//Timing

(fibA[31]//Timing)[[1]]
(* nebo *)
Timing[fibA[31];]//First

ListPlot[Table[(fibA[j]//Timing)[[1]],{j,24}],Joined->True,PlotRange->All,PlotStyle->{Orange,Thick}]

?fibA2

Fibonacci B (tzv. Dynamické programování, velmi důležité z hlediska praxe !!!)

Poznamenejme, ze pojem "Dynamicke programovani" je pouzivan v jinych oblastech v odlisnem kontextu. Podobně jako "normální".

Vyhodou je, kdyz si jiz vypocitane hodnoty muzeme zapamatovat. To Mathematica umoznuje nasledujici konstrukci:

f[n,_]:=f[n]=f[n libovolna definice]

Clear[fibB];
fibB[1]=fibB[2]=1;
fibB[n_?(IntegerQ[#]&&Positive[#]&)]:=fibB[n]=fibB[n-1]+fibB[n-2]

?fibB

MaxMemoryUsed[]

Vsimneme si, jak se po vyvolani definice funkci A a B lisi:

{fibA[6],fibB[6]}

?fibA

?fibB

Vsimneme si casu potrebneho pro vypocet:

fibB[240]//Timing

MaxMemoryUsed[]

?fibB

fibB[350]

***Zmena hodnoty systemove promenne, uvidime, ze to bude nezbytne pri hodnoceni americkych opci:

Po provedeni Evaluation ⟶ Quit Kernel  ⟶ Local:

$RecursionLimit

$RecursionLimit=5000;

Na tomto miste je take mozne demonstrovat "listovatelnost" funkci, ktera jiz byla demonstrovana pri vyvolavani Built-In funkci. Pro uzivatelem definovane funkce pouzijeme nasledujici postup:

Nejprve zkusme aplikovat funkci fibA na list:

fibA[Range[6]]
Attributes[fibA]

Map[fibA,Range[6]]

Po zmene vlastnosti vsak jiz dosahneme kyzeneho vysledku:

SetAttributes[fibA,Listable];
fibA[Range[6]]
Attributes[fibA]

MaxMemoryUsed[]

Fibonacci M

fibM[n_]:=First[MatrixPower[(({{1, 1}, {1, 0}})),n-2].{1,1}]/;n>2

Map[fibM,Range[6]]

{Timing[fibM[160000];],Timing[fibM[10000000];]}

Fibonacci W (cyklus, ktery je podstatne efektivnejsi nez naivni rekurence)

fibW[n_]:=Module[{f1=1,f2=1},Do[{f1,f2}={f2,f1+f2},{n-2}];f2]

Map[fibW,Range[6]]

Timing[fibW[160000];]
fibW[160000]//N

FindSequenceFunction

Clear[n]
FindSequenceFunction[{1,1,2,3,5,8},n]

Konec 2016-12-13

2016-12-20 Lesson 12

FAQ

Principy programování 3

Fibonacci C (Reseni diferencnich rovnic)

Pro reseni diferencnich rovnic (nebo jejich soustav) je zabudovana mohutna funkce RSolve. Syntaxe zadani je prakticky stejna jako u obycejnych rovnic, diferencialnich rovnic, &c. Jak jest obecne z kalkulu znamo, spojite pripady jsou vetsinou daleko snadneji zvladnutelne nez pripady diskretni. Mathematica poskytuje neuveritelne rozsahly aparat pro symbolicke i numericke reseni diferencnich rovnic. Ilustraci vsak zacneme na banalnim prikladu vypoctu Fibonacciovych cisel. Pomineme na chvili skutecnost, ze funkce pro vypocet Fibonacciovych cisel jest funkce zabudovana, a z metodickych duvodu uvedeme nekolik algoritmu jejich vypoctu. Take se pritom poucime, jak efektivne vyuzit prikazy pro rekursivni procedury.

V nasem pripade cetne pocatecnich podminek se jedna o soustavu 3 rovnic.

Clear[n];
reseniC=RSolve[{fibC[n]==fibC[n-1]+fibC[n-2],fibC[1]==fibC[2]==1},fibC[n],n]

To je obecne reseni. Neni vsak patrne, jak vypada v konkretnim pripade. Uzijeme

reseniC2=reseniC//FunctionExpand

Plot[fibC[n]/.reseniC2,{n,0,5}]

Uvedomme si, ze cos(n π)=(((-1))^n) pro n cele. Kyzeny tvar dosahneme pouzitim predpokladu

Assuming[n∈Integers,Simplify[reseniC2]]
(* ekvivalentně *)
Simplify[reseniC2,Assumptions->{n∈Integers}]

Konkretni hodnoty dostaneme napr. takto:

(fibC[n]/.reseniC/.n->200)//First

?fibC

Fibonacci D (zabudovana funkce)

Timing[Fibonacci[10000000];]

**Fibonacci F (zabudovana funkce, IPM, p. 218)

More efficient algorithm is based on the formula:

(Subscript[F, 2n])=2(Subscript[F, n-1])(Subscript[F, n])+(Subscript[F, n]^2),	 n≥1

(Subscript[F, 2n+1])=(Subscript[F, n+1]^2)+(Subscript[F, n]^2),                         n≥1

Clear[fibF];
fibF[n_?(IntegerQ[#]&&Positive[#]&)]:=fibF[n]=
	Which[n==1,1,
     	      n==2,1,
		EvenQ[n],2 fibF[n/2-1] fibF[n/2]+((fibF[n/2])^2),
		OddQ[n],((fibF[(n+1)/2])^2)+((fibF[(n-1)/2])^2)
		]
{fibF[2.5],fibF[3],fibF[-1]}

Grid@Map[{#,fibF[#]}&,10 Range[10]]

{Timing[fibF[160000];],Timing[fibF[10000000];]}

Faktorial (zalozene na lokalnich pravidlech), poucne!!!

Substituce jednoducha (ReplaceAll)

Clear[fac];
fac[4]/.{fac[0]->1,fac[n_]:>n*fac[n-1]}

?fac

Nahrazovani se deje pouze pouze jednim pruchodem listu pravidel. Nasledujici "//." (ReplaceRepeated) aplikuje pravidla tak dlouho, az se vyraz nemeni.

fac[4]//.{fac[0]->1,fac[n_]:>n*fac[n-1]}

(***)
Trace[fac[4]//.{fac[0]->1,fac[n_]:>n*fac[n-1]}]

?fac

Timing[fac[50000]//.{fac[0]->1,fac[n_]:>n*fac[n-1]};]

⚠ Varovny priklad

Clear[fact];
TimeConstrained[fact[-3]//.{fact[1]->1,fact[n_]:>n*fact[n-1]},0.5]

fact[-3]//.{fact[1]->1,fact[n_]:>n*fact[n-1]}

Duvod spociva v tom, ze prvni pravidlo se neaplikuje nikdy, a tudiz druhe se aplikuje do nekonecna. Odpomoc spociva v pojistce, dotazu, na typ argumentu. V pripade, ze skutecny parametr nevyhovuje, vypocet se neprovede.

fact[-3]//.{fact[1]->1,fact[n_Integer?Positive]:>n*fact[n-1]}

fact[5]//.{fact[1]->1,fact[n_Integer?Positive]:>n*fact[n-1]}

Poznamka 2 (vyhodnocovani substitucnich (lokalnich) pravidel: hodnoty promennych se nemeni):

{a,b,c,a}/.{a->s,s->d} (* ReplaceAll *)
{a,b,c,a}//.{a->s,s->d} (* ReplaceRepeated *)

Clear[x];
x/.x->x+1
x//.x->x+1
?x

**Problém

Uvažujte výše uvedené funkce a porovnejte jejich časovou náročnost. Odhadněte, zda je lineární, polynomiální, exponenciální (či jiná).

Finanční funkce

Zakladni financni funkce a definice funkce s volbami

Zabudované finanční funkce budeme probírat později.

Uvodni poznamky

Poznamka 1

Off[Clear::ssym];
Clear[x,r,(* ⟵ zbytecne, pouziva se pouze jako argument ryzi funkce *)
c,(Subscript[r, 1]),(Subscript[r, 2]),(Subscript[r, 3]),(Subscript[i, 1]),(Subscript[i, 2]),(Subscript[i, 3]),(Subscript[i, 4])]
NestList[Function[x,(x/(1+r))],c,4]
FoldList[Function[{x,i},(x/(1+i))],c,{(Subscript[i, 1]),(Subscript[i, 2]),(Subscript[i, 3]),(Subscript[i, 4])}]
1/FoldList[#1 * (1+#2)&,1,{(Subscript[i, 1]),(Subscript[i, 2]),(Subscript[i, 3]),(Subscript[i, 4])}]
(* ekvivalentne *)
1/FoldList[Function[{x1,x2},x1(1+x2)],1,{(Subscript[i, 1]),(Subscript[i, 2]),(Subscript[i, 3]),(Subscript[i, 4])}]
On[Clear::ssym];

Současná hodnota 1 (ekvidistantní časové intervaly mezi platbami) Důležitý příklad!

Predpoklada se, ze cf je penezni tok, cf={(Subscript[cf, 0]),(Subscript[cf, 1]),...,(Subscript[cf, T])}, i konstantni hodnotici urokova mira (“constant”), ii={(Subscript[i, 1]),...,(Subscript[i, T])} promenne urokove miry (“variable”) pro obdobi 1,...,T, rr={(Subscript[R, 1]),...,(Subscript[R, T])} okamzite rocni (spotove) urokove miry pro investice se splatnostmi 1,...,T, (vynosova krivka, ”yieldcurve”). Tyto tri pripady rozlisime pomoci volby “interestrates”. Implicitne bude nastavena volba interestrates -> ”constant”.

Následující konstrukce využívají faktu, že současná hodnota je skalarní součin vektoru peněžního toku a vektoru diskontních faktorů. Musí se pouze dávat pozor na délky odpovídajících vektorů a jejich první složky.

Clear[pv];
Options[pv]={interestrates->"constant"};
(* dalsi mozne volby "variable" a "yieldcurve" *)

?pv

pv[cf_?(VectorQ[#]&&Length[#]>0&),i_,opts___?OptionQ]:=Module[{n=Length[cf](*=T+1*),interests},
interests=interestrates/.Flatten[{opts,Options[pv]}];
Which[interests=="constant",cf.(1/(((1+i))^(Range[n]-1))),
	interests== "variable",cf.(1/(FoldList[#1 * (1+#2)&,1,i])),
	interests=="yieldcurve",First[cf]+Rest[cf].(1/(((1+i))^(Range[n-1])))]
	 ]

?pv

Clear[cf,ii,rr,i,i1,i2,i3,r1,r2,r3,cf0,cf1,cf2,cf3];
cf={cf0,cf1,cf2,cf3};
ii={i1,i2,i3};
rr={r1,r2,r3};
(* Priklady spatneho zadani *)
{pv[1,ii],pv[{},ii],pv[,ii]}

pv[cf,i]//TraditionalForm
pv[cf,ii,interestrates->"variable"]
pv[cf,rr,interestrates->"yieldcurve"]
pv[cf,i,interests-> "variable"] //TraditionalForm
(* zadna substituce za interests v tele procedury se neprovede *)

pv[{cf0,cf1,cf2,cf3},i,in]

pv[cf,ii]
(* ekvivalentne *)
pv[cf,ii,interestrates->"constant"]
(* Substituce za interests se provede a v prepinaci Which se prejde na variantu "constant"*)

pv[cf,ii,interestrates->"CCCconstant"]

IRR: ekvidistatni casove intervaly mezi platbami

Nejjednodussi pristup (vyhledani vsech korenu) spociva v pouziti funkce NSolve. Odpovidajici algebraicka rovnice je v sice v promenne v, ale Mathematica rozpozna, ze se jedna o algebraickou rovnici i kdyz je promennou urokova mira i.

Nejprve ukazka projektu, ktery asi zadny potencialni investor nebude povazovat za realny:

i=.
cfnerealny={-1000,3600,-4310,1716};
Plot[pv[cfnerealny,i],{i,0,0.4},PlotTheme->"Detailed"]

Vnitrni mira vynosnosti se ziska takto:

i=.
irrsolv=NSolve[pv[cfnerealny,i]==0,i]

i/.irrsolv

?i

Zde je podstatne, ze se pouzije numericka varianta Solve, tj. NSolve. Vsimneme si, co udela obecna procedura pro vyhledani korenu FindRoot (zde je nutne zadat pocatecni reseni i0)

Clear[i] je totez, co i =.

i0=.;i=.;
Table[{i0,FindRoot[pv[cfnerealny,i],{i,i0}]},{i0,0,0.5,0.05}]//TableForm

Priklad nahodneho penezniho toku

Nyni priklad nahodneho penezniho toku. Uvadime tez prislusne statisticke charakeristiky

Znovu upozorňuji:
SeedRandom musí byt buď ve stejné buňce nebo před každým spuštěním funkce generující náhodná čísla musí být znovu spuštěno. Jediná bezpečná konstrukce je: ve stejné buňce!!!

i=.;
SeedRandom[313131];
Text@Row@{"Mean: ",Mean[cf13=RandomReal[{-25,33},{30}]],"   Variance:   ",Variance[cf13],"   Smerodatna odchylka = "<>ToString[StandardDeviation[cf13]],"  5% percentile:   ",Quantile[cf13,0.05],"    95% percentile:   ",Quantile[cf13,0.95]}
{Min[cf13],Max[cf13]}
ListPlot[cf13,Joined->True,PlotTheme->"Marketing"]
Plot[pv[cf13,i],{i,-0.18,.5},PlotRange->All]
(* Vsechna IRR *)NSolve[pv[cf13,i]==0,i]

Vnitrni vynosove procento

Samozrejme, ze nas nezajimaji imaginarni, a z hlediska ekonomickeho ani zaporna vnitrni vynosova procenta. Separace v nasledujici obecne procedure:

Clear[irr];
(* Predpoklada vyse definovanou funkci pv *)
irr[cf_]:=Module[{solutions,i},
solutions=i/.NSolve[pv[cf,i]==0,i];
Select[solutions,(Im[#]==0&&Re[#]>0)&]
				]

irr[cf13]

Off[Greater::nord]
On[Greater::nord]

Clear[irrMP];
(* Predpoklada vyse definovanou funkci pv *)
irrMP[cf_]:=Module[{solutions,i},
solutions=i/.NSolve[pv[cf,i]==0,i];
Select[solutions,(#>0)&]
				]
irrMP[cf13]

Alternativne 1 (Kovacova)

Vychazi z toho, ze NSolve vrati pouze realne koreny

NSolve[pv[cf13,i]==0,i,Reals]

(* Off[Solve::ratnz] *)

Clear[irrkovacova];
(* Predpoklada vyse definovanou funkci pv *)
irrkovacova[cf_]:=Module[{solutions,i},
Select[solutions=i/.NSolve[pv[cf,i]==0,i,Reals],Positive (* #>0& *)]
				]
irrkovacova[cf13]

Off[Solve::ratnz]

Alternativne 2

SeedRandom[313131]; 
cf13=RandomReal[{-25,33},{30}];

solutions=i/.NSolve[pv[cf13,i]==0,i]
Cases[solutions,_?((Im[#]==0&&Re[#]≥0)&)]
Cases[solutions,i_Real]
Cases[solutions,i_Real/;i≥0]

Alternativne 3

Cases[i/.NSolve[pv[cf13,i]==0,i],i_Real]
Cases[i/.NSolve[pv[cf13,i]==0,i],i_Real/;i≥0]

Zakladni financni funkce II

Durace (ekvidistantni casove intervaly)

Clear[pv];
Options[pv]={interestrates->"constant"};
(* dalsi mozne volby "variable" a "yieldcurve" *)
pv[cf_?(VectorQ∧Length[cf]>0),i_,opts___?OptionQ]:=Module[{n=Length[cf],interests},
interests=interestrates/.Flatten[{opts,Options[pv]}];
Which[interests=="constant",cf.(1/(((1+i))^(Range[n]-1))),
	interests== "variable",cf.(1/(FoldList[#1 * (1+#2)&,1,i])),
	interests=="yieldcurve",First[cf]+Rest[cf].(1/(((1+i))^(Range[n-1])))]
	 ]

Clear[dur];
Options[dur]={interestrates->"constant"};
(* dalsi mozne volby "variable" a "yieldcurve" *)
dur[cf_?(VectorQ∧Length[cf]>0),i_,opts___?OptionQ]:=Module[{n=Length[cf],interests},
interests=interestrates/.Flatten[{opts,Options[pv]}];
Which[interests=="constant",((cf*(Range[n]-1)).(1/(((1+i))^(Range[n]-1))))/pv[cf,i,opts],
	interests== "variable",((cf*(Range[n]-1)).(1/(FoldList[#1 * (1+#2)&,1,i])))/pv[cf,i,opts],
	interests=="yieldcurve",((Rest[cf]*Range[n-1]).(1/(((1+i))^(Range[n-1]))))/pv[cf,i,opts]]
	 ]

cf=.;ii=.;rr=.;i1=.;i2=.;i3=.;
cf={cf0,cf1,cf2,cf3};
ii={i1,i2,i3};
rr={r1,r2,r3};
{dur[1,ii],dur[{},ii],dur[,ii]}

dur[cf,i]//TraditionalForm
dur[cf,ii,interestrates->"variable"]
dur[cf,rr,interestrates->"yieldcurve"]
dur[cf,i,in] (* in nemuze byt uvazovano jako option, vrati tedy dur[... *)

dur[{cf0,cf1,cf2,cf3},i,in]

Cviceni: Jaky je profil durace, zahrneme-li do grafu IRR?

Zakladni financni funkce III: Fair values of bonds and durations of bonds

Present value of a coupon bond

Fair = dirty = hruba = spravedliva,
Pure = cista 
c=C/F... kuponova sazba!!!
n...pocet obdobi do splatnosti n=T-t, inverzní čas

(∑_(j=1)^n)(v^j)//TraditionalForm

Clear[dirtyvalue,purevalue];
(* Vyzkousejte okamzite i odlozene prirazeni *)
dirtyvalue[c_,f_,n_,i_]=Module[{v},c f (v^(n-Floor[n])) (∑_(j=0)^(Floor[n]))(v^j)+f (v^n)/.v->(1/(1+i))]
purevalue[c_,f_,n_,i_]:=Module[{v},f ((v^n)+((c v ((v^n)-1))/(v-1)))/.v->(1/(1+i))]

Kuponova obligace s kuponovou sazbou c=0.1, splatnost T=10, nominalni hodnota F=1, hodnotici urokova sazba i=0.15, tj. diskontni obligace.

Znazorneno ve skutecnem (a ne invertovanem) case

p12=Plot[{dirtyvalue[0.1,1,10-n,0.15],purevalue[0.1`,1,10-n,0.15]},{n,0,10},Exclusions->None,PlotPoints->500,AxesLabel->{t,"P,V"}]

Kuponova obligace s kuponovou sazbou c=0.1, splatnost T=10, nominalni hodnota F=1, hodnotici urokova sazba i=0.1.

p3=Plot[dirtyvalue[0.1`,1,10-n,0.1],{n,0,10},Exclusions->None,PlotStyle->{{Dashing[{0.01,0.01}],Black}},AxesLabel->{t,PV}]

Kuponova obligace s kuponovou sazbou c=0.1, splatnost T=10, nominalni hodnota F=1, hodnotici urokova sazba i=0.05, tj. premiova obligace.

p45=Plot[{dirtyvalue[0.1,1,10-n,0.05],purevalue[0.1,1,10-n,0.05]},{n,0,10},PlotPoints->500,Exclusions->None,AxesLabel->{t,PV}]

Show[p12,p3,p45,PlotRange->All]

Manipulate[Plot[{dirtyvalue[c,f,tT-t,i],purevalue[c,f,tT-t,i],purevalue[c,f,tT-t,c]},{t,0,tT},PlotPoints->500,Exclusions->None,AxesLabel->{t,PV},PlotRange->{{0,tT},{0,2f}}],
{{tT,10,"T"},5,30,1,Appearance->"Labeled"},
{{c,0.1,"c"},0.01,0.20,0.01,Appearance->"Labeled"},
{{f,1,"F"},1,1000,50,Appearance->"Labeled"},
{{i,0.15,"i"},0.01,0.20,0.01,Appearance->"Labeled"},SaveDefinitions->True]

Duration of a coupon bond

Definice durace kuponove obligace

((c f(∑_(j=1)^n)j (v^j)+f n (v^n))/(c f(∑_(j=1)^n) (v^j)+f  (v^n)))/.v->(1/(1+i))//PowerExpand//FullSimplify

Clear[pureduration,dirtyduration,v];
pureduration[c_,f_,n_,i_]:=1+(1/i)-((1+i+c n-i n)/(i+c (-1+(((1+i))^n))))
dirtyduration[c_,f_,n_,i_]:=(c f (∑_(j=0)^(Floor[n])) (n-Floor[n]+j) (v^(n-Floor[n]+j))+f n (v^n))/(c f (v^(n-Floor[n])) (∑_(j=0)^(Floor[n]))(v^j)+f (v^n))/.v->(1/(1+i))

Plot[{dirtyduration[0.1,1,10-n,0.15],pureduration[0.1,1,10-n,0.15]},{n,0,10},PlotPoints->500,Exclusions->None]

Plot[{dirtyduration[0.1,1,10-n,0.05],pureduration[0.1,1,10-n,0.05]},{n,0,10},PlotPoints->500,Exclusions->None]

PV, FV, D, C, IRR, nestejne intervaly mezi platbami

Calendars (Day Count Basis, Day Count Convention)

Calendar conventions play a crucial role in time value of money. There is a variety of calendar conventions for  financial instruments.

The actual date in the form {Year, Month, Day, Hour, Minute, Second}:

{Date[],DateList[],DateList[{"2.12.2015",{"Day",".","Month",".","Year"}}]}

We may extract just the date:

Date[]
Date[][[Range[3]]]

Ve starších verzích bylo nutné nahrát balíček:

Needs["Calendar`"]
?"Calendar`*"

Tyto funkce s případně pozměněnými názvy a někdy i jinak fungující (!) jsou v posledních verzích zabudované.

Today//Normal

?*Day*

DayName[today=Date[][[{1,2,3}]]]

?*Date*

DateQ[Today//Normal]

Beware of the order of the dates!!! The sign may differ. Also be careful if using other systems.

{DaysBetween[today,{2015,3,28}],DaysBetween[{2015,3,28},today]}

Today

{DayCount[today,{2015,3,28}],DayCount[{2015,3,28},today]}

V některých případech je výhodnější výstup se znaménkem. To se dá zařídit i u funkce DayCount. Zabudovaná funkce DateDifference však znaménko respektuje.

Poznamenejme, že správná konstrukce by byla

dayCount[date1_?(DateObjectQ[DateObject[#]]&),date2_?(DateObjectQ[DateObject[#]]&)]:= ...,

ale bohužel funkce DateObject vytvoří datum i z neexistujícího data:

DateObject[{2015,112,32}]
%//Normal//DateQ

Clear[dayCount];
Needs["Calendar`"]
dayCount[date1_?(DateQ[Normal[#]]&),date2_?(DateQ[Normal[#]]&)]:=Module[{d1=(date1//Normal)[[1;;3]],d2=(date2//Normal)[[1;;3]]},
Sign[AbsoluteTime[d2]- AbsoluteTime[d1]] DayCount[d1,d2]]
{dayCount[Today,{2015,3,28}],dayCount[{2015,3,28},today]}

DayCount Convention

{DateDifference[{2008,1,31},Today,DayCountConvention->"Thirty360"]//First,DateDifference[Today,{2008,1,31},DayCountConvention->"Thirty360"]//First}

(* Zkopírováno z nápovědy k DayCountConvention: *)conventions={"ActualActual", "Thirty360US", "Thirty360", "ThirtyE360", "ThirtyE360ISDA", "ThirtyEPlus360", "Actual365", "Actual360", "Actual365L", "ActualActualISDA", "ActualActualICMA"}

Text@Grid[Map[{#,DateDifference[{2008,1,31},{2009,2,28},DayCountConvention->#]}&,conventions],Frame->All]

Text@Grid[Map[{#,DateDifference[{2013,1,1},Today,"Year",DayCountConvention->#]}&,conventions],Frame->All]

DaysPlus[today,50]

DayPlus[today,50]
DayPlus[today,50]//FullForm
{DayPlus[today,50][[1]],DayPlus[today,-50][[1]]}
(DayPlus[today,50]//Normal)[[1;;3]]

Present or Future Value, Mixed Time Value,  different day count basis

Hodnotící okamžik (startday) může předcházet všem datům uvedených v dates (pak je výsledek PV), nebo naopak všechna data mohou předcházet startday (pak je výsledek FV), je-li mezi, je výsledkem smíšená časová hodnota.

Vysvětlivky:

dif=Map[DateDifference[Today,#]&,{{2024,3,28},{2023,1,13},{2013,1,1}}]
dif1=Map[(DateDifference[Today,#]//First)&,{{2024,3,28},{2023,1,13},{2013,1,1}}]
discounts=1/((1+r)^(dif1/360.))

Procedure:

Clear[timeValue]
timeValue[cashflow_,dates_,r_,startDay_,dayCountBasis_:"ActualActual"]:=
Module[{diskontniFaktory,pocetLetMeziDaty},
pocetLetMeziDaty=Map[(DateDifference[startDay,#,"Year",DayCountConvention->dayCountBasis]//First)&,dates];
diskontniFaktory=(1/(((1+r))^pocetLetMeziDaty));
(* sklarni soucin: *)
cashflow.diskontniFaktory]

cf={-50,-900,1000};
dates1={{2003,1,1},{2003,1,13},{2004,3,28}};
Plot[timeValue[cf,dates1,r,Today],{r,0,0.08}]

timeValue[cf,dates1,r,minDate]
timeValue[cf,dates1,r,maxDate]

Ještě pro kalendářovou konvenci 30/360 (Za cvičení numericky prostudujte rozdíly oproti Actual/Actual:

timeValue[cf,dates1,r,minDate, "Thirty360"]
timeValue[cf,dates1,r,maxDate, "Thirty360"]

{maxDate=Max[Map[AbsoluteTime,dates1]]//DateList,
minDate=Min[Map[AbsoluteTime,dates1]]//DateList}
GraphicsRow@{Plot[timeValue[cf,dates1,r,minDate],{r,0,0.2}],Plot[timeValue[cf,dates1,r,maxDate],{r,0,0.2}]}
Plot[timeValue[cf,dates1,r,minDate]-timeValue[cf,dates1,r,maxDate],{r,0,0.2}]

Karel IV: vzorovy priklad sporeni

Kolik vynese koruna ulozena v roce zalozeni University Karlovy na 4% p.a.? Na zacatku roku, v den zalozeni, na konci roku? Jake jsou rozdily? Poznamenejme, ze vklad pri uvedene urokove mire se zdojnasobi asi za 18 let:

TimeValue[1,0.04,18]

Ještě si připomeneme pravidlo zdvojení:

(* Doubling Rule *)
{TimeValue[1,0.07,10],TimeValue[1,.1,7]}

koruna1348={timeValue[{1},{{1348,1,1}},0.04,Today],timeValue[{1},{{1348,4,7}},0.04,Today],timeValue[{1},{{1348,12,31}},0.04,Today]}
"Rozdíly mezi úložkami:"
Most[koruna1348]-Rest[koruna1348]

IRR (Internal Rate of Return)

Připomínka efektivnější konstrukce seznamu s krokem 365, s počátkem v nule, délka 12.

Table[365*(j-1),{j,12}]
365 (Range[12]-1)

Peněžní tok (co asi připomíná) a data plateb odpovídajících položek:

cf3={-1000,Table[100,{10}],1100}//Flatten;dates3=Map[DatePlus[Today,#]&,Table[365*(j-1),{j,Length[cf3]}]]

Plot[timeValue[cf3,dates3,r,Today],{r,0.09,0.11}]

Vyjádření úrokové míry pomocí diskontního faktoru:

Solve[v==(1/(1+r)),r]

timeValue[cf3,dates3,r,today]/.Solve[v==(1/(1+r)),r]//Simplify

FindRoot[timeValue[cf3,dates3,r,Today]==0,{r,0.}]

Cviceni
Vyzkousejte pro skutecne neekvidistantni casove intervaly.

Zabudované finanční funkce

Opticky zabudovaných finančních funkcí sice není mnoho (asi méně než 20), avšak jak je v systému Mathematica obvyklé, jsou to tzv. superfunkce. Vhodně zvolenými volbami pokryjí finanční funkce poskytované jinými systémy. Navíc je možné je snadno adpatovat a využít k vlastnímu modeplování. Výklad každé jedné z nich by asi vyplnil jeden semestr. Přitom se ještě navíc předpokládá znalost příslušných matematických modelů.

Budeme probírat jen některé finanční funkce, mezi jinými FinancialDerivative. Pomocí F1 se zkuste orientovat, co ta funkce umí, jaká je struktura vstupu, apod. S ohledem na to, že struktura vstupních parametrů je komplikovaná, je vítězná strategie zkopírovat  přilbližný vstup z Help a editovat.

FinancialDerivative[]

Annuity

AnnuityDue

Cashflow

TimeValue

EffectiveInterest

FinancialBond

FinancialDerivative

TradingChart

InteractiveTradingChart

FinancialIndicator
FinancialIndicator[All]//Length

Finanční funkce: efektivní úroková míra, časová hodnota, peněžní tok, anuita polhůtná (Annuity immediate, in arrear), anuita předlhůtná (due, in advance)

EffectiveInterest

Clear[p,t,r,i];
pp=Array[(Subscript[p, #])&,{5}];
tt=Array[(Subscript[t, #])&,{5}];
rr=Array[(Subscript[r, #])&,{5}];
ii=Array[(Subscript[i, #])&,{5}];

Úročení f-krát ročně:

Clear[r,f];
{EffectiveInterest[r,1/f],
EffectiveInterest[r,1/4]}//TraditionalForm
(* spojité úročení *)
EffectiveInterest[r,0]//TraditionalForm

Totéž pro více úrokových měr:

EffectiveInterest[rr,1/f]

Průměrná úroková míra (geometrický průměr, Compound annual growth rate (CAGR) corresponding to a schedule of rates)

EffectiveInterest[rr]//TraditionalForm
{%/.Thread[rr-> {.05,.065,.04,.07,.085}],Mean[{.05,.065,.04,.07,.085}]}

Efektivní ú. m. při úročení f-krát ročně:

{{0,3,5,6,10},ii}//Transpose

EffectiveInterest[{{0,3,5,6,10},ii}//Transpose,1/f]//TableForm//TraditionalForm

Převod spotových ú. m. (Subscript[R, t]) (z výnosové křivky) na forwardové ú. m.  (Subscript[f, t])  (Convert a term structure of interest rates (yield curve) to a list of implied forward rates and the corresponding intervals over which they are valid)

(Subscript[R, 1])=(Subscript[f, 1])
(((1+(Subscript[R, t])))^t)=(((1+(Subscript[R, t-1])))^(t-1))(1+(Subscript[f, t]))

Thread[((1/Range[5])//Reverse)->rr]

Pozor! Jak vidíme, u okamžitých úrokových měr se uvádí počet investičních období, u forwardových počátek překlenovacího období.

EffectiveInterest[{1->0.01,2->0.015,3->0.02}]

EffectiveInterest[Thread[((1/Range[5])//Reverse)->rr]]//TraditionalForm

Thread[((Range[Length[rr]])^2)->rr]

EffectiveInterest[Thread[((Range[Length[rr]])^2)->rr]]//TraditionalForm

EffectiveInterest[{1/12->.01,3/12->.015,6/12->.02,1->.025,2->.03,3->.032,5->.035,7->.04,10->.045}]

Vysvětlení (opraveno 2016-01-14)

(((1+(Subscript[R, (Subscript[t, 1])])))^(Subscript[t, 1]))(((1+(Subscript[f, (Subscript[t, 1]),(Subscript[t, 2])])))^((Subscript[t, 2])-(Subscript[t, 1])))=(((1+(Subscript[R, (Subscript[t, 2])])))^(Subscript[t, 2]))

{(((((((1+0.015))^(3/12))/(((1+0.01))^(1/12)))))^(1/(3/12-1/12)))-1,(((((((1+0.02))^(6/12))/(((1+0.015))^(3/12)))))^(1/(6/12-3/12)))-1}

Nestejně dlouhá období, v praxi nejběžnější případ:

(zz={1/12->.01,3/12->.015,6/12->.02,1->.025,2->.03,3->.032,5->.035,7->.04,10->.045})/.Rule->List

forwardrates=EffectiveInterest[spotrates={1/12->.01,3/12->.015,6/12->.02,1->.025,2->.03,3->.032,5->.035,7->.04,10->.045}]
ListPlot[{spotrates/.Rule->List,forwardrates},PlotStyle->PointSize[0.015],PlotTheme->"Detailed"]

Prevod Spot ⟶ Forward Obecne:

Thread[Range[Length[rr]]-> rr]

EffectiveInterest[Thread[Range[Length[rr]]-> rr]]

Najit nominalni urokovou miru odpovidajici efektivni urokove mire pri ctvrtletnim uroceni:

FindRoot[EffectiveInterest[r,1/4]==.05,{r,.2}]

TimeValue

Základní použití

Clear[i,v,T,PMT,FV,PV];
{(* FV *) TimeValue[PV,i,T]//TraditionalForm,
(* PV *) TimeValue[FV,i,-T]//TraditionalForm}

Detaily

Cashflow umoznuje zadavat kalendarni data:

Hodnoceni k datu {2009,1,1}, hodnotici urokova mira .08:

TimeValue[Cashflow[cf={{{2010,1,1},-600},{{2011,1,1},300},{{2012,1,1},400}}],.08,{2009,1,1}]
GraphicsRow@{DateListPlot[cf,Joined->True],
Plot[TimeValue[Cashflow[cf={{{2010,1,1},-600},{{2011,1,1},300},{{2012,1,1},400}}],r,{2009,1,1}],{r,0,.2},PlotLabel->"Profil PV",PlotTheme->"Marketing"]}

Vnitřní míry výnosnosti ( Proč jsou v obou případech IRR totožná?)

{FindRoot[TimeValue[Cashflow[{{{2010,1,1},-600},{{2011,1,1},300},{{2012,1,1},400}}],r,{2000,1,1}],{r,0.1}],FindRoot[TimeValue[Cashflow[{{{2010,1,1},-600},{{2011,1,1},300},{{2012,1,1},400}}],r,{2010,1,1}],{r,0.1}]}

TimeValue[Cashflow[{{{2010,1,1},-600},{{2011,1,1},300},{{2012,1,1},400}}],r,{2000,1,1}]
NSolve[TimeValue[Cashflow[{{{2010,1,1},-600},{{2011,1,1},300},{{2012,1,1},400}}],r,{2000,1,1}]==0,r]

Ale vnitřní míry výnosnosti pro jiný peněžní tok ({2010,1,1} -> {2010,1,15}) (Proč nejde použít NSolve?)

tv2=TimeValue[Cashflow[{{{2010,1,15},-600},{{2011,1,1},300},{{2012,1,1},400}}],r,{2000,1,1}]
NSolve[tv2==0,r]

FindRoot[tv2==0,{r,0.2}]

Cashflow

Clear[CF];
Text@Row@{"PV(CF,i) = ",
TimeValue[ccff=Cashflow[ccfftab=Table[(Subscript[CF, i]),{i,0,5}]],i,0]}
Text@Row@{"FV(CF,i) = ",TimeValue[ccff=Cashflow[ccfftab=Table[(Subscript[CF, i]),{i,0,5}]],i,Length[ccfftab]-1]}

Promenne urokove miry po obdobich

ii=Table[(Subscript[i, j]),{j,1,5}];
Print["PV(CF,i) = ",TimeValue[ccff,ii,0]]
Print["FV(CF,ii) = ",TimeValue[ccff,ii,5]]

Urokove miry ze spotove vynosove krivky

RR=Table[(Subscript[R, j]),{j,1,5}];
rulesRR=Thread[Range[Length[RR]]->RR]
Print["PV(CF,RR) = ",TimeValue[ccff,rulesRR,0]]

Annuity, AnnuityDue

Soucasna hodnota polhutni anuity (Annuity Immediate), T... pocet splatek, PMT... pravidelna splatka, i... hodnotici urokova mira, v=1/(1+i) ... diskontni faktor

{TimeValue[Annuity[PMT,T],i,0]//TraditionalForm,
(pvAnnuityImmediate=TimeValue[Annuity[PMT,T],i,0]//Simplify),(pvAnnuityImmediate/.{i->((1-v)/v)})//FullSimplify[#,Assumptions->{v>0}]&}//TraditionalForm

PV perpetuity:

Limit[TimeValue[Annuity[PMT,T],i,0]//Simplify,T->∞]

Limit[((PMT-(((1+i))^(-T)) PMT)/i),T->∞,Assumptions->i>0]

Budouci hodnota polhutni anuity (Annuity Immediate)

TimeValue[Annuity[PMT,T],i,T]//TraditionalForm

Soucasna hodnota predlhutni anuity (Annuity Due)

{pvAnnuityDue=TimeValue[AnnuityDue[PMT,T],i,0]//FullSimplify,pvAnnuityDue/.{i->((1-v)/v)}//Simplify[#,Assumptions->{v>0}]&}//TraditionalForm

(pvAnnuityDue/pvAnnuityImmediate)//Simplify

Budouci hodnota predlhutni anuity (Annuity Due)

TimeValue[AnnuityDue[PMT,T],i,T]//TraditionalForm

Konec 2016-12-20

2017-01-03 Lesson 13

FAQ

Finanční funkce: obligace (bonds)

FinancialBond (obligace, dluhopis)

FinancialBond

Označení: “FaceValue” nominální hodnota F, “Coupon” kuponova sazba c, “Maturity” doba do splatnosti od okamziku vydani T, “Settlement” hodnotici okamzik t, “InterestRate” hodnotici urokova mira r, trzni urokova mira pro srovnatelnou investici, cenu kapitalu, “CouponInterval” rocni frekvence vyplaty kuponu 1/f, (f=2 znamena dvakrat rocne), “DayCountBasis” kalendářová konvence, “AccruedInterest” alikvotni urok, “Value”

Spravedlivá cena = Čistá cena + alikvótní úrok
FullValue = Value 1 AccruedInterest

POZOR NA SYNTAXI!!! PRI RESENI ULOH ZKOPIRUJTE Z HELPU!!!

Poznamka: Properties:

({{"Value", price adjusted for accrued interest}, {"FullValue", unadjusted price}, {"AccruedInterest", accrued interest at settlement}, {"Duration", Macaulay duration}, {"ModifiedDuration", modified duration}, {"Convexity", convexity}, {"CouponPeriodDays", days in coupon period containing the settlement}, {"CouponToSettlementDays", days from previous coupon to settlement}, {"SettlementToCouponDays", days from settlement to next coupon}, {"NextCouponDate", next coupon date}, {"PreviousCouponDate", previous coupon date}, {"RemainingCoupons", remaining coupon payments}})

1 Priklad

Současná hodnotící úroková míra je  6%. Jaká je čistá cena kuponové obligace splatné za 30 let s roční kuponovou sazbou 5.75% a nominální hodnotou 1000Kč?

FinancialBond[{"FaceValue"->1000,"Coupon"->0.0575,"Maturity"->30},{"InterestRate"->0.06,"Settlement"->0}]

Současná hodnotící úroková míra je  6%. Jaká je spravedlivá cena kuponové obligace splatné za 30 let s roční kuponovou sazbou 5.75% a nominální hodnotou 1000Kč?

FinancialBond[{"FaceValue"->1000,"Coupon"->0.0575,"Maturity"->30},{"InterestRate"->0.06,"Settlement"->0},"FullValue"]

2 Priklad

10 - letá obligace, nominální hodnota 1000Kč, kupon dvakrát ročně, kupon 5.75% p.a., hodnocená 9 měsíců po vydání, hodnotící úr. míra r=5% p.a., čistá cena:

FinancialBond[{"FaceValue"->1000,"Coupon"->0.0575,"Maturity"->10,"CouponInterval"->(1/2)},{"InterestRate"->0.05,"Settlement"->(9/12)}]

Spravedlivá cena:

FinancialBond[{"FaceValue"->1000,"Coupon"->0.0575,"Maturity"->10,"CouponInterval"->(1/2)},{"InterestRate"->0.05,"Settlement"->(9/12)},"FullValue"]

3 Priklad

F=1000, c=0.04, kupon ctvrtletni, splatnost 31. 12. 2030, hodnocena ke dni 5. 9. 2013, r=0.06.

FinancialBond[{"FaceValue"->1000,"Coupon"->0.04,"Maturity"->{2030,12,31},"CouponInterval"->(1/4)},{"InterestRate"->.06,"Settlement"->{2017,1,3}}(* ,"Value" *)]

Graficky v zavislosti na hodnotici urokove mire:

Plot[FinancialBond[{"FaceValue"->1000,"Coupon"->0.04,"Maturity"->{2030,12,31},"CouponInterval"->(1/4)},{"InterestRate"->r,"Settlement"->{2017,1,3}}],{r,0.01,0.1}]

4 Priklad (alikvótní úrok)

Alikvotni urok pri kalendari "Actual/360". Ostatni je zrejme z predchoziho vykladu.

Table[{settle,FinancialBond[{"FaceValue"->1000,"Coupon"->0.07,"Maturity"->{2030,12,31},"CouponInterval"->(1/2)},{"InterestRate"->0.06,"Settlement"->settle,"DayCountBasis"->"Actual/360"},"AccruedInterest"]},{settle,{{2010,11,12},{2010,12,12},{2010,12,30},{2010,12,31}}}];
Grid[Prepend[%,{"Settlement","Accrued Interest"}],Dividers->{{False,True},{False,True}}]

Zdánlivý paradox (alikvótní úrok je větší než kupónová platba) je způsoben použitým kalendářem Actual/360.

ListPlot[Table[FinancialBond[{"FaceValue"->1000,"Coupon"->0.07,"Maturity"->{2030,12,31},"CouponInterval"->(1/2)},{"InterestRate"->0.06,"Settlement"->{2010,11,d},"DayCountBasis"->"Actual/360"},"AccruedInterest"],{d,1,30}]]

Cviceni:
Graficky znazornete alikvotni urok jako funkci hodnoticiho data pro obdobi 1.11.2010 az 31.12.2013. Navod: Pouzijte funkci DayPlus.

5 Priklad

Vynos do splatnosti (YTM, Yield To Maturity, zde nazyvany “Implied yield to maturity”) obligace, ktera se 3.5.2013 prodavala za trzni cenu 900.

FindRoot[FinancialBond[{"FaceValue"->1000,"Coupon"->0.05,"Maturity"->{2018,6,31},"CouponInterval"->(1/4)},{"InterestRate"->ytm,"Settlement"->{2013,5,3}}]==900,{ytm,.1}]

6 Priklad

konkretnihodnoty1={F->1000,c->0.05,T->10,f->1,r->0.06,t->0};
konkretnihodnoty2={F->1000,c->0.05,T->10,f->1,r->0.06,t->1/2};

Je mozne ziskat i explicitni vzorce:

FinancialBond[{"FaceValue"->F,"Coupon"->c,"Maturity"->T,"CouponInterval"->(1/f)},{"InterestRate"->r,"Settlement"->t}]//Apart//TraditionalForm
(* Pro konkretni hodnoty: *)
%/.konkretnihodnoty1
%%/.konkretnihodnoty2

Value

(value=FinancialBond[{"FaceValue"->F,"Coupon"->c,"Maturity"->T,"CouponInterval"->(1/f)},{"InterestRate"->r,"Settlement"->t},"Value"])//Apart//TraditionalForm
%/.konkretnihodnoty1
%%/.konkretnihodnoty2

FullValue

(fullvalue=FinancialBond[{"FaceValue"->F,"Coupon"->c,"Maturity"->T,"CouponInterval"->(1/f)},{"InterestRate"->r,"Settlement"->t},"FullValue"])//Apart//TraditionalForm
%/.konkretnihodnoty1
%%/.konkretnihodnoty2

Mělo by vyjít c,F{f,t}:

fullvalue-value//FullSimplify
%/.konkretnihodnoty1
%%/.konkretnihodnoty2

Alikvótní úrok

(accrued=FinancialBond[{"FaceValue"->F,"Coupon"->c,"Maturity"->T,"CouponInterval"->(1/f)},{"InterestRate"->r,"Settlement"->t},"AccruedInterest"])//Apart//TraditionalForm
accrued+value==fullvalue
%%/.konkretnihodnoty1
%%%/.konkretnihodnoty2

7 Priklad (Durace, konvexita)

FinancialBond[{"FaceValue"->F,"Coupon"->c,"Maturity"->T,"CouponInterval"->(1/f)},{"InterestRate"->r,"Settlement"->0},"Duration"]//FullSimplify
(* pro roční frekvenci *)
(%/.f->1)//FullSimplify//TraditionalForm

Podobně konvexita, místo “Duration” použít “Convexity”.

8 Priklad (Hodnoceni pri uziti urokovych mer ze spotove vynosove krivky)

vynosovakrivka=Thread[Range[5]->Table[(Subscript[R, i]),{i,5}]]

FinancialBond[{"FaceValue"->F,"Coupon"->c,"Maturity"->5},{"InterestRate"->vynosovakrivka,"Settlement"->0}]
%//Apart//TraditionalForm

9 Priklad (Nahodna urokova mira)

pricer=FinancialBond[{"FaceValue"->1000,"RedemptionValue"->1100,"Coupon"->0.07`,"Maturity"->5,"CouponInterval"->(1/2)},{"InterestRate"->r,"Settlement"->0}]

Expectation[pricer,r\[Distributed]NormalDistribution[0.05,0.01]]

V této podobe nefunguje. Zkusíme přímou integraci:

NIntegrate[((1100/(((1+(r/2)))^10))+((70.` (-1.`+(((1.` +0.5` r))^10)))/((((1.` +0.5` r))^(10.`)) r)))PDF[NormalDistribution[0.05,0.01],r],{r,-∞,∞}]

Pro dobu do splatnosti funguje :

pricet=FinancialBond[{"FaceValue"->1000,"RedemptionValue"->1100,"Coupon"->0.07`,"Maturity"->T,"CouponInterval"->(1/2)},{"InterestRate"->.09,"Settlement"->0}]
Expectation[pricet,T\[Distributed]NormalDistribution[12.5,1]]

Finanční funkce: TradingChart a InteractiveTradingChart (jedna z mnohých vizualizací a interaktivního zpracování)

U funkce Covariance je příklad na výpočet kovariance mezi hodnotami indexů DJI a S&P500. V současnosti (2017-01-02) však DJI není dostupný v rámci systému Mathematica:

djiValue=FinancialData["^DJI","Price",{2004,1,1},"Value"]

Je však možné získat hodnoty DJI z Wolfram|Alpha. U “Price history” je vpravo nahoře křížek, stiskem získáme nabídku možných formátů. Z nich vybereme požadovaný formát a Mathematica vygeneruje odpovídající příkaz

(* Vystupem je pouze minimum, prumer, maximum *)WolframAlpha["^DJI",{{"PriceHistory",1},"QuantityData"}]

WolframAlpha["^DJI",{{"PriceHistory",1},"ComputableData"}]

Computable data:

priceHistoryDJIComputableData=WolframAlpha["^DJI",{{"PriceHistory",1},"ComputableData"},PodStates->{"Projections__Large sample","Projections__Small sample"}]

Důležité: Na konci předchozího výstupu jsou položky, které jsou dalším výpočtům na překážku. Data ve formě {{rok, měsíc, den}, hodnota DJI} dostaneme např.:

Cases[priceHistoryDJIComputableData,{{_,_,_},_},Infinity]

Jednodušeji volbouTimeSeries (pokud je k dispozici):

priceHistoryDJITimeSeries=WolframAlpha["^DJI",{{"PriceHistory",1},"TimeSeriesData"},PodStates->{"Projections__Large sample","Projections__Small sample"}]
priceHistorySP500TimeSeries=WolframAlpha["^GSPC",{{"PriceHistory",1},"TimeSeriesData"},PodStates->{"Projections__Large sample","Projections__Small sample"}];
{Length[priceHistoryDJITimeSeries],Length[priceHistoryDJITimeSeries]==Length[priceHistorySP500TimeSeries]}

Korelace mezi DJI a SP500 za poslední rok (252 obchodních dnů):

Correlation[Map[Last,priceHistoryDJITimeSeries],Map[Last,priceHistorySP500TimeSeries]]

DateListPlot[{priceHistoryDJITimeSeries,priceHistorySP500TimeSeries},PlotTheme->"Detailed",PlotLegends->{"DJI","SP500"}]

**Na takovém grafu toho moc nevidíme. Normujeme obě řady tak, aby v prvním dnu měly obě hodnotu 100:

(* Datum ponecháme a druhou složku změníme: *)priceHistoryDJITimeSeries[[All,2]]/priceHistoryDJITimeSeries[[1,2]] 100

priceHistoryDJITimeSeriesNormed=priceHistoryDJITimeSeries;
priceHistoryDJITimeSeriesNormed[[All,2]]=priceHistoryDJITimeSeries[[All,2]]/priceHistoryDJITimeSeries[[1,2]] 100;
priceHistoryDJITimeSeriesNormed
priceHistorySP500TimeSeriesNormed=priceHistorySP500TimeSeries;
priceHistorySP500TimeSeriesNormed[[All,2]]=priceHistorySP500TimeSeries[[All,2]]/priceHistorySP500TimeSeries[[1,2]] 100;
priceHistorySP500TimeSeriesNormed

DateListPlot[{priceHistoryDJITimeSeriesNormed,priceHistorySP500TimeSeriesNormed},PlotTheme->"Detailed",PlotLegends->{"DJI","SP500"}]

!Opakování a doplnění

Někdy se stává, že některá data jsou nedostupná, specielně u ^DJI můžeme dostat

FinancialData["^DJI", {2013, 1, 1}, "Value"]
Missing[“NotAvailable”]

FinancialData["^DJI", "Members"]

{"AXP", "BA", "CAT", "CSCO", "CVX", "DD", "DIS", "GE", "GS", "HD", "IBM", "INTC", "JNJ", "JPM", "KO", "MCD", "MMM", "MRK", "MSFT", "NKE", "PFE", "PG", "T", "TRV", "UNH", "UTX", "V", "VZ", "WMT", "XOM"}

Data však můžeme získat použitím Wolfram|Alpha.

WolframAlpha["companies in DJI",{{"Result",1},"ComputableData"},PodStates->{"Result__More"}]

membersDJI=WolframAlpha["companies in DJI",{{"Result",1},"ComputableData"},PodStates->{"Result__More"}]

membersDJI//Length

Potřebujeme získat zkratky (tickers) společností v DJI.

Inspirace:

WolframAlpha["ticker \"General Electric\"",{{"Input",1},"Input"}]//ReleaseHold//Last

WolframAlpha["ticker \"General Electric\"",{{"Input",1},"Input"}]

Přepis do tvaru, kde můžeme dosazovat za názvy společností ze seznamu membersDJI:

(WolframAlpha["ticker "<>"\""<> "General Electric"<>"\"",{{"Input",1},"Input"}]//ReleaseHold)[[2]]

Totéž:

WolframAlpha["ticker "<>"\""<> "General Electric"<>"\"",{{"Input",1},"Input"}]//ReleaseHold//Last

Všechny společnosti (51 sec):

Text@Grid[(companiesDJIwithTickers=Map[{#,WolframAlpha["ticker "<>"\""<> #<>"\"",{{"Input",1},"Input"}]//ReleaseHold//Last}&,membersDJI]),Frame->All]

Jde to i bez uvozovek:

WolframAlpha["ticker general electric",{{"Input",1},"Input"}]//ReleaseHold//Last

Ultimate Oscillator

(Larry Williams)

Velmi nerad dávám odkaz na nespolehlivý zdroj jako je Wikipedia: v tomto konkrétním případě jsem však nenašel chybu.

http://en.wikipedia.org/wiki/Ultimate_oscillator

TradingChart

TradingChart[{"AAPL",{{2016,1,1},{2017,1,1}}}]

TradingChart[{"AAPL",{{2016,10,1},{2017,1,1}}},{"UltimateOscillator",FinancialIndicator["SimpleMovingAverage",10]},PlotLabel->"Apple Stock Price — Aug, Sep 2015"]

InteractiveTradingChart

Má daleko více možností (v dolní části grafu možnosti “Chart type” a “Indicator”)

({{Candlestick, "Candlestick"}})  ({{OHLC, "OHLC"}})  ({{HLC, "HLC"}})  ({{Line, "Line"}})  ({{, "None"}})

InteractiveTradingChart[{"AAPL",{{2016,11,1},{2016,12,1}}}]

FinancialIndicator[]

Statistika

Uvod

Dokumentace viz heslo "Statistics" (Help -> Documentation Center). Vetsina funkci, ktere byly puvodne pouze v Standard Add Ons Packages jsou nyni funkce zabudovane. Ilustrace na Poissonove rozdeleni. Pro dalsi kliknuti na modre polozky je nutne Menu: "Evaluation   ->   Dynamic Evaluation Enabled"! To se hodi i jinde.

?Pois*

?*Distribution

PDF (Power Density Function) = hustota 
CDF (Cumulative Distribution Function) = distribucni funkce

λ=2;k=7;
λ=.;k=.;
PDF[distrPoisson=PoissonDistribution[λ],k]
distrGauss=NormalDistribution[μ,σ] (* Pozor, druhy parametr je smerodatna odchylka!!! *)

{CDF[distrPoisson,k],CDF[distrGauss,x],Quantile[distrGauss,q]}

{Quantile[distrGauss,q]/.{μ->0,σ->1,q->0},Quantile[distrGauss,q]/.q->1}

{Limit[Quantile[NormalDistribution[],q],q->0],Limit[Quantile[NormalDistribution[],q],q->1,Direction->1]}

Cviceni: Jaky je vztah mezi Erfc a Φ?

Momenty

{Mean[distrPoisson],Variance[distrPoisson],Skewness[distrPoisson],Kurtosis[distrPoisson],Kurtosis[distrGauss]}

Expectation[(x^4),x\[Distributed]distrPoisson]
Moment[distrPoisson,4]
Expectation[(x^(4/3)),x\[Distributed]distrPoisson]

Table[{k,Expectation[(((x-λ))^k),x\[Distributed]distrPoisson]},{k,6}]//TableForm

Moment[distrPoisson,6]

Map[{#,CentralMoment[distrPoisson,#]}&,Range[6]]//TableForm

Obecne podrobnosti: Help -> DiscreteDistributions a ContinuousDistributions

Nahodna cisla z Poissonova rozdeleni s parametrem λ

RandomVariate[distrPoisson,{4}]

Neni mozne generovat nahodna cisla s obecnym parametrem. Obecny parametr nutne specifikovat:

SeedRandom[13131];
RandomVariate[distrPoisson/.λ->3,4]
RandomVariate[distrPoisson/.λ->3,{4}]

To sice funguje, ale lepsi je prehlednejsi

tabPois1=RandomVariate[PoissonDistribution[3],{4}]

Jak videt, tato 4 nahodna cisla jsou jina nez v predchozim pripade. Po kazdem novem vyvolani dostaneme jedinecnou posloupnost. Pomoci nasledujici konstrukce je mozne zajistit reprodukovatelnost nahodnych posloupnosti. Vrele se doporucuje!!! Ten, kdo vystupy sleduje si muze nahodne experimenty overit.

SeedRandom[13131];
tabPois2=RandomVariate[PoissonDistribution[3],5]
SeedRandom[13131];
tabPois3=RandomVariate[PoissonDistribution[3],{5}]
tabPois4=Table[Random[PoissonDistribution[3]],{5}]

SeedRandom[13131];
tabPois3=RandomVariate[PoissonDistribution[3],{10}]

Total[tabPois3]

Matice nahodnych cisel

SeedRandom[13131];
(tabPois3=RandomVariate[PoissonDistribution[3],{3,5}])//MatrixForm

SeedRandom[13131];
(tabPois4=RandomVariate[PoissonDistribution[3],{5,3}])//MatrixForm

MaxMemoryUsed[]

SeedRandom[131311];
tabPois5=RandomVariate[PoissonDistribution[30],{100000}];
MaxMemoryUsed[]

Max[tabPois5]
Union[tabPois5]
Union[tabPois5]==Range[Min[tabPois5],Max[tabPois5]]
Row@{"Číslo/čísla, která nebyla generována:  ",Complement[Range[Min[tabPois5],Max[tabPois5]],Union[tabPois5]]}
Histogram[tabPois5]
Grid[Prepend[Tally[tabPois5]//Sort,{"Number","Frequency"}],Dividers->{{False,True},{False,True}}]

Modus Poissonova rozdělení

Maximize[(((E^(-λ)) (λ^k))/(k!)),k]

BarChart[Apply[Labeled,Reverse[{{0,5065},{1,14834},{2,22494},{3,22455},{4,16850},{5,10019},{6,4991},{7,2152},{8,781},{9,249},{10,78},{11,25},{12,5},{13,1},{15,1}},2],{1}],PlotTheme->"Marketing"]

Statisticke funkce (odkazy)

Projdete za domaci ukol (s rezervou), pripadne nejasnosti priste vysvetlim nebo zodpovim e-mailem.

TUTORIALS
Basic Statistics
Continuous Distributions
Discrete Distributions
Descriptive Statistics
Convolutions and Correlations
Curve Fitting
Statistical Model Analysis
Importing and Exporting Data
Pseudorandom Numbers
Random Number Generation

guide/StatisticalVisualization

Statistika: ukázky

PDF[PoissonDistribution[3],x]//FunctionExpand

Show[Histogram[tabPois5,{1},"Probability",PlotRange->All,PlotTheme->"Detailed"],Plot[PDF[PoissonDistribution[30],x]//Evaluate,{x,0,Max[tabPois5]},PlotStyle->Thick,PlotRange->All]]

Clear[LocationReport];LocationReport[data_]:={Mean->Mean[data],GeometricMean->GeometricMean[data],HarmonicMean->HarmonicMean[data],Median->Median[data]}

LocationReport[tabPois5]
%//N

Cviceni: Vytvorte DispersionReport (Min, Max, Rozptyl, prumer absolutnich odchylek, dolni a horni kvartil (25% a 75% kvantil), mezikvartilove rozpeti, rozpeti (Max minus Min)

DispersionReport[tabPois5]//N

Příklad (Cauchyovo rozdělení μ parametr polohy, σ parametr měřítka)

PDF[distrCauchy=CauchyDistribution[μ,σ],x]

LocationReport[distrCauchy]

SeedRandom[13131];
nahodnevyberyCauchy=RandomVariate[CauchyDistribution[],{10,10000}];
Map[LocationReport,nahodnevyberyCauchy]

SeedRandom[13131];
nahodnevyberyCauchy=RandomVariate[CauchyDistribution[],{100,10000}];
prumeryCauchy=Map[Mean,nahodnevyberyCauchy];
medianyCauchy=Map[Median,nahodnevyberyCauchy];
{Mean[prumeryCauchy],Mean[medianyCauchy]}
GraphicsRow@{Histogram[prumeryCauchy],Histogram[medianyCauchy]}

Dalsi charakteristiky

{Min[tabPois5],m5=Max[tabPois5]}
{Text@Row@{"P{Po[30]>59} = ",1-CDF[PoissonDistribution[30.],59],"\n"},
Probability[x>59,x\[Distributed]PoissonDistribution[30]],
Probability[x>59,x\[Distributed]PoissonDistribution[30.]],NProbability[x>59,x\[Distributed]PoissonDistribution[30]]}

\[Distributed] dostaneme jako EscdistEsc nebo \,[Distributed]

(Subscript[a, ij])  (Subscript[a, i,j])

Cviceni

fr5=Tally[tabPois5] (* zuctovani, tabulka *)

fr5//Sort

Setrideni podle cetnosti generovanych hodnot

Sort[fr5,#1[[2]]<#2[[2]]&]

Map[Reverse,Sort[Map[Reverse,fr5]]]

SetDirectory[NotebookDirectory[]];
BarChart[Transpose[fr5]//Last,ChartLabels->(Transpose[fr5]//First)]
Export["barChart.eps",%,ImageSize->1000]
Export["barChart.pdf",%%,ImageSize->1000]
(* ImageResolution *)

or Save Selection as from the File Menu

Histogram[tabPois5,PlotRange->All]

Vyrovnani, regrese

fr5={{2,22494},{7,2152},{6,4991},{3,22455},{1,14834},{4,16850},{5,10019},{0,5065},{8,781},{9,249},{10,78},{12,5},{11,25},{15,1},{13,1}};

GraphicsRow[{ListPlot[fr5,Joined->True,PlotStyle->Thick],ListPlot[fr5//Sort,Joined->True,PlotStyle->Thick]}]

x^(Range[6]-1)
fit5=Fit[fr5,x^(Range[6]-1),x]

Dalsi varovani pred vyrovnavanim (fitting) polynomy:

Prvni bylo pri prednasce Financni management v souvislosti s konstrukci vynosovych krivek.

p1=ListPlot[fr5,PlotStyle->PointSize[0.02]];
p2=Plot[fit5,{x,0,25},PlotRange->All];
Show[p1,p2]

FindMinimum[fit5,{x,9}]

Clear[x];
regr5=LinearModelFit[fr5,x^(Range[6]-1),x]

Hodnota regresni funkce v danem bode

regr5[9.52]

regr5//Normal

regr5["Properties"]

Více viz:

Row@{Hyperlink[Button["LinearModelFit"],"paclet:ref/LinearModelFit"],"   ",Hyperlink[Button["StatisticalModelAnalysis"],"paclet:tutorial/StatisticalModelAnalysis"]}

regr5[{"ParameterTable","RSquared"}]

regr5["ANOVATable"]

RSquared is the ratio of the model sum of squares to the total sum of squares.

**AdjustedRSquared is equal to 1-(n-1)/(n-p)(1-RSquared)
where n=Length[data]andp is the number of parameters in the model.

**Goodness-of-fit measures are used to assess how well a model fits or to compare models. The coefficient of determination "RSquared" is the ratio of the model sum of squares to the total sum of squares. "AdjustedRSquared" penalizes for the number of parameters in the model and is given by . 
"AIC"  (Akaike Information Criterion) and "BIC" (Bayesian Information Criterion) are likelihood-based goodness-of-fit measures. Both are equal to -2 times the log-likelihood for the model plus k p where p is the number of parameters to be estimated including the estimated variance. For "AIC" k is 2, and for "BIC" k is log (n).

{regr5["RSquared"],regr5["AdjustedRSquared"],regr5["AIC"]}

Rozdeleni matematicke statistiky

Nejdříve vytvoříme obecnou proceduru pro ilustraci všech tří základních rozděleních. Výstupem je list o dvou položkách, první je graf hustoty spolu s grafem hustoty normalniho rozdeleni se stejnymi parametry (volitelne) a druhá je tiskne základní charakteristiky rozdělení.

Uvedeme dvě procedury lišící se formou výstupu (se stejným názvem)

Clear[ilustracerozdeleni];
Options[ilustracerozdeleni]={graf->False};
ilustracerozdeleni[rozdeleni_,opts___]:=Module[{q01=Quantile[rozdeleni,0.001],q99=Quantile[rozdeleni,0.999],mean=Mean[rozdeleni],std=StandardDeviation[rozdeleni],igraf},
igraf=graf/.Flatten[{opts,Options[ilustracerozdeleni]}];
Which[igraf,
Plot[{PDF[NormalDistribution[mean,std],x],PDF[rozdeleni,x]}//Evaluate,{x,q01,q99},AxesOrigin->{0,0}],
True,Print["Mean = ",mean,"  Variance = ",Variance[rozdeleni],"\nSkewness = ",Skewness[rozdeleni]//PowerExpand//Simplify,"  Kurtosis = ",Kurtosis[rozdeleni]//Simplify]]
]

Clear[ilustracerozdeleni];
Options[ilustracerozdeleni]={graf->False};
ilustracerozdeleni[rozdeleni_,opts___]:=Module[{q01=Quantile[rozdeleni,0.01],q99=Quantile[rozdeleni,0.99],mean=Mean[rozdeleni],std=StandardDeviation[rozdeleni],igraf},
igraf=graf/.Flatten[{opts,Options[ilustracerozdeleni]}];
Which[igraf,
Plot[{PDF[NormalDistribution[mean,std],x],PDF[rozdeleni,x]}//Evaluate,{x,q01,q99},AxesOrigin->{0,0},PlotStyle->Thick],
True,Text@Grid[{{"Mean ",mean//TraditionalForm,"  Variance ",Variance[rozdeleni]//TraditionalForm},{"Skewness ",Skewness[rozdeleni]//PowerExpand//Simplify//TraditionalForm,"  Kurtosis ",Kurtosis[rozdeleni]//Simplify//TraditionalForm}},Frame->All]]
]

(χ^2)-kvadrát

ilustracerozdeleni[ChiSquareDistribution[n]] 
ilustracerozdeleni[ChiSquareDistribution[n],graf->True]

Manipulate[ilustracerozdeleni[ChiSquareDistribution[n],graf->True],{n,2,300,Appearance->"Labeled",ImageSize->Tiny},SaveDefinitions->True]

{PDF[ChiSquareDistribution[2],x],PDF[ExponentialDistribution[1/2],x]}

Studentovo t-rozdělení o n stupních volnosti

ilustracerozdeleni[StudentTDistribution[n]]

Manipulate[ilustracerozdeleni[StudentTDistribution[n],graf->True],{n,3,100,Appearance->"Labeled"},SaveDefinitions->True]

ilustracerozdeleni[StudentTDistribution[2.1]]
ilustracerozdeleni[StudentTDistribution[2.1],graf->True]

{PDF[StudentTDistribution[1],x],PDF[CauchyDistribution[0,1],x]}

Fisher-Snedecorovo F-rozdělení

ilustracerozdeleni[FRatioDistribution[n,m]]

Manipulate[ilustracerozdeleni[FRatioDistribution[n,m],graf->True],{n,1,100,Appearance->"Labeled"},{m,5,100,Appearance->"Labeled"},SaveDefinitions->True]

Median, Quartiles, QuartileDeviation, ...

Funguje i pro rozdeleni s obecnymi parametry

Clear[λ];
PDF[ExponentialDistribution[λ],x]
{Mean[ExponentialDistribution[λ]],Median[ExponentialDistribution[λ]],Quartiles[ExponentialDistribution[λ]]}

Quartiles[distrGauss=NormalDistribution[μ,σ]]//N

Pravidlo 2σ a 3σ

Pravděpodobnost, že normálně rozdělená náhodná veličina se v absolutní hodnotě liší od svého průměru o více než dvojnásobek směrodatné odchylky je přibližně 0.95.

{Probability[Abs[x-μ]<2σ,x\[Distributed](nr=NormalDistribution[μ,σ])]//N,
Probability[Abs[x-μ]<3σ,x\[Distributed]nr]//N}

PDF[CauchyDistribution[μ,σ],x]

{Probability[Abs[x-μ]<2σ,x\[Distributed](nc=CauchyDistribution[μ,σ])]//N,
Probability[Abs[x-μ]<3σ,x\[Distributed]nc]//N}

NonlinearModelFit

Funkce NonlinearModelFit vytváří podobný objekt jako LinearModelFit:

data={{0,1},{1,0},{3,2},{5,4},{6,4},{7,5}};
nlm=NonlinearModelFit[data,Log[a+b x^2],{a,b},x]
Normal[nlm]

Show[ListPlot[data,PlotStyle->PointSize[0.02]],Plot[nlm[x],{x,0,7}],Frame->True]

nlm["BestFitParameters"]
{a,b}/.nlm["BestFitParameters"]

*ProbitModelFit (Probitová analýza)

Pouziva se pro odhad pravdepodobnosti nesplaceni (default risk). V probitove analyze se predpoklada, ze pravdepodobnost P je funkci nezavisle promennych (Subscript[x, 1]),...(Subscript[x, k]):

P=Φ((Subscript[β, 0])+(Subscript[β, 1])(Subscript[x, 1])+...+(Subscript[β, k])(Subscript[x, k])),

kde (Subscript[β, 0]),...,(Subscript[β, k]) jsou nezname parametry a Φ je distribucni funkce N(0,1). Pozorovany jsou hodnoty Y nabyvajici hodnot 0,1 a jim odpovidajici hodnoty x. V nasledujicim priklade je k=1 a data jsou ve standardnim tvaru {x,y}.

data={{1,0},{1,1},{1,1},{2,0},{2,0},{2,1},{2,1},{2,1},{2,1},{3,1},{3,1},{3,1},{3,1},{3,1}};
probit=ProbitModelFit[data,x,x]
Normal[probit]
Show[ListPlot[data],Plot[probit[x],{x,1,3}],PlotRange->All,AxesOrigin->{.9,-.1}]
pr1=probit["PredictedResponse"]

Podobna je logitova analyza. Misto Φ se vsak pouziva distribucni funkce logistickeho rozdeleni.

**LogitModelFit

Pouziva se take pro odhad pravdepodobnosti nesplaceni (default risk)

{PDF[LogisticDistribution[μ,β],x],CDF[LogisticDistribution[μ,β],x]}//TraditionalForm

logit=LogitModelFit[data,x,x]
Normal[logit]
Show[ListPlot[data],Plot[logit[x],{x,1,3}],PlotRange->All,AxesOrigin->{.9,-.1}]

lo1=logit["PredictedResponse"]

Porovnani predikce pomoci probitu a logitu:

Max[Abs[pr1-lo1]]

**GLM (Generalized Linear Models, Zobecněný lineární model)

Důležitý v moderním pojišťovnictví. Blíže v navazujícím Mgr studiu.

GeneralizedLinearModelFit

LevyDistribution

Rozdeleni s tezkym pravym chvostem (heavy right tail). Pozor, nosic rozdeleni je (μ,∞)!!!

PDF[LevyDistribution[μ,σ],x]
Text@Row@{"Střední hodnota = ",Mean[LevyDistribution[μ,σ]]}
Text@Row@{"Median = ",Median[LevyDistribution[μ,σ]],Spacer[30],"Median numericky = ",Median[LevyDistribution[μ,σ]]//N}
Manipulate[Plot[PDF[LevyDistribution[μ,σ],x],{x,0,5}],{{μ,0},0,3},{{σ,1},0.1,3},SaveDefinitions->True]

Některé výpočty:

(∫_μ^∞)PDF[LevyDistribution[μ,σ],x]\[DifferentialD]x

{Integrate[Exp[-a (x^2)],{x,-∞,∞}],
Integrate[Exp[-a (x^2)],{x,-∞,∞},Assumptions->a>0],
(* alternativní zápis: *)Assuming[a>0,Integrate[Exp[-a (x^2)],{x,-∞,∞}]]}

Hustota je opravdu hustota:

Assuming[σ>0&&μ∈Reals,(∫_μ^∞)PDF[LevyDistribution[μ,σ],x]\[DifferentialD]x]

Porovnání čtyř rozdělení: normálního, Levyho, Cauchyova ( = t-rozdělení s jedním stupněm volnosti)  a Studentova t-rozdělení s 5 stupni volnosti (proč zrovna 5 stupňů volnosti bude vysvětleno níže). S výjímkou prvního mají zbylá rozdělení těžké chvosty. Všechna rozdělení jsou jistým způsobem “standardizovaná”, parametr polohy (location) μ:=0, parametr měřítka (scale) σ:=1. (Připomeňme, že se také vyskytuje parametr tvaru (shape parameter).)

Nejprve teoretické charakteristiky

distributions={NormalDistribution[0,1],LevyDistribution[0,1],CauchyDistribution[0,1],StudentTDistribution[5]};
Text@Grid[{{"   ",Map[ToString,distributions]}//Flatten,
{"Mean",Map[Mean,distributions]}//Flatten,
{"Quantile95",Map[Quantile[#,0.95]&,distributions]}//Flatten,
{"Quantile99",Map[Quantile[#,0.99]&,distributions]}//Flatten
}//Transpose,Frame->All,Alignment->{{Left,Center,Center,Center}}]

Dvě grafické presentace s legendami

Plot[Map[PDF[#,x]&,distributions]//Evaluate,{x,-5,5},PlotStyle->Thick,PlotLegends->distributions]

Plot[Map[PDF[#,x]&,distributions]//Evaluate,{x,-5,5},PlotStyle->Thick,PlotTheme->"Detailed"]

SeedRandom[13];rannorm=RandomReal[NormalDistribution[0,1],{100000}];
SeedRandom[13];
ranlev=RandomReal[LevyDistribution[0,1],{100000}];
SeedRandom[13];rancau=RandomReal[CauchyDistribution[0,1],{100000}];
SeedRandom[13];ranstud=RandomReal[StudentTDistribution[5],{100000}];

Ilustrace těžkých chvostů (těžkých konců, heavy tails, fat tails)

Map[Max,{rannorm,ranlev,rancau,ranstud}]

Map[Min,{rannorm,ranlev,rancau,ranstud}]

Map[Mean,{rannorm,ranlev,rancau,ranstud}]//N
Map[Median,{rannorm,ranlev,rancau,ranstud}]//N

Srovnej:

Median[LevyDistribution[0.,1]]

Select[rancau,Abs[#]>5000&]

StudentTDistribution (zobecnene)

S parametry polohy (location) μ a meritka (scale) σ.

PDF[StudentTDistribution[μ,σ,ν],x]
{Mean[StudentTDistribution[μ,σ,ν]],Variance[StudentTDistribution[μ,σ,ν]],
Skewness[StudentTDistribution[μ,σ,ν]],Kurtosis[StudentTDistribution[μ,σ,ν]]}//TraditionalForm

***Standardize

Prekvapive moznosti

Bezne

strs1=Standardize[rs1=RandomReal[{0,10},20]];
{Mean[strs1],Variance[strs1]}

Pouze nulovy prumer:

strs2=Standardize[rs1,Mean,1&];
{Mean[strs2],Variance[strs2]}

strs3=Standardize[rs1,0&,StandardDeviation];
{Mean[strs3],Variance[strs3]}

Standardize[rs1,Median,InterquartileRange]
Median[%]
InterquartileRange[%%]

Standardize[list,(Subscript[f, 1]),(Subscript[f, 2])] is effectively (list-(Subscript[f, 1])[list])/(Subscript[f, 2])[list].

***DesignMatrix (Matice planu)

Matice planu pro kvadratickou regresi s absolutnim clenem a bez nej.

data=Table[{i,i^(3/2)+RandomReal[]},{i,5}]
DesignMatrix[data,{x,x^2},x]//MatrixForm
(* Kvadratická regrese bez absolutního členu *)DesignMatrix[data,{x,x^2},x,IncludeConstantBasis->False]//MatrixForm

Statistical Packages

To, co tvůrci považují za méně používané není v jádru (kernel), ale v balíčcích. To se týká i uživatelsky vytvořených balíčků. Pro jejich použití je zapotřebí je zavést (download) pomocí <<  (Get) nebo jemnějšího Needs. Pozor na zpětnou čárku (`), jedná se o zavedení kontextu!!!

Directory[]
SetDirectory["C:\\Program Files\\Wolfram Research\\Mathematica\\11.0\\AddOns\\Packages"];
Directory[]
FileNames[]
SetDirectory[NotebookDirectory[]]

Příklad (Testování hypotéz)

<<HypothesisTesting`
(* nebo Needs["HypothesisTesting`"] *)

?HypothesisTesting`*

CI znamená interval spolehlivosti (Confidence Interval). Implicitně nastavená hladina spolehlivosti je 95%.

SeedRandom[13];
data50=RandomVariate[NormalDistribution[1,1],{50}];
SeedRandom[13];
data1000=RandomVariate[NormalDistribution[1,1],{1000}];
SeedRandom[13];
dataExp1000=RandomVariate[ExponentialDistribution[1],{1000}];

MeanCI je založen na předpokladu normálního rozdělení (t-test).

(* Hladina spolehlivosti 95% *)
MeanCI[data50]
(* Hladina spolehlivosti 99% *)
MeanCI[data50,ConfidenceLevel->.99]
MeanCI[data50,KnownVariance->1, ConfidenceLevel->.99]

{MeanTest[data50,1],MeanTest[data50,1,TwoSided->True]}

{MeanCI[data1000],MeanCI[dataExp1000]}

**Příklad (StatisticalPlots, nepovinné)

<<StatisticalPlots`

?StatisticalPlots`*

Metody Monte Carlo (MC) 1 (Simulační metody)

MC metody: odvětví experimentální matematiky, které se zabývá experimenty s náhodnými čísly. Numerická technika provádění hromadných experimentů s modely pomocí počítače umožňující generovat velké množství náhodných výběrů. Většinou jsou efektivnější v situacích, kdy sama podstata problému je náhodná. Při řešení deterministických problémů tomu jsou většinou úspěšnější klasické metody numerické matematiky.

*Náhodná čísla z rovnoměrného rozdělení

Náhodná čísla by měly mít vlastnosti náhodného výběru, nezávislé stejně rozdělené náhodné veličiny (iid, independent identically distributed r. v.))

Pro úspěšné použití metod MC je nutné mít kvalitní generátory náhodných čísel.

V současnosti nejúspěšnější jsou generátory posloupností náhodných čísel založeny na rafinovaných deterministických algoritmech, které produkují tzv. pseudonáhodná čísla. Při znalosti vstupních parametrů je možné příslušnou posloupnost přesně zrekonstruovat.  Ukazuje se, že generátory založené na deterministických algoritmech jsou podstatně lepší než ty, které jsou založené na “opravdové náhodě” (tahání očíslovaných lístků z urny, výběr očíslovaných pingpongových míčků, ruleta, házení kostkou, šum elektronek, házení mincí aj.)

Na generátorech náhodných resp. pseudonáhodných čísel se v zásadě požaduje: dlouhá perioda (nesmí se začít opakovat příliš brzy, vyžaduje se řádově (10^8) členů posloupnosti bez opakování), nezávislost nebo nekorelovanost, konečně to, aby se řídila požadovaným rozdělením, sdruženým rozdělením dvojic, trojic, atd. Teorie čísel (v poslední době teorie celulárních automatů aj.) poskytuje fundamentální podklad pro konstrukci generátorů, nicméně je stejně dobrá praxe podrobit nový generátor baterii statistických testů. Takové testy by měly být specielně zaměřeny na to, k jakému účelu mají být náhodná čísla použita.

⚠ V drtivé většině případů se primárně generují náhodná čísla z rovnoměrného rozdělení a ta se vhodnými postupy transformují na náhodná čísla z požadovaného rozdělení. Na počítači je přirozeně možné generovat náhodná čísla z diskrétního rovnoměrného rozdělení, řekněme R(0,...,M-1), kde M je “velké číslo”, např. (2^31). Po normování je možné takto generovaná náhodná čísla považovat za náhodná čísla ze spojitého rovnoměrného rozdělení R(0,1).

Podrobnosti mj. Hurt, J. (1982): Simulační metody. Skripta. SPN, Praha.

Hyperlink[Button["Random Number Generation"],"paclet:tutorial/RandomNumberGeneration"]

Kongruenční generátory

Kongruence zde i dále znamena zbytek po deleni. Generuji se cisla 0,1,...,M-1. Generator typu (Subscript[X, n+1])≡a (Subscript[X, n]) mod M se nazyva multiplikativni, 
(Subscript[X, n+1])≡a (Subscript[X, n])+b  mod M smisena kongruencni metoda. Při vhodně zvolených konstantách a,b,M mají dlouhou periodu (začnou se opakovat až za “dlouho”), někdy dokonce maximální možnou, tj. M.

Pro ilustraci uzijeme zabudovanou funkci Mod:

(illustrationModulo=Prepend[Flatten[Table[{x,y,Mod[x,y]},{x,2,5},{y,2,x}],1],{"x","M","Mod[x,M]"}])//TableForm

Následující výstup je mírně modifikovaný výstup s využitím příkladu z Help k funkci Grid:

Text@Grid[illustrationModulo,Background->{None,{Lighter[Yellow,.9],{White,Lighter[Blend[{Blue,Green}],.8]}}},Dividers->{{Darker[Gray,.6],{Lighter[Gray,.5]},Darker[Gray,.6]},{Darker[Gray,.6],Darker[Gray,.6],{False},Darker[Gray,.6]}},Alignment->{{Center,Center,Center}},ItemSize->{{2,2,5}},Frame->Darker[Gray,.6],ItemStyle->14,Spacings->{Automatic,.8}]

Příklad 1 (Perioda)

Generovani posloupnosti 17 nahodnych cisel     (Subscript[X, n+1])≡5(Subscript[X, n])+1 mod 16. Perioda je maximalni rovna 16.

gen16=NestList[Mod[5 # +1,16]&,0,16]

Příklad 2  (Vetsi problem, rozdeleni dvojic. Stejny generator (Subscript[X, n+1])=5(Subscript[X, n])+1 mod 16.)

Hypoteticky má každá dvojice pst 1/(16^2)=1/256. Vzhledem k rekurenci však není možné generovat více než 16-1 dvojic. Generovaná čísla leží na dvou systémech přímek.

Zkoumáme rozdělení dvojic ((Subscript[X, n]),(Subscript[X, n+1])).

gen16shift=RotateLeft[gen16]

ListPlot[Transpose[{gen16,gen16shift}],PlotStyle-> PointSize[0.02]]

Příklad 3 (Generator kapesniho kalkulatoru TI-59)

Nasledujici funkce generuje nahodna cisla smisenou kongruencni metodou delky n+1. Perioda by mela byt 199016.

Clear[gen59];
gen59[n_]:=NestList[Mod[24298 # +9991,199017]&,0,n]

gen59[10]

Počet různých generovaných náhodných čísel v posloupnosti délky 200000:

Length[Union[gen59[200000]]]

Po sobe jdouci dvojice

gen592[n_]:=Module[{shift,g},
shift=RotateLeft[g=gen59[n]];
Transpose[{g,shift}]
]

gen592[50000]//ListPlot

V detailu:

ListPlot[gen59compl=Select[gen592[199017],(#[[1]]<1000)&]]

Příklad 4 (Velmi špatný kongruenční generátor IBM ze šedesátých let)

http://demonstrations.wolfram.com/PoorStatisticalQualitiesForTheRANDURandomNumberGenerator/

*Náhodná čísla z jiných rozdělení

Universální metoda

Věta (Metoda inverzni transformace)

Nechť náhodná veličina X má distribuční funkci F a kvantilovou funkci (F^(-1))(y)=inf{x|F(x)≥y}, 0<y<1. Nechť U∼R(0,1). Potom (F^(-1))(U) má rozdělení s ditribuční funkcí F, tj., má rozdělení jako X. Platí pro libovolné rozdělení, spojité, diskrétní a libovolné jiné!!!

Priklad (exponencialni rozdeleni se stredni hodnotou 1)

dFexp[x_]:=1-(E^(-x))
Plot[dFexp[x],{x,0,10}]

sol1=Solve[dFexp[x]==y,x,Reals]//Simplify[#,Assumptions->0<y<1]&
invF[y_]=First[x/.sol1]
invF[z]

alternativne

InverseCDF[ExponentialDistribution[1],y]
Quantile[ExponentialDistribution[1],y]

Attributes[Log]

nahexp=invF[RandomVariate[UniformDistribution[{0,1}],{100000}]];
{Mean[nahexp],Variance[nahexp],Max[nahexp]}
Histogram[nahexp,100,"PDF",Epilog->First@Plot[PDF[ExponentialDistribution[1],x],{x,0,5},PlotStyle->{Red,Thick}]]

DistributionFitTest[nahexp,ExponentialDistribution[1],"HypothesisTestData"]["TestDataTable",All]

RandomVariate[ExponentialDistribution[λ]]

Box-Mullerova transformace

http://en.wikipedia.org/wiki/Box% E2 %80 %93 Muller_transform

***Příklad 5 Generovani nahodnych cisel z velmi zvlastnich rozdeleni (prevzato z MathGroup Archive: December 1998 [00243], Paul Abbott)

Pripominka: Metoda inversni transformace je zalozena na znalosti kvantilove funkce.

Clear[pdf];
pdf[A_,s_][r_]:=(r/s^2*BesselI[0,(r*A)/s^2])/E^((A^2+r^2)/(2*s^2));

pdf[1,1][x]

After some 93 (version 7) 25 (version 8, 9) seconds we get that pdf is really a PDF.

Integrate[pdf[A,s][r],{r,0,∞},Assumptions->Re[(s^2)]>0&&(Re[(A/(s^2))]>0||(Re[(A/(s^2))]==0&&Im[(A/(s^2))]>0))]//Simplify

Print["Mean =  ",e11=Integrate[x pdf[1,1][x],{x,0,∞}]//N,"   Variance =   ",Integrate[(x^2) pdf[1,1][x],{x,0,∞}]-(e11^2)//N]

Plot[pdf[1,1][x],{x,0,5}]

Remark: Use NDSolve (and dynamic programming) instead of NIntegrate to determine the CDF:

Clear[cdf,r];
cdf[A_,s_]:=cdf[A,s]=Module[{y},
First[y/.NDSolve[{y'[r]==pdf[A,s][r],y[0]==0},y,{r,0,10}]]]

Porovnejte s vypoctem CDF pomoci integrace.

From the plot,

cdfplot=Plot[cdf[1,1][x],{x,0,10},PlotRange->All]

Short[InputForm[cdfplot],10]

extract the plotpoints (which takes advantage of the adaptive code built into Plot):

Clear[x];
pts=Cases[cdfplot,Line[{x__}]->x,Infinity];

ListPlot[pts]

and then numerically compute the inverse function using interpolation:

Map[Reverse,pts]//ListPlot

inverseCDF[1,1]=Interpolation[Map[Reverse,pts]];

Plot[inverseCDF[1,1][x],{x,0.0000001,0.9999999999}]

Table[inverseCDF[1,1][Random[]],{10}]

Uziti vymozenosti verze 8, 9, 10

𝒟velmizvlastni=ProbabilityDistribution[(E^((1/2) (-1-(x^2)))) x BesselI[0,x],{x,0,∞}]

{Mean[𝒟velmizvlastni],Variance[𝒟velmizvlastni]}//N

nahodnacislazvelmizvlastnihorozdeleni=RandomVariate[𝒟velmizvlastni,{1000}];
Histogram[%]

Testy dobré shody (Tests of Goodness of Fit)

(Subscript[H, 0]): Náhodný výběr (iid) (Subscript[X, 1]),...(Subscript[X, n]) pochází z rozdělení s distribuční funkcí (Subscript[F, 0]), která je buď úplně specifikovaná nebo patří do nějaké třídy rozdělení s neznámými parametry. Nejznámější testy:

Kolmogorov-Smirnovův test: založen na testové statistice (Subscript[K, n])=(sup_x)  |(Subscript[(OverHat[F]), n])(x)-(Subscript[F, 0])(x)|, kde (OverHat[F])(Subscript[, n])(x) je empirická distribuční funkce. V tomto případě musí být (Subscript[F, 0]) plně specifikovaná (bez neznámých parametrů).

(χ^2)- test dobré shody: Nechť X je náhodná veličina s hypotetickou distribuční funkcí (Subscript[F, 0]), A necht je obor možných hodnot, tj. P(X ϵ A)=1, A=(Subscript[A, 1])⋃...⋃(Subscript[A, k]) disjunktní rozklad na třídy (obvykle intervaly), (Subscript[p, j])=P(X ϵ (Subscript[A, j])), tzv. teoretické pravděpodobnosti tříd, n,(Subscript[p, j]) jsou tedy teoretické četnosti tříd (expected frequencies), (Subscript[n, j]) počet pozorování náhodného výběru, která padnou do třídy (Subscript[A, j])(observed frequencies). Test je založen na testové statistice

(χ^2)=(∑_(j=1)^k)(((((Subscript[n, j])-n,(Subscript[p, j])))^2)/(n,(Subscript[p, j]))).

Za platnosti nulové hypotézy má tato statistika asymptoticky (pro n ⟶ ∞)  (χ^2)- rozdělení o k-1 stupních volnosti. Pro “platnost” asymptotiky se obvykle požaduje, aby pro všechny třídy platilo n,(Subscript[p, j])>5. Test je možné použít i v případě, že (Subscript[F, 0]) a obsahuje neznámé parametry. Ty se odhadnou a místo (Subscript[p, j]) se pak vezmou odhady (Subscript[(OverHat[p]), j]). Je-li počet neznámých parametrů m, má testová statistika asymptoticky (χ^2)-  rozdělení o k-m-1 stupních volnosti.

DistributionFitTest

Testy náhodnosti (Tests of independence, tests of randomness)

In what follows we consider the sequence (Subscript[X, 1]),...,(Subscript[X, n]) to be tested for randomness.

Since the number of the observationsin simulation studies is usually large we may often restrict ourselves to  asymptotic tests only. Some tests based on combinatorial functions may be performed as exact tests in Mathematica since the combinatorial functions work well in the system even for large samples. In commercial statistical packages the exact tests (if any) are limited to some 50 observations.

Zatímco ve všech předchozích situacích se asymptotika (přibližné rozdělení nějaké statistiky pro větší rozsahy výběru) týkala případu iid (nezávislých stejně rozdělených náhodných veličin, independent identically distributed rv), u následujících dvou testů použijeme centrální limitní větu pro konečně závislé, přesněji m- závislé náhodné veličiny.

Stejně rozdělené náhodné veličiny (Subscript[X, 1]),(Subscript[X, 2]),... se nazývají m- závislé, jestliže (Subscript[X, k]),(Subscript[X, k+m]) jsou závislé, ale (Subscript[X, k]),(Subscript[X, k+m+1]) jsou pro všechna k nezávislé.

Signs of differences test (Test podle znamének diferencí)

This is the simplest test that immediately shows a rude violence of independence, but it is not robust against alternatives like oscillations, &c. The test statistic C is the total number of sign differences in the sequence. Likely a monotonous trend may be discovered but, as mentioned, it fails if the alternative are oscillating observations.

Necht testovana posloupnost je (Subscript[X, 1]),...,(Subscript[X, n]). Polozme (Subscript[Y, i])=I{(Subscript[X, i])<(Subscript[X, i+1])},  i=1,...,n-1,

C=(Underoverscript[∑ , ( i=1), (n-1)])(Subscript[Y, i]).

Nulová hypotéza je (Subscript[H, 0]): (Subscript[X, 1]),...,(Subscript[X, n]) je náhodná posloupnost, tj., je to posloupnost iid. Pozor, ani za platnosti (Subscript[H, 0]) nejsou (Subscript[Y, j]) nezávislé! Jsou ale stejně rozdělené a konečně závislé (finitely dependent, 1-finitely dependent, 1-závislé): (Subscript[Y, 1]),(Subscript[Y, 2]) jsou závislé, ale (Subscript[Y, 1]),(Subscript[Y, 3]) jsou již  za platnosti (Subscript[H, 0]) nezávislé!

Pro střední hodnotu C platí E,C=(n-1)E,(Subscript[Y, 1]) a pro rozptyl tedy s uvážením cov((Subscript[Y, 1]),(Subscript[Y, j]))=0 pro j≥3 platí,

var C=(∑_(j=1)^(n-1))var (Subscript[Y, j])+(∑_(j=1)^(n-1))(∑_(k=1,j≠k)^(n-1)) cov ((Subscript[Y, j]),(Subscript[Y, k]))=
(n-1)var (Subscript[Y, 1])+2(n-2)cov ((Subscript[Y, 1]),(Subscript[Y, 2])).

Poznamenejme, že následující úvahy neplatí jenom pro rovnoměrné rozdělení, ale pro libovolné spojité rozdělení, které má rostoucí distribuční funkci na svém nosiči. (Dokažte za cvičení.)

For proofs we may restrict ourselves to the case of the uniform distribution of (Subscript[X, i])'s on (0,1). Define the join distribution of  ((Subscript[Y, 1]),(Subscript[Y, 2]),(Subscript[Y, 3])), here vector yy.

Clear[xx,x];
xx=Table[x[i],{i,5}];
yy=TransformedDistribution[{Boole[x[1]<x[2]],Boole[x[2]<x[3]],Boole[x[3]<x[4]]},xx\[Distributed]ProductDistribution[{UniformDistribution[],Length[xx]}]]
Text@Row@{"Mean: ",meanYY=Mean[yy],Spacer[20],"Covariance matrix:  ",(covarianceYY=Covariance[yy])//MatrixForm}

The central limit theorem for finitely dependent random variables (r. v.) may apply. In the sequence of differences only the neighbours are dependent while the farther observations are independent. So the sequence consists of 1-finitely dependent r. v.

We need to calculate the mean and variance and use them for the standardized test statistic. After a simple algebra (analogous approach we use in the more complicated case of local extremes analyzed in the next Subsection) we get

Text@Row@{"EC = ",(EC=(n-1)meanYY[[1]])//TraditionalForm,Spacer[20],"   var C = ", (varC=(n-1)covarianceYY[[1,1]]+2(n-2)covarianceYY[[1,2]])//TraditionalForm}//Simplify

Nyní stačí aplikovat CLV pro konečně závislé (v tomto případě 1 - závislé) náhodné veličiny:

({{({{((C-E,C)/(Sqrt[var C]))(Overscript[⟶, 𝒟])}})N(0,1)}})

pro n ⟶ ∞, (konvergence je v distribuci).

Implementace:

Needs["HypothesisTesting`"];
Clear[differencesTestAsymptotic];
differencesTestAsymptotic[data_,datasource_:"General Data"]:=Module[{signs=(1/2)(Sign[Rest[data]-Most[data]]+1),n=Length[data],crit,totalofsigns},
totalofsigns=Total[signs];
(* standardized statistic: *)
crit=Abs[(Sqrt[(12/(n+1))])(totalofsigns-(1./2)(n-1))];
Text@Grid[{{"Data   ",ToString[datasource]},
{"No. of observations   ",n},{"Total number of sign differences   ",totalofsigns},{"Standardized statistic   ",crit},{"Two-sided p-value  ",TwoSidedPValue/.NormalPValue[crit,TwoSided->True]}},Frame->{False,All},Alignment->Left]
	]

Konec 2017-01-03

Example (Random Sequence)

(* Intentionally no RandomSeed here *)
differencesTestAsymptotic[RandomVariate[UniformDistribution[],1000]]
(* Just the p-value: *)
Cases[%,_?NumberQ,Infinity]//Last

Vysvětlení následujícího postupu:

With[{test=differencesTestAsymptotic[RandomVariate[UniformDistribution[],1000]]},
Cases[test,_?NumberQ,Infinity]//Last]

Následně generujeme tabulku 1000 p - hodnot  testů z tisíce výběrů rozsahu 1000. Interpretace hladiny testu α: platí-li nulová hypotéza a provedeme-li 1000 testů, pak by hypotéza měla být zamítnuta zhruba v 1000α případech; zamítnutí hypotézy je ekvivalentní tomu, že p-hodnota<α. Vyzkoušíme na hladiny 0.05 a 0.01. Zamítnutí by tedy mělo být přibližně v 50 resp. 10 případech.

tab1000=Table[With[{test=differencesTestAsymptotic[RandomVariate[UniformDistribution[],1000]]},
Cases[test,_?NumberQ,Infinity]//Last],1000];
{Select[tab1000,#<0.05&]//Length,Select[tab1000,#<0.01&]//Length}

Real Data: Standard & Poor’s 500, Coke, Coca-Cola, VW, Apple

Budeme zkoumat denní výnosy pěti aktiv za 1 rok.

Text@Row@{"Sledované období od ",startDate=(Today//Normal)[[1;;3]]-{1,0,0}," do ",endDate=(Today//Normal)[[1;;3]]}
companies={"SP500","Coke","KO","F:VOW","AAPL"};
Text@Row@{"Aktuální datum  ",DateObject[]}
Text@Grid[Prepend[ Map[{#,FinancialData[#,"Company"],FinancialData[#]}&,companies],{"Ticker","Name","Actual Price"}],Frame->All]

DateObject[]
returnsDailyValues=Map[FinancialData[#,"Return",{startDate,endDate},"Value"]&,companies];

returnsAssociation=Association[Thread[companies->returnsDailyValues]];
Keys[returnsAssociation]
(* Počty obchodních dnů pro studované tituly *)
Map[Length,Values[returnsAssociation]]

Correlation matrix of the returns (VW excluded since the correlation matrix may be computed from the vectors of the equal length).

returnsAssociationWithoutVW=KeyDrop[returnsAssociation,"F:VOW"];
Correlation[returnsAssociationWithoutVW//Values//Transpose]//TableForm

differencesTestAsymptotic[returnsAssociation//Values//First,returnsAssociation//Keys//First]

Map[differencesTestAsymptotic[#//First,#//Last]&,{returnsAssociation//Values,returnsAssociation//Keys}//Transpose]

Závěry z 4. ledna 2016: U SP500 na základě testu podle znamének diferencí zamítáme hypotézu nezávislosti na 5% (ale už ne na 1%), u Apple na 10% (ale už ne na 5%). U zbylých společností na základě tohoto testu nemůžeme hypotézu nezávislosti zamítnout.

Závěry z 2. ledna 2017: Na základě testu znamének diferencí nemůžeme hypotézu nezávislosti zamítnout u žádné z uvedených společností.

Test of local extremes (test extremálních hodnot, body zvratu)

Note that this test is equivalent to the test of sequences and reversals (see [2]). The test statistic is the total number of local extremes (both maximum and minimum) in the data:

Preliminaries

Despite the results are well known, we show how to use built-in TransformedDistribution X-> Y for to derive the exact probabilities. For the sake of simplicity we first consider the sequence of length 5 which is the minimum length for valid considerations.

Clear[X,XX,Y,YY];
XX=Table[X[i],{i,5}];
YY=Table[Y[i]=Boole[Or[X[i]<X[i+1]>X[i+2],X[i]>X[i+1]<X[i+2]]],{i,3}]

Zde Y[i] je indikátor lokálního extrému: Y[i]=1 jestliže X[i+1] je větší nebo menší než okolní hodnoty X[i],X[i+2]. Dále sice uvádíme mechanický postup pro ilustraci zabudovaných funkcí, ale je možné také vyjít z následující úvahy: Všech možných uspořádání trojice (různých) čísel je 3!,=6. V kolika případech je prostřední číslo větší resp. menší než sousedi? Atd.

Testová statistika je celkový počet lokálních extrémů v posloupnosti

P=(Underoverscript[∑ , ( i=1), (n-2)])(Subscript[Y, i]).

Je zřejmé, že (Subscript[Y, 1]),(Subscript[Y, 2]),... je posloupnost 2- závislých veličin.  Pro střední hodnotu P platí E,P=(n-2)E,(Subscript[Y, 1]) a pro rozptyl tedy s uvážením cov((Subscript[Y, 1]),(Subscript[Y, j]))=0 pro j≥4 platí,

var P=(∑_(j=1)^(n-2))var (Subscript[Y, j])+(∑_(j=1)^(n-2))(∑_(k=1,j≠k)^(n-2)) cov ((Subscript[Y, j]),(Subscript[Y, k]))=
(n-2)var (Subscript[Y, 1])+2(n-3)cov ((Subscript[Y, 1]),(Subscript[Y, 2]))+2(n-4)cov ((Subscript[Y, 1]),(Subscript[Y, 3])).

Pro jednoduchost se opět omezíme na rozdělení R(0,1). 𝒟cinque je sdružené rozdělení náhodného vektoru pěti iid R(0,1) složek. Pro úplnost uvádíme také číselné charakteristiky.

𝒟cinque=ProductDistribution[{UniformDistribution[],5}];
{Mean[𝒟cinque],Variance[𝒟cinque],Covariance[𝒟cinque]};

Sdružené rozdělení ((Subscript[Y, 1]),(Subscript[Y, 2]),(Subscript[Y, 3])):

𝒟extreme=TransformedDistribution[YY,XX\[Distributed]𝒟cinque];
{expextreme=Mean[𝒟extreme],Variance[𝒟extreme]}
(covextreme=Covariance[𝒟extreme])//MatrixForm

Clear[n]; (* n-2 summands *)
Text@Row@{"Mean of P:   ", (meanP=(n-2)expextreme[[1]])//TraditionalForm,"   Variance of P:   ",
(PvarP=((n-2) covextreme[[1,1]]+2(n-3) covextreme[[1,2]]+2(n-4) covextreme[[1,3]])//Simplify)//TraditionalForm}

So if P is the total number of local extremes in the sequence then

E,P=((2(n-2))/3)           var P=((16n-29)/90).

Here we apply the central limit theorem for finitely dependent r. v. again. Recall that the sequence of Boolean indicators is a sequence of 2-finitely dependent r. v.:

({{({{((P-E,P)/(Sqrt[var P]))(Overscript[⟶, 𝒟])}})N(0,1)}})

pro n ⟶ ∞, (konvergence je v distribuci).

The procedure

To identify local extremes we use Partition with the offset to create subsequent triples:

Clear[iX,iXX];
iXX=Table[iX[k],{k,10}]
Partition[iXX,3,1]//TableForm

Needs["HypothesisTesting`"];
Clear[localExtremesTestAsymptotic];localExtremesTestAsymptotic[data_,datasource_:"General Data"]:=Module[{triples,booleextreme,n=Length[data],crit,totalofextremes},
booleextreme[{x1_,x2_,x3_}]:=Boole[(x1<x2&&x2>x3)||(x1>x2&&x2<x3)];triples=Partition[data,3,1];
totalofextremes=Total[Map[booleextreme,triples]];
(* standardized statistic *)crit=Abs[(Sqrt[(90/(16n-29))])(totalofextremes-(2./3)(n-2))];
Text@Grid[{{"Data   ",ToString[datasource]},
{"No. of observations   ",n},{"Total number of local extremes   ",totalofextremes},{"Standardized statistic   ",crit},{"Two-sided p-value  ",TwoSidedPValue/.NormalPValue[crit,TwoSided->True]}},Frame->{False,All},Alignment->Left]
]

Example: Simulation

(* Intentionally no RandomSeed here *)
localExtremesTestAsymptotic[RandomVariate[UniformDistribution[],1000],"Random Sequence"]
(* Just the p-value: *)
Cases[%,_?NumberQ,Infinity]//Last

Example (Random Oscillating Sequence)

ListPlot[RandomSeed[13];
oscillatingSin=RandomVariate[UniformDistribution[],100]+10Sin[Range[100]],Joined->True,PlotTheme->"Detailed",PlotLabel->"Oscillating sequence"]
localExtremesTestAsymptotic[oscillatingSin,"Oscillating sequence"]

Conclusion: Obvious dependence. Note that the test of sign differences did not discover anything.

Real Data: Standard & Poor’s 500, Coke, Coca-Cola, VW, Apple

Budeme opět zkoumat denní výnosy pěti aktiv za 1 rok.

Map[localExtremesTestAsymptotic[#//First,#//Last]&,{returnsAssociation//Values,returnsAssociation//Keys}//Transpose]

Zde je na 5% významné jenom VW. Připomeňme závěry testu podle znamének diferencí :

U SP500 na základě testu podle znamének diferencí zamítáme hypotézu nezávislosti na 5% (ale už ne na 1%), u Apple na 10% (ale už ne na 5%). U zbylých společností na základě tohoto testu nemůžeme hypotézu nezávislosti zamítnout.

Už po provedení dvou testů náhodnosti je patrné, že jeden nebo dva testy nestačí. Podobně jako u generátorů náhodných čísel je i pro reálná data vhodné aplikovat baterii statistických testů zejména s ohledem na volbu vhodného modelu. Viz

**Baterie statistickych testu

Generatory nahodnych cisel se testuji baterii statistickych testu, z nichz nektere uvadime. Podrobnosti viz výše citované  HURT: Simulacni metody, jeste podrobneji KNUTH: The Art of Computer Programming. Viz take CIPRA: Financni ekonometrie a HURT (WTC 2012):

Hyperlink[Button["Statistical Inference from Financial Data with Mathematica"],"http://www.karlin.mff.cuni.cz/~hurt/WTC2012_Jan_Hurt_Statistical_Inference_Working_with_Reference2.nb"]

*Runs test

This test is based on iterations below and above some value like mean or median, more often called runs. If we have a series of the elements of two kinds, A and B, say, then by a run we mean a contiguous sequence of the elements of the same kind. For example in the sequence A,A,B,B,B,A,A,B,A there are runs A,A, B,B,B, A,A, B, A and the total number of runs is 5. Note that the original Wald-Wolfowitz runs test was designed as a test whether two samples are from the same population, see [4] e. g.

Here we consider runs below and above median. Suppose (Subscript[X, 1]),...,(Subscript[X, n]) is the series in question, M the sample median. If we delete possible zeros in the sequence

𝒮={sign((Subscript[X, 1])-M),...,sign((Subscript[X, n])-M) }

we get the sequence of ±1’s. Let Q be the total number of runs in this sequence, i. e., the total number of contiguous subsequences plus ones and minus ones, respectively.  Note that if n is odd and there are no ties in sequence 𝒮 then there is the same number m=(n-1)/2 of plus ones and minus ones in 𝒮. Analogously, if n is even, no ties, there is the same number m=n/2 of plus ones and minus ones in 𝒮.  In [5], p. 361 (e. g.) we find that the first two moments of the number of runs are

E,Q=m+1           var Q=((m(m-1))/(2m-1)).

Since the procedure below is designed for a more general case (not only the iterations below and above median), we distinguish between the number of positive signs (Subscript[n, 1]) and negative signs (Subscript[n, 2]) in 𝒮.

Needs["HypothesisTesting`"];
Clear[runsTestAsymptotic]; (* iterations below and above median *)
runsTestAsymptotic[data_,datasource_:"General Data"]:=
Module[{signs,splitting,numberofruns,n,n1,n2,rmean,rvariance,crit,median=Median[data]},
signs=Sign[data-median]//N;
splitting=Split[DeleteCases[signs,0.]];
numberofruns=Length[splitting]; (* total number of runs *)
n1=Count[signs,1.]; (* number of positive values *)
n2=Count[signs,-1.]; (* number of negative values *)
n=n1+n2;
rmean=((2 n1 n2)/(n1+n2))+1; rvariance=((2.n1 n2(2n1 n2 -n1-n2))/((((n1+n2))^2)(n1+n2-1)));
crit=Abs[((numberofruns-rmean)/(Sqrt[rvariance]))];
Text@Grid[{{"Data   ",ToString[datasource]},
{"No. of observations   ",Length[data]},{"Median   ",median},{"Number of runs   ",numberofruns},{"Expected   ",rmean},{"Standardized statistic   ",crit},{"Two-sided p-value  ",TwoSidedPValue/.NormalPValue[crit,TwoSided->True]}},Frame->{False,All},Alignment->Left]
]

Example: Simulation

(* Intentionally no RandomSeed here *)
runsTestAsymptotic[RandomVariate[UniformDistribution[],1000],"Random Sequence"]
(* Just the p-value: *)
Cases[%,_?NumberQ,Infinity]//Last

Example (Random Oscillating Sequence)

ListPlot[RandomSeed[13];
oscillatingSin=RandomVariate[UniformDistribution[],100]+10Sin[Range[100]],Joined->True,PlotTheme->"Detailed",PlotLabel->"Oscillating sequence"]
runsTestAsymptotic[oscillatingSin,"Oscillating sequence"]

Conclusion: Obvious dependence. Note that the test of sign differences did not discover anything.

Detailed calculation

median=Median[oscillatingSin]
(signs=Sign[oscillatingSin-median]//N)
splitting=Split[DeleteCases[signs,0.]]
numberofruns=Length[splitting] (* total number of runs *)
n1=Count[signs//N,1.] (* number of positive values *)
n2=Count[signs//N,-1.] (* number of negative values *)

Real Data: Standard & Poor’s 500, Coke, Coca-Cola, VW, Apple

Map[runsTestAsymptotic[#//First,#//Last]&,{returnsAssociation//Values,returnsAssociation//Keys}//Transpose]

Zde je na 5% významné jenom VW. Připomeňme závěry testu podle znamének diferencí :

U SP500 na základě testu podle znamének diferencí zamítáme hypotézu nezávislosti na 5% (ale už ne na 1%), u Apple na 10% (ale už ne na 5%). U zbylých společností na základě tohoto testu nemůžeme hypotézu nezávislosti zamítnout.

Už po provedení dvou testů náhodnosti je patrné, že jeden nebo dva testy nestačí. Podobně jako u generátorů náhodných čísel je i pro reálná data vhodné aplikovat baterii statistických testů zejména s ohledem na volbu vhodného modelu. Viz

Aplikace

Pokus: dokaze clovek generovat nahodne cislice?

Pokusná osoba se snaží na numerické klávesnici “náhodně” vytvářet posloupnost číslic 0,1,...,9. Požadovaným výstupem je posloupnost, která se chová jako náhodný výběr z diskrétního rovnoměrného rozdělení U(0,1,...,9).

EscscDEsc vytvori 𝒟

SeedRandom[152];
RandomSample[{sona,petr,jelena,petra,tobias},1]

𝒟unif=DiscreteUniformDistribution[{0,9}];
{Mean[𝒟unif],Median[𝒟unif],StandardDeviation[𝒟unif]}//N

SeedRandom[1313131];
Sort[Tally[unif=RandomVariate[𝒟unif,315]],#1[[2]]<#2[[2]]&]
SeedRandom[1313];
Sort[Map[Reverse,Tally[unif=RandomVariate[𝒟unif,315]]]]
(* DistributionFitTest viz dale *)
ℋunif=DistributionFitTest[unif,DiscreteUniformDistribution[{0,9}],"HypothesisTestData"];
ℋunif["TestDataTable",All]

Histogram[unif]

petr=
;alena=;
vera=;
michal=;
martin=;
honza=;

michal5=IntegerDigits[michal];
vera5=IntegerDigits[vera];
alena5=IntegerDigits[alena];
martin5=IntegerDigits[martin];
honza5=IntegerDigits[honza];
petr5=IntegerDigits[petr];
{Length[michal5],Length[honza5]}

Clear[datareport];
datareport[data_,noclass___]:=Module[{mi=Min[data],ma=Max[data],bin,h,k,le,mea,med,se},
k=If[noclass===Null,10,noclass];
bin=BinCounts[data,{mi,ma,h=((ma-mi)/k)}];Print["No. = ",le=Length[data],"\nMin = ",mi," Max = ",ma,"\nMean= ",mea=Mean[data]//N," Median = ",med=Median[data]//N,"\nSE = ",se=StandardDeviation[data]//N," VaR 5% = ",Quantile[data,0.05`]," VaR 1% = ",Quantile[data,0.01`]];Histogram[data,k]]

𝒟unif=DiscreteUniformDistribution[{0,9}];
{Mean[𝒟unif],Median[𝒟unif],StandardDeviation[𝒟unif]}//N

datareport[petr5,10]
(* Vsimnete si rozdilu mezi //N a bez numericke hodnoty! *)

Test dobre shody (test of goodness of fit)

ℋmichal=DistributionFitTest[michal5,DiscreteUniformDistribution[{0,9}],"HypothesisTestData"];ℋvera=DistributionFitTest[vera5,DiscreteUniformDistribution[{0,9}],"HypothesisTestData"];
ℋalena=DistributionFitTest[alena5,DiscreteUniformDistribution[{0,9}],"HypothesisTestData"];
ℋmartin=DistributionFitTest[martin5,DiscreteUniformDistribution[{0,9}],"HypothesisTestData"];
ℋhonza=DistributionFitTest[honza5,DiscreteUniformDistribution[{0,9}],"HypothesisTestData"];
ℋpetr=DistributionFitTest[petr5,DiscreteUniformDistribution[{0,9}],"HypothesisTestData"];

ℋpetr["Properties"]

ℋmichal["TestDataTable",All]
ℋvera["TestDataTable",All]
ℋalena["TestDataTable",All]
ℋmartin["TestDataTable",All]
ℋhonza["TestDataTable",All]
ℋpetr["TestDataTable",All]

differencesTestAsymptotic[petr5,"Petr"]

localExtremesTestAsymptotic[petr5,"Petr"]

runsTestAsymptotic[petr5,"Petr"]

**Nalezeni vhodneho rozdeleni (ideově automatické vyhledávání vhodného rozdělení není zcela v pořádku)

Zabudovaná funkce

FindDistribution[petr5]

(* distributions={NormalDistribution[μ,σ],ChiSquareDistribution[n],FRatioDistribution[n,m]} *)
SeedRandom[1313];
distributions={Automatic,NormalDistribution[μ,σ],ExponentialDistribution[λ]};
datagener=RandomVariate[ChiSquareDistribution[300],{10000}];
Histogram[datagener]
dft=Map[DistributionFitTest[datagener,#,"HypothesisTestData"]&,distributions];
Map[#["TestDataTable",All]&,dft]

Testovani nahodnosti (korelogram)

?*Distribution

Uvodni priklad (spojite rovnomerne rozdeleni)

Nechť (Subscript[X, 1]), (Subscript[X, 2]), (Subscript[X, 3]) jsou nezávislé stejně rozdělené náhodné veličiny (iid, independent identically distributed random variables) s rovnoměrným rozdělením R(0,1). Spočítáme psti P((Subscript[X, 1])<(Subscript[X, 2])), P((Subscript[X, 1])<(Subscript[X, 2])<(Subscript[X, 3])), P((Subscript[X, 1])<(Subscript[X, 2])>(Subscript[X, 3])) a P((Subscript[X, 1])<(Subscript[X, 2])>(Subscript[X, 3])∨(Subscript[X, 1])>(Subscript[X, 2])<(Subscript[X, 3])):

{Integrate[Boole[x1<x2],{x1,0,1},{x2,0,1}],
Integrate[Boole[x1<x2<x3],{x1,0,1},{x2,0,1},{x3,0,1}],Integrate[Boole[x1<x2>x3],{x1,0,1},{x2,0,1},{x3,0,1}],Integrate[Boole[x1<x2>x3∨x1>x2<x3],{x1,0,1},{x2,0,1},{x3,0,1}]}

Alternativne

𝒟3independentUniformContinuous=ProductDistribution[{UniformDistribution[{0,1}],3}];

{Probability[x<y,{x,y,z}\[Distributed]𝒟3independentUniformContinuous],Probability[x<y<z,{x,y,z}\[Distributed]𝒟3independentUniformContinuous],Probability[x<y>z,{x,y,z}\[Distributed]𝒟3independentUniformContinuous],Probability[x<y>z∨x>y<z,{x,y,z}\[Distributed]𝒟3independentUniformContinuous]}

Neplatí jenom pro rovnoměrné rozdělení, ale pro libovolné spojité rozdělení, které má rostoucí distribuční funkci na svém nosiči.

*Uvodni priklad (diskretni rovnomerne rozdeleni)

Clear[𝒟5independentUniformDiscrete];
(* Sdruzene rozdeleni 5 nezavislych stejne rozdelenych nahodnych velicin s diskretnim rovnomernym rozdelenim na {0,m} *)
𝒟5independentUniformDiscrete[m_]:=
ProductDistribution[{DiscreteUniformDistribution[{0,m}],5}];

Clear[XX];
XX=Table[X[i],{i,5}];
{Probability[X[1]<X[2],XX\[Distributed]𝒟5independentUniformDiscrete[m]],Probability[X[1]<X[2]<X[3],XX\[Distributed]𝒟5independentUniformDiscrete[m]],Probability[(X[1]<X[2]>X[3]||X[1]>X[2]<X[3]),XX\[Distributed]𝒟5independentUniformDiscrete[m]]}//Simplify[#,Assumptions->m>2]&
(* Pro spojite rozdeleni *)Limit[%,m->∞]

Příklad (kámen, papír, nůžky)

Hyperlink[Button["Kámen, papír, nůžky"],"http://demonstrations.wolfram.com/RockPaperScissorsWithAIPlayer/"]

Nelineární regrese a výnosové křivky

Pozor na terminologii (dva podstatně se lišící problémy):

Fitting = vyrovnání: Úloha najít křivku, která se na základě nějakého kritéria (typicky principu nejmenších čtverců) co “nejlépe” přibližuje pozorovaným hodnotám. Obvyklé a vhodné při řešení statistických problémů. Nepoužívejte českých paskvilů “fitovat”, “nafitovat”, apod.

Interpolation = interpolace: Úloha najít křivku, která prochází pozorovanými hodnotami. Umožňuje jednoduchý výpočet funkčních hodnot ve všech mezilehlých bodech. Bez dalších specifikací má tato úloha nekonečně mnoho řešení. Nutné stanovit vhodné kritérium. Oblíbená polynomiální interpolace vede při řešení úloh finanční a pojistné matematiky ke katastrofálním výsledkům. V těchto oblastech často velmi dobré výsledky poskytují metody založené na interpolaci pomocí splinů (“splajnů”). Interpolace je obvyklá a vhodná při řešení numerických problémů.

There is a number of parametric models used for the either fitting or interpolation of empirical data coming from markets. We will deal with just two of them which, under the author's opinion are most vital.

Příklad (reálný)

Reálná data ir3, dvojice ve tvaru {splatnost ve dnech, úrokova míra}:

Data odrážejí situaci, kdy subjekt (může být i pojišťovna, banka) potřebuje hotovost (likviditu) poměrně rychle a je tedy dán na pospas věřiteli. Věřitel přirozeně využívá  (zneužívá?) tísně potřebného subjektu. Zde se začíná na splatnosti 7 dnů, jak je možné asi tušit by to bylo horší při půjčce na jeden den (O/N, Over Night). (“Overnight (O/N) interest rates constitute the short end of the yield curve.”). Pro delší doby splatnosti úroková míra nejprve klesá a poté s přibývajícími riziky přirozeně roste, ale zůstává konkávní.

If r(t) is a spot rate and f(t) a forward rate then r(t) is the integral mean of the forward:

({{({{r(t)=(1/t)(∫_0^t)f(τ)dτ.}})}})

plot3=ListPlot[(ir3={{7,4.74},{14,4.72833333333333},{30,4.705},{60,4.595},{90,4.53},{180,4.42},{270,4.415},{360,4.41},{730,4.51},{1095,4.68},{1460,4.85},{1825,4.99},{2190,5.09},{2555,5.19},{2920,5.27},{3285,5.33},{3650,5.38`},{4015,5.42},{4380,5.46},{4745,5.48666666666667},{5110,5.51333333333333},{5475,5.54}}),PlotTheme->"Business", PlotStyle->{Red,PointSize[0.01]}]

Nelson-Siegel

Clear[nelsonsiegelspot]; (* Spot curve or zero-coupon *)
nelsonsiegelspot[b0_,b1_,b2_,c_,t_]:=b0+(((b1+b2) (1-(E^(-(t/c)))))/(t/c))-b2 (E^(-(t/c)))

The parameters have the following meaning: the function starts at level b0+b1 at time 0 and has asymptote at level b0; a local extreme is determined by parameter c.

Clear[t];
Limit[nelsonsiegelspot[b0,b1,b2,c,t],t->0]
Limit[nelsonsiegelspot[b0,b1,b2,c,t],t->∞,Assumptions->{b0>0∧b1>0∧b2>0∧c>0}]

Manipulating spot:

Manipulate[Plot[nelsonsiegelspot[b0,b1,b2,c,t],{t,0,10000},PlotRange->{{0,10000},{3,6}},AxesOrigin->{0,3},PlotStyle->Thick],
{{b0,5.8,"b0"},5,6,0.1,Appearance->"Labeled"},
{{b1,-0.4,"b1"},2,-1.5,0.1,Appearance->"Labeled"},
{{b2,-3,"b2"},-5,-1,0.2,Appearance->"Labeled"},
{{c,400,"c"},100,1000,10,Appearance->"Labeled"},SaveDefinitions->True
]

(* Forward curve *)
Clear[nelsonsiegelforward];
nelsonsiegelforward[b0_,b1_,b2_,c_,t_]:=b0+b1 (E^(-t/c))+b2 (t/c) (E^(-t/c))
Clear[nelsonsiegelforwardcalculated];
nelsonsiegelforwardcalculated[b0_,b1_,b2_,c_,t_]=nelsonsiegelspot[b0,b1,b2,c,t]+t D[nelsonsiegelspot[b0,b1,b2,c,t],t]//Simplify

Manipulating forward:

Manipulate[Plot[nelsonsiegelforward[b0,b1,b2,c,t],{t,0,10000},PlotRange->{{0,10000},{3,6}},AxesOrigin->{0,3},PlotStyle->{Orange,Thick}],
{{b0,5.8,"b0"},5,6,0.1,Appearance->"Labeled"},
{{b1,-1,"b1"},2,-1.5,0.1,Appearance->"Labeled"},
{{b2,-3,"b2"},-5,-1,0.2,Appearance->"Labeled"},
{{c,400,"c"},100,1000,10,Appearance->"Labeled"},SaveDefinitions->True]

Fitting Nelson-Siegel: on the graph, estimated spot is blue and estimated forward is orange.

fitnelsonsiegel3= FindFit[ir3,nelsonsiegelspot[b0,b1,b2,c,t],{b0,b1,b2,c},t]
curvenel3=nelsonsiegelspot[b0,b1,b2,c,t]/.fitnelsonsiegel3;
curvenelfc3[t_]:=nelsonsiegelspot[b0,b1,b2,c,t]/.fitnelsonsiegel3;
curvenel3forward=nelsonsiegelforward[b0,b1,b2,c,t]/.fitnelsonsiegel3;
Show[plot3,Plot[curvenel3forward,{t,0,10000},PlotRange->All,PlotStyle->Orange],Plot[curvenel3,{t,0,10000},PlotRange->All],PlotRange->All]

ir3={{7,4.74},{14,4.72833333333333},{30,4.705},{60,4.595},{90,4.53},{180,4.42},{270,4.415},{360,4.41},{730,4.51},{1095,4.68},{1460,4.85},{1825,4.99},{2190,5.09},{2555,5.19},{2920,5.27},{3285,5.33},{3650,5.38`},{4015,5.42},{4380,5.46},{4745,5.48666666666667},{5110,5.51333333333333},{5475,5.54}};
plot3=ListPlot[ir3,PlotTheme->"Business",PlotStyle->{Red,PointSize[0.01]}]

Swensson

By adding two more parameters in Nelson-Siegel model we get Swensson model. Note that possibly two extremes are determined by parameters c1 and c2.

Clear[swenssonforward];
swenssonforward[b0_,b1_,b2_,b3_,c1_,c2_,t_]:=b0+b1 (E^(-t/c1))+b2 (t/c1) (E^(-t/c1))+b3 (t/c2)(E^(-t/c2))

Spotová úroková míra je integrální průměr forwardové úrokové míry. V definici je důležité okamžité přiřazení, integrace chvíli trvá (>1sec) a při grafickém znázornění by byla časová ztráta nezanedbatelná.

Clear[swenssonspot];
swenssonspot[b0_,b1_,b2_,b3_,c1_,c2_,t_]=(1/t)(∫_0^t)swenssonforward[b0,b1,b2,b3,c1,c2,τ]\[DifferentialD]τ//Simplify

Limit[swenssonspot[b0,b1,b2,b3,c1,c2,t],t->0,Assumptions->{b0>0&&b1>0&&b2>0&&b3>0&&c1>0&&c2>0}]
Limit[swenssonspot[b0,b1,b2,b3,c1,c2,t],t->∞,Assumptions->{b0>0&&b1>0&&b2>0&&b3>0&&c1>0&&c2>0}]

Manipulate[Plot[swenssonspot[b0,b1,b2,b3,c1,c2,t],{t,0,5000},PlotRange->{{0,5000},{3,6}},AxesOrigin->{0,3},PlotStyle->Thick],
{{b0,5.8,"b0"},5,6,0.1,Appearance->"Labeled"},
{{b1,-1,"b1"},2,-1.5,0.1,Appearance->"Labeled"},
{{b2,-3,"b2"},-5,-1,0.2,Appearance->"Labeled"},
{{b3,-3,"b3"},-5,-1,0.2,Appearance->"Labeled"},
{{c1,200,"c1"},100,1000,10,Appearance->"Labeled"},
{{c2,5000,"c2"},100,10000,10,Appearance->"Labeled"},SaveDefinitions->True]

Manipulate[Plot[swenssonforward[b0,b1,b2,b3,c1,c2,t],{t,0,5000},PlotRange->{{0,5000},{3,6}},AxesOrigin->{0,3},PlotStyle->{Orange,Thick}],
{{b0,5.8,"b0"},5,6,0.1},
{{b1,-1,"b1"},2,-1.5,0.1},
{{b2,-3,"b2"},-5,-1,0.2},
{{b3,-3,"b3"},-5,-1,0.2},
{{c1,200,"c1"},100,1000,10},
{{c2,5000,"c2"},100,10000,10},SaveDefinitions->True]

fitswensson3= FindFit[ir3,swenssonspot[b0,b1,b2,b3,c1,c2,t],{b0,b1,b2,b3,c1,c2},t]
(curveswe3=swenssonspot[b0,b1,b2,b3,c1,c2,t]/.fitswensson3)//Simplify;
curveswefc3[t_]:=swenssonspot[b0,b1,b2,b3,c1,c2,t]/.fitswensson3
(curveswe3forward=swenssonforward[b0,b1,b2,b3,c1,c2,t]/.fitswensson3)//Simplify;
Show[plot3,Plot[curveswe3,{t,0,10000},PlotRange->All,PlotStyle->Thick],Plot[curveswe3forward,{t,0,10000},PlotRange->All,PlotStyle->{Orange,Thick}],PlotRange->All]

***Interpolation by polynomials

***Polynomials of degree n-1

Stupid but sometimes observable method: for data size n, use polynomial of the degree n-1. Since the maximum allowed order for interpolation is 21 we use it for the demonstration of the catastrophic behaviour of the interpolated function

intpol3=Interpolation[ir3,InterpolationOrder->Min[Length[ir3],21]];
plotpol3=Plot[intpol3[t],{t,Min[First[ir3][[1]]],Max[Last[ir3][[1]]]},PlotRange->All];
Show[plot3,plotpol3,PlotRange->All]

Manipulate[intpol3=Interpolation[ir3,InterpolationOrder->order];
Show[plotpol3=Plot[intpol3[t],{t,Min[First[ir3][[1]]],Max[Last[ir3][[1]]]},PlotRange->All],plot3,PlotRange->All],
{{order,4,"order"},1,21,1},SaveDefinitions->True]

Hodnocení opcí a futures 2

Evropské a americké opce (vanilla options)

r ... bezriziková úr. míra (nekdy značena  (Subscript[r, 0]))
(Subscript[S, t]) ... cena podkladového aktiva (akcie) v čase t
(Subscript[c, t]) resp. (Subscript[p, t]) ... cena evropské CALL resp. PUT opce
K ... realizační cena (strike)
T ... čas vypršení evropské opce (expiry)

Výplatní funkce (payoff function) evropské opce

v okamžiku vypršení

CALL: (SuperPlus[((Subscript[S, T])-K)])

PUT: (SuperPlus[(K-(Subscript[S, T]))])

PUT - CALL parita (platí pouze pro evropské opce!)

({{({{(Subscript[S, t])+(Subscript[p, t])=(Subscript[c, t])+K,(e^(-r(T-t)))}})}})

Mnemotechnická pomůcka pro zapamatování: státní podnik = císařsko-královské

Důkaz: viz též [1], str. 54. Uvažujme portfolio +PUT +akcie -CALL, vše na stejnou akcii, opce evropské se stejnou dobou vypršení. Hodnota portfolia v čase t≤T je

({{(Subscript[Π, t])=(Subscript[S, t])+(Subscript[p, t])-(Subscript[c, t]).}})

V čase vypršení T je hodnota tohoto portfolia

({{({{(Subscript[Π, T])=(Subscript[S, T])+(SuperPlus[(K-(Subscript[S, T]))])-(SuperPlus[((Subscript[S, T])-K)]).}})}})

V případě (Subscript[S, T])≤K je (Subscript[Π, T])=(Subscript[S, T])+K-(Subscript[S, T])-0=K, v případě (Subscript[S, T])>K je (Subscript[Π, T])=(Subscript[S, T])+0-((Subscript[S, T])-K)=K. To znamená, že portfolio je bezrizikové vedoucí k jistému zisku K. Budoucí hodnota je  (Subscript[Π, T])=K  a současná hodnota je tedy (Subscript[Π, t])=K,(e^(-r(T-t))).

Současná hodnota výplatní funkce (payoff function) evropské opce v čase t≤T

CALL: (SuperPlus[(e^(-r(T-t)))((Subscript[S, T])-K)])

PUT: (SuperPlus[(e^(-r(T-t)))(K-(Subscript[S, T]))])

Black-Scholesův vzorec

Risk Neutral Valuation

We assume that the stochastic process of the prices of an asset  (Subscript[{(Subscript[S, t])}, t≥0]) is goverened by a geometrical Brownian motion, hence

({{({{ℒ((Subscript[S, T])|(Subscript[S, t]))=L,N(ln (Subscript[S, t])+(μ-(1/2)(σ^2))(T-t),(σ^2)(T-t))}})}})

where μ is the rate of return on the underlying asset and σ its volatility.

Rizikově neutrální hodnocení: Investoři se chovají racionálně, čím větší riziko (volatilita), tím vyšší očekávaný výnos požadují. Čím vyšší averze k riziku, tím vyšší očekávaný výnos je požadován. Vyloučením rizikových preferencí dojdou investoři ke shodě na jediném rizikově neutrálním výnosu μ=r. Pozor, v žádném případě to neznamená, že by výnos podkladového aktiva byl roven r !!!

Alternativní princip vedoucí k témuž závěru: Očekávaný výnos z držení akcie v hodnotě (Subscript[S, t])  v období (t,T) by měl být stejný jako bezrizikový výnos z investice  ve výši (Subscript[S, t])  při úrokové míře r:

({{({{(SuperStar[E])((Subscript[S, T])|(Subscript[S, t]))=FV((Subscript[S, t]),r)=(Subscript[S, t])(e^(r(T-t)))}}).}})

Hvězdičkou zde i v dalším značíme skutečnost, že za výnos bereme rizikově-neutrální výnos r.

Neuvažujeme-li žádné rizikové preference investorů, je

({{({{(SuperStar[ℒ])((Subscript[S, T])|(Subscript[S, t]))=L,N(ln (Subscript[S, t])+(r-(1/2)(σ^2))(T-t),(σ^2)(T-t))}}).}})

Then

({{({{(SuperStar[E])((Subscript[S, T])|(Subscript[S, t]))=}})}})

Mean[LogNormalDistribution[Log[(Subscript[S, t])]+(r-(1/2)(σ^2))(T-t),σ(Sqrt[T-t])]]//Simplify//TraditionalForm

Similarly for the variance:

({{({{(SuperStar[var])((Subscript[S, T])|(Subscript[S, t]))=}})}})

Variance[LogNormalDistribution[Log[(Subscript[S, t])]+(r-(1/2)(σ^2))(T-t),σ(Sqrt[T-t])]]//Simplify//TraditionalForm

See [1], pp. 55-56.

Hodnota (cena) evropské opce

Jako přirozené se jeví vzít za hodnotu evropské opce v čase t podmíněnou střední hodnotu současné hodnoty výplatní funkce při dané hodnotě podkladového aktiva (Subscript[S, t]) při čemž střední hodnota je uvažovaná při bezrizikové (tj. rizikově neutrální) úrokové míře r:

({{({{(Subscript[c, t])=(e^(-r(T-t)))(SuperStar[E])((SuperPlus[((Subscript[S, T])-K)])|(Subscript[S, t]))}, {(Subscript[p, t])=(e^(-r(T-t)))(SuperPlus[(SuperStar[E])(K-(Subscript[S, T]))])|(Subscript[S, t]))}})}})

(* 80 sec!!! *)ct=(E^(-r(T-t)))Expectation[Max[0,((Subscript[S, T])-K)],(Subscript[S, T])\[Distributed]LogNormalDistribution[Log[(Subscript[S, t])]+(r-(1/2)(σ^2))(T-t),σ(Sqrt[T-t])]]

ct[[2,2]]//FullSimplify

Tuto formuli lze převést do běžně uváděného tvaru (Black-Scholes formula)

({{({{(Subscript[c, t])=(Subscript[S, t])Φ((Subscript[d, 1]))-K (e^(-r(T-t)))Φ((Subscript[d, 2])),
(Subscript[d, 1,2])=((log((Subscript[S, t])/K)+(r±(σ^2)/2)(T-t))/(σ(Sqrt[T-t]))).}})}})

Hodnota PUT opce se získá z PUT - CALL parity: ({{({{(Subscript[p, t])=(Subscript[c, t])+K,(e^(-r(T-t)))}})-(Subscript[S, t]).}})

Poznámka (opce na akcie vyplácející dividendu)

Vyplácí-li akcie dividendu s dividendovou intenzitou d, pak se v předchozím vzorci nahradí r→r-d. Vyplácením dividendy se snižuje hodnota firmy a tudíž i kapitálový výnos.

Citlivosti (Comparative Statics, The Greeks)

Statics je sice vžitý, ale asi chybně použitý termín nevystihující podstatu.

Nechť (Subscript[V, t]) označuje hodnotu CALL resp. PUT opce, (Subscript[V, t])=(Subscript[c, t]) resp. (Subscript[V, t])=(Subscript[p, t]). Z Black-Scholesova vzorce je patrné, že (Subscript[V, t]) je funkcí pěti proměnných (parametrů):

({{({{(Subscript[V, t])=(Subscript[V, t])((Subscript[S, t]),K,σ,T-t,r)}}).}})

Derivace podle jednotlivých proměnných se nazývají citlivosti a protože se označují řeckými písmeny, jsou též známé jako “The Greeks”. Jejich výpočet je přímočarý, ale v některých případech technicky dosti komplikovaný. Uvedeme jen jednu míru citlivosti delta, derivaci podle aktuální ceny akcie:

({{({{Δ=((∂(Subscript[V, t]))/(∂(Subscript[S, t])))}}).}})

Pro CALL resp. PUT dostaneme

({{({{(Subscript[Δ, c])=Φ((Subscript[d, 1]))   resp.   (Subscript[Δ, p])=(Subscript[Δ, c])-1=-Φ(}})-(Subscript[d, 1])).}})

Charakteristiky Δ se používá k tzv. delta-zajišťování, delta hedging. Uvažujme portfolio skládající se z dlouhé pozice jedné akcie a krátké pozice v A kusech CALL opcí na tutéž akcii. Hodnota portfolia je tedy (Subscript[Π, t])=(Subscript[S, t])-A,(Subscript[c, t]). Chceme najít A takové, aby hodnota portfolia byla invariantní vůči (malým) změnám ceny akcie, tj.

({{({{((∂,(Subscript[Π, t]))/(∂(Subscript[S, t])))}})=0.}})

Hledané A=1/(Subscript[Δ, c]), nazývané zajišťovací poměr, hedge ratio. Vzhledem k tomu, že se delta mění v čase, musí se portfolio často měnit → dynamické zajišťování, dynamic hedge. To může být nákladné kvůli transakčním nákladům. Tudíž vhodné pro makléře a tvůrce trhu, kteří mají relativně nízké transakční náklady. Všimněme si, že čím nižší (Subscript[S, t]) ve srovnání s K, tím vyšší je zajišťovací poměr. Podobnou mírou citlivosti je elasticita ceny CALL opce vzhledem k ceně akcie definovaná jako (Subscript[E, c])=(Subscript[Δ, c])(Subscript[S, t])/(Subscript[c, t]). Vždy je (Subscript[E, c])>1. (Dokažte za cvičení.) Proto je CALL opce vždy riskantnější než její podkladové aktivum. Analogie k Δ je durace.

**Další míry citlivosti viz [1], str. 60-61.

Implied Volatility (Implikovaná volatilita)

Ve výše uvedeném vzorci pro (Subscript[V, t]) v okamžiku t vždy známe hodnoty (Subscript[S, t]),K,T-t,r. Při aplikaci Black-Scholesova vzorce pro neznámou volatilitu obvykle použijeme výběrovou směrodatnou odchylku z historických (známých) dat logaritmických výnosů ln((Subscript[S, t+1])/(Subscript[S, t])) pro nějaké rozumné historické hodnoty. Sofistikovanější metody jsou založené na modelech volatility typu ARCH, GARCH, jejich zobecněních a modifikacích. Viz zabudované funkce (nezahrnují zdaleka všechny dnes používané modely):

?*ARCH*

?*AR*

Můžeme ale též přistoupit k odhadu volatility jiným způsobem. V daném časovém okamžiku t, (teď, hodnotící časový okamžik), známe nejenom  hodnoty (Subscript[S, t]),K,T-t,r, ale i tržní hodnotu opce (Subscript[V, t]^M). Po substituci známých hodnot do Black-Scholesovy formule dostaneme rovnici pro neznámou σ:

({{(Subscript[V, t]^M)=({{(Subscript[V, t])((Subscript[S, t]),K,σ,T-t,r)}}).}})

Tato rovnice nemusí mít žádné řešení (řešení je nutné hledat numericky), může mít právě jedno (nejpříjemnější situace, i když i tam můžeme býti překvapeni) nebo více řešení - z těch je pak zapotřebí citlivě vybírat.

Důležité! Volatilita a implikovaná volatilita viz [1], str. 61-62.

Portfolia opcí

Příklad v [1], str. 62-63.

SetDirectory[NotebookDirectory[]];

Import["FM1aPortfolia_opci.jpg"]

With[{K=50,B=70},Plot[Max[0,S-K]-Max[0,S-K-B],{S,0,200},PlotTheme->"Business"]]

Forwardy a futures

Na rozdíl od opcí je smlouva mezi stranami závazná. Forwardy jsou individuálně uzavírané kontrakty o budoucím vypořádání, futures standardizované).

4.3.2 Termínové obchody: Forwardy a futures

Připomeňme nejprve mechanismus fungování opcí. U nich investor (držitel, kupující) v dlouhé pozici má právo, nikoli povinnost své právo zakotvené v opční smlouvě uplatnit. To znamená,že podkladové aktivum (underlying) může buď koupit (v případě CALL opce) nebo prodat (v případě PUT opce). Prodávající (pisatel) pak trpně čeká, jak se vyvíjí tržní situace, a jestli držitel své právo uplatní. Ten tak ovšem učiní v případě, že uplatněním opce dosáhne zisku nebo alespoň bude minimalizovat ztrátu vzniklou náklady na pořízení opce.

U kontraktů typu forward a futures není možná volba jako u opcí. Pro obě strany je smlouva závazná, tudíž tady v okamžiku uzavření kontraktu neexistuje cena kontraktu v pravém slova smyslu. Forwardový kontrakt je termínový obchod, smlouva mezi dvěma partnery (řekněme A a B), ve kterém se strana kupující A (v dlouhé pozici) zavazuje koupit od strany prodávající B (v krátké pozici) určitou komoditu v určeném množství za určitou cenu F fixovanou v okamžiku uzavření kontraktu v určitém budoucím termínu T (dodání, delivery). Vše je závazně domluveno dnes, dejme tomu v okamžiku  t = 0, a vlastní transakce proběhne ve sjednaném termínu v budoucnosti T, t<T. Obě strany jsou povinné své závazky splnit. Předpokládejme dále, že aktuální cena podkladového aktiva v okamžiku uzavření kontraktu je (Subscript[S, 0]).

Pozice obou stran v kontraktu je symetrická. V okamžiku vypořádání zisk jedné strany jest roven ztrátě druhé strany. Jestliže  smluvená cena kontraktu v čase vypořádání T je F, pak strana A obdrží v okamžiku T částku (Subscript[S, T])-F a strana B přirozeně obdrží  F-(Subscript[S, T]). To, co se obvykle v teorii neuvažuje, jsou transakční náklady. Pro individuálně uzavřené kontrakty mohou být nezanedbatelné.

Tyto kontrakty mají minimálně tyto dvě funkce. První: ochrana (uhájení) ceny komodity, která je předmětem kontraktu. Druhá: transfer vlastnictví; fixováním ceny dnes (v čase t) je kupující chráněn (jištěn) proti případné vyšší ceně v okamžiku vypořádání kontraktu (tj. okamžité (spotové) ceně na trhu v okamžiku dodání). Prodávající je chráněn (jištěn) proti případné nižší promtní ceně v okamžiku vypořádaní kontraktu (tj. okamžité ceně na trhu v okamžiku dodání).

Obchodování s forwardy není prakticky regulováno, jsou to obchody individuální, takže riziko z nesplacení (default) je nezanedbatelné. V tomto případě se rizikem selhání myslí to, že strana v dlouhé pozici cukne, nebude chtít koupit nebo strana v krátké pozici odmítne prodat. Toto riziko je z velké části eliminováno standardizací. Není možné postihnout všechny individuální obchody a převést je ke globálnímu obchodování, nicméně je mnoho komodit (obilí, ropa, strategické kovy, měny, . . . ), které je možné dovést ke standardizovanému obchodování. Standardizované obchody tohoto typu se provádějí na specializované burze a nazývají se futures.

Futures: Z matematického hlediska jsou forwards a futures prakticky totožné. Proto se na hodnocení futures vztahují stejná kritéria jako na forwardy. Dále budeme mluvit o hodnocení forwardů.

Uvedeme některé přístupy k hodnocení forwardových kontraktů. Nejprve uveďme hodnocení na základě principu neexistence arbitráže. Jako dříve předpokládáme, že cena podkladového aktiva v čase t=0 je (Subscript[S, 0]) a z držení aktiva neplynou žádné závazky např. ve formě dividend. Dále uvažujeme bezrizikovou hodnotící úrokovou míru r.

Strana B, krátká v kontraktu, jest povinnou doručit (deliver) straně A částku (Subscript[S, T]) v okamžiku T. Strana B si vypůjčí částku (Subscript[S, 0]) v čase t=0 (čas uzavření kontraktu), koupí předmětné aktivum a v čase T obdrží F. Touto částkou (F) splatí půjčku, která v čase T je ve výši budoucí honoty (Subscript[S, 0])(e^(r,T)) , takže forwardová cena je

F=(Subscript[S, 0])(e^(r,T))

V okamžiku t=0 si strany nevyměňují žádné peníze, hodnota kontraktu je tudíž nulová.
V libovolném čase 0≤t≤T je však hodnota kontraktu

(Subscript[f, t])=(Subscript[S, t])-F,(e^(-r(,T-t)))

V takovém okamžiku může každá ze stran „uzamknout, lock” svou pozici tak, že uzavře pozici opačnou. Může tak fixovat zisk nebo ztrátu. Je-li (Subscript[S, t])<F,(e^(-r(T-t))), strana B si půjčí (Subscript[S, t]), koupí akcii, v okamžiku T splatí (Subscript[S, t])(e^(r(T-t))) a akcii prodá za F. Je-li naopak (Subscript[S, t])>F,(e^(-r(T-t))), strana A prodá akcii nakrátko, dostane za ni (Subscript[S, t]), tuto částku uloží a v okamžiku T vybere (Subscript[S, t])(e^(r(T-t)))>F. Koupí akcii za F a akcii vrátí.

4.3.9 Poznámka. (Ekvivalentní portfolio) Výplatní funkce forwardu v dlouhé pozici je (Subscript[S, T])-F. Dlouhá pozice ve forwardu je ekvivalentní v dlouhé evropské CALL a krátké pozici v evropské PUT, obě se stejnou dobou vypršení, stejnou realizační cenou K=F jako má forwardový kontrakt. Taková kombinace opcí má stejnou výplatní funkci jako forward, a tedy i v okamžiku uzavření kontraktu musí mít stejnou hodnotu. V čase t=0 (okamžik uzavření kontraktu) je však hodnota kontraktu nulová (nedochází k žádné výměně peněz), jinými slovy (Subscript[c, 0])-(Subscript[p, 0])=0. Ale z PUT-CALL parity (Subscript[c, 0])-(Subscript[p, 0])=(Subscript[S, 0])-F,(e^(-r,T)). Z toho tedy vyplývá vzorec pro F.

With[{K=50},GraphicsRow[{Plot[Max[0,S-K],{S,0,100},PlotStyle->{Thick,Red},PlotRange->{-50,50}],Plot[Max[0,K-S],{S,0,100},PlotStyle->{Thick,Orange},PlotRange->{-50,50}],Plot[Max[0,S-K]-Max[0,K-S],{S,0,100},PlotStyle->{Thick,Blue},PlotRange->{-50,50}]}]]

4.3.10 Poznámka. (Hodnocení pomocí Black–Scholesovy formule) Při rizikově neutrálním
oceňování a předpokladu, že cena akcie se řídí Black–Scholesovým vzorcem, je E((Subscript[S, T])|(Subscript[S, 0]))=(Subscript[S, 0])(e^(r,T)).  Výplatní funkce forwardu je (Subscript[S, T])-F. Střední hodnota této funkce podmíněná známou cenou akcie v okamžiku uzavření kontraktu t=0 a diskontovaná k okamžiku 0 je tedy (Subscript[S, 0])-F,(e^(-r,T)). Tento výraz je však roven nule, neboť v okamžiku uzavření kontraktu je cena nulová.
(WILMOTT Students, p. 99)

FinancialDerivative v systému  Mathematica  (v této verzi (10) zatím omezeno jenom na opce)

FinancialDerivative

Označení: “StrikePrice” realizacni cena K, “Expiration” doba do splatnosti, doba do vyprseni T, pokud se uvede “ReferenceTime” t, pak je to T-t,  “InterestRate” bezrizikova urokova mira (Subscript[r, 0]), “Volatility” volatilita ceny podkladoveho aktiva σ (underlying asset), “CurrentPrice” soucasna cena podkladoveho aktiva (Subscript[S, 0]) resp. (Subscript[S, t]) . “Dividend” je dividendova intenzita q. Vsechny udaje se vztahuji ke stejnemu casovemu obdobi, typicky 1 rok.

(* vsechny zabudovane derivaty, zde zvane "Contracts" *)
FinancialDerivative[](* //Length *)

POZOR NA SYNTAXI!!! PRI RESENI ULOH ZKOPIRUJTE Z HELPU!!! Typicky ma FinancialDerivative 3 az 4 argumenty, kazdy z nich je seznam (list).

1 Priklad (hodnoty opci)

FinancialDerivative[{"European","Call"}, {"StrikePrice"-> 50.00, "Expiration"->1},  {"InterestRate"-> 0.1, "Volatility" -> 0.5, "CurrentPrice"-> 50, "Dividend"->0.05}]

FinancialDerivative[{"American","Call"}, {"StrikePrice"-> 50.00, "Expiration"->1},  {"InterestRate"-> 0.1, "Volatility" -> 0.5, "CurrentPrice"-> 50, "Dividend"->0.05}]

2 Priklad (hodnoty opci a jejich citlivosti, The Greeks)

V ... price of the option, Δ=(∂/(∂(Subscript[S, t])))V,  Γ=((∂^2)/(∂(Subscript[S, t]^2)))V,  Ρ=(∂/(∂r))V,  Θ=(∂/(∂t))V,  𝒱=(∂/(∂σ))V

Opce z predchoziho prikladu, vystupem hodnota opce a citlivosti

FinancialDerivative[{"European","Call"}, {"StrikePrice"-> 50.00, "Expiration"->1},  {"InterestRate"-> 0.1, "Volatility" -> 0.5, "CurrentPrice"-> 50, "Dividend"->0.05}, {"Value", "Greeks"}]

3 Priklad (Graficke znazorneni)

Manipulate[Plot[FinancialDerivative[{"European","Call"}, {"StrikePrice"-> 50.00, "Expiration"->T},  {"InterestRate"-> 0.1, "Volatility" ->σ, "CurrentPrice"-> s, "Dividend"->0.05}],{s,40,60},AxesOrigin->{Automatic,0},PlotRange->{0,25},PlotStyle->{Thick,Red}],{{T,0.5},0.0001,1,Appearance->"Labeled"},{{σ,0.5},0.01,1,Appearance->"Labeled"},SaveDefinitions->True]

Manipulate[Plot[FinancialDerivative[{"American","Call"}, {"StrikePrice"-> 50.00, "Expiration"->T},  {"InterestRate"-> 0.1, "Volatility" ->σ, "CurrentPrice"-> s, "Dividend"->0.05}],{s,45,55},AxesOrigin->{Automatic,0},PlotRange->{0,25},PlotStyle->Thick],{{T,0.5},0.0001,1,Appearance->"Labeled"},{{σ,0.5},0.01,1,Appearance->"Labeled"},SaveDefinitions->True]

4 Priklad (Graficke znazorneni)

Plot[FinancialDerivative[{"European","Call"}, {"StrikePrice"-> 50.00, "Expiration"->1},  {"InterestRate"-> 0.1, "Volatility" -> 0.5, "CurrentPrice"-> st, "Dividend"->0.05}],{st,30,60}]

Plot[Table[FinancialDerivative[{"European","Call"}, {"StrikePrice"-> 50.00, "Expiration"->t},  {"InterestRate"-> 0.1, "Volatility" -> 0.5, "CurrentPrice"-> st, "Dividend"->0.05}],{t,{0,0.01,0.1,0.5,1}}],{st,30,60}]

Manipulate[Plot[FinancialDerivative[{"European","Call"}, {"StrikePrice"-> 50.00, "Expiration"->t},  {"InterestRate"-> 0.1, "Volatility" -> 0.5, "CurrentPrice"-> st, "Dividend"->0.05}],{st,40,60},PlotRange->{0,15},PlotStyle->Thick],
{{t,0,"Doba do vyprseni"},0,1,Appearance->"Labeled"},SaveDefinitions->True]

Hodnota evropske CALL a citlivosti (Value and all Greeks of a European call option):

FinancialDerivative[{"European","Call"}, {"StrikePrice"-> 50.00, "Expiration"->1},  {"InterestRate"-> 0.1, "Volatility" -> 0.5, "CurrentPrice"-> 50, "Dividend"->0.05}, {"Value", "Greeks"}]

Podle (podle mne pochybne konstrukce, viz DHS)  teorie by mela byt hodnota americke CALL stejna jako evropske. Ejhle, neni!!!

FinancialDerivative[{"American","Call"}, {"StrikePrice"-> 50.00, "Expiration"->1},  {"InterestRate"-> 0.1, "Volatility" -> 0.5, "CurrentPrice"-> 50, "Dividend"->0.05}, {"Value", "Greeks"}]

Hodnocení derivátů typu Cap (strop) a Floor  (dno)

Důvod, proč ve funkci FinancialDerivative není volba Cap resp. Floor (přesněji Caplet a Floorlet) vidím v tom, že tyto pojmy nejsou jednoznačně definovány a možností je celá řada. Obvykle jsou však kombinací elementárních finančních instrumentů (obligací, opcí, apod.)

Uvedeme ilustraci Cap na evropskou CALL opci s dobou vypršení T a realizační cenou K. Chrání investora v krátké pozici před neomezenou ztrátou. V případě, že cena (Subscript[S, T]) podkladového aktiva je v okamžiku vypršení vyšší než B,  vyplácí se B.

vyplataCAPnaCALL[St_,K_,B_]:=Min[Max[St-K,0],B]
Plot[vyplataCAPnaCALL[st,1,2],{st,0,5},PlotStyle->Thick]

Dlouhá pozice v tomto finančním instrumentu je ekvivalentní držení portfolia dvou CALL opcí, obě se stejnou dobou vypršení, jedna v dlouhé pozici s realizační cenou K, druhá v krátké pozici s realizační cenou K+B.

vyplataportfolia[St_,K_,B_]:=Max[St-K,0]-Max[St-K-B,0]
Plot[vyplataportfolia[st,1,2],{st,0,5},PlotStyle->Thick]

Cena tohoto instrumentu podle Black-Scholesova vzorce je tedy (musíme přidat bezrizikovou úrokovou míru r,0, volatilitu σ a dobu do vypršení T,t.

Clear[cenaCAPnaCALL];
cenaCAPnaCALL[St_,K_,B_,r0_,σ_,Tt_]:=FinancialDerivative[{"European","Call"}, {"StrikePrice"-> K, "Expiration"->Tt},  {"InterestRate"-> r0, "Volatility" -> σ, "CurrentPrice"-> St}]-FinancialDerivative[{"European","Call"}, {"StrikePrice"-> K+B, "Expiration"->Tt},  {"InterestRate"-> r0, "Volatility" -> σ, "CurrentPrice"-> St}]

Plot[cenaCAPnaCALL[st,1,2,0.05,0.4,1],{st,0,5},PlotRange->{0,2},PlotStyle->Thick]

Vyzkoušejte si manipulovat s některými parametry:

Manipulate[Plot[cenaCAPnaCALL[st,1,2,0.05,σ,Tt],{st,0,5},PlotRange->{0,2},PlotStyle->Thick],{{σ,0.3},0.1,0.5,Appearance->"Labeled"},{{Tt,1},0.01,2,Appearance->"Labeled"},SaveDefinitions->True]

Teorie portfolia

Varování: Některé z následujících příkladů zkolabují při spuštění ve verzi Mathematica 10.0.1!!!

Tržní portfolio, Market portfolio (New Jan 6, 2015)

Zde je mj. matematická formulace tržního portfolia.

Hyperlink[Button[" Tržní portfolio v modelu CAPM "],"http://www.karlin.mff.cuni.cz/~hurt/Market_Portfolio_in_CAPM.pdf"]

Vynechat poznámku 7. 1. 1. na poslední straně.

Úvodní příklady

Výnosy dvou perfektně negativně korelovaných aktiv:

Import["fig3.eps"]

Eficientní hranice portfolia dvou aktiv:

Import["EfficientFrontier.eps"]

Example 9.2.1 from [1], p. 82

Manipulate[ParametricPlot[{(Sqrt[36-72 x1+45 (x1^2)+36 x1 ρ-36 (x1^2) ρ]),14-6 x1},{x1,0,1},AxesOrigin->{0,8},AspectRatio->3/4,AxesLabel->{Style["(Subscript[σ, p])",Italic,16],Style["(Subscript[r, p])",Italic,16]},AxesStyle->Directive[14],PlotPoints->50,PlotStyle->{Black,Thick,Dashing[0.01+0.01ρ]}],{{ρ,0},-1,1,Appearance->"Labeled"},SaveDefinitions->True]

Portfolia s minimálním rizikem:

Import["portfoliorisky2.eps"]

Portfolia s minimálním rizikem při existenci bezrizikového aktiva:

Import["portfolior2riskyplusriskless.eps"]

Sharpe ratio and Markowitz portfolio

Data (Mesicni vynosy 5 akcii)

SetDirectory[NotebookDirectory[]]

i1=Import["Returns.csv"]//TableForm
(i2=Rest[Rest[i1]]);

i3=Map[Rest,i2]
Covariance[i3]

Nemate-li ve svem adresari soubor "Returns.dat", pouzijte "tvrdy vstup":

d1={{(* pocet akcií = *)5},{"Month","AMR","BS","UTX","WX","Z"},{1,11.594`,1.515`,-1.579`,-9.36`,-0.408`},{2,22.078`,5.299`,9.947`,7.578`,0.`},{3,-8.511`,-8.`,9.446`,-16.327`,0.694`},{4,-3.488`,0.395`,5.164`,-8.571`,-3.862`},{5,-9.639`,-9.764`,-3.571`,-18.243`,-10.949`},{6,-12.`,6.195`,-0.943`,-11.57`,-8.197`},{7,-10.606`,-0.417`,-7.619`,-8.441`,-6.786`},{8,-1.695`,-6.276`,11.856`,-8.22`,-13.725`},{9,-12.069`,-9.091`,-3.286`,-10.227`,-2.273`},{10,27.451`,15.`,11.186`,-3.797`,2.791`},{11,-21.538`,-4.465`,6.55`,-4.021`,-8.14`},{12,-19.608`,-6.132`,8.75`,12.676`,-5.063`},{13,48.78`,27.156`,4.215`,12.5`,35.2`},{14,19.672`,-2.372`,7.355`,15.271`,12.121`},{15,1.37`,15.19`,13.889`,18.`,-0.901`},{16,4.054`,15.751`,17.073`,-0.847`,18.548`},{17,-15.584`,-9.81`,1.042`,23.884`,-10.958`},{18,3.077`,4.27`,20.833`,4.196`,14.912`},{19,-4.478`,-6.485`,-7.543`,-4.027`,-5.058`},{20,4.688`,11.679`,3.263`,-6.333`,4.918`},{21,-11.94`,-7.285`,3.189`,-18.939`,-3.125`},{22,-1.695`,-3.214`,-7.506`,-2.856`,27.742`},{23,15.517`,0.369`,-3.58`,5.882`,16.026`},{24,5.97`,-1.866`,-7.25`,-0.926`,-2.762`},{25,11.268`,26.616`,15.903`,16.822`,13.295`}};

Text@Grid[d1,Frame->All]

d1[[{1,2,3,4}]]
d2=Rest[d1];
d3=Rest[d2];
datareturns=Map[Rest,d3];
expected=Mean[datareturns]
(cov=Covariance[datareturns])//MatrixForm
(Correlation[datareturns])//MatrixForm
Text@Row@{"Je kovarianční matice positivně definitní?  ",PositiveDefiniteMatrixQ[cov]}

Pokud mate jiz aktivovane predchozi bunky, nasledujici odstavec neaktivujte!!!

SetDirectory[NotebookDirectory[]];
d1=Import["Returns.dat","Table"]
d1[[{1,2,3,4}]]
d2=Rest[d1];
d3=Rest[d2];
datareturns=Map[Rest,d3];
expected=Mean[datareturns]
(cov=Covariance[datareturns])//MatrixForm
(Correlation[datareturns])//MatrixForm

Sharpe Ratio and Markowitz Mean-Variance Portfolio

We assume that N assets have returns (rates of return)  expected returns given by the N×1 vector r and the covariance matrix of returns V. If the investor possesses the wealth 1, then she/he may distribute it among N tradable assets. The proportions of the invested amounts in the individual assets are expresed by the weights x=((((Subscript[x, 1]),...(Subscript[x, N])))^T) which is called portfolio. We will seek the optimal portfolio in the sense that the Sharpe's ratio (also called Sharpe's measure of portfolio) is maximum:

max(((x^T)r)/(Sqrt[(x^T)Vx]))    subject to conditions   x≥0   and     (∑_(n=1)^N)(Subscript[x, n])=1,

so that short sales are not allowed.

Example 1 (short sales allowed)

Clear[xx];
xx=Table[Unique[],{Length[expected]}]

Uloha je invariantni vzhledem ke kladnemu nasobku, resime zatim bez omezujici normovaci podminky.

crit1=((xx.expected)/(Sqrt[xx.cov.xx]))//Simplify

?*Max*

Maximize will always find a global maximum if the objective function and the constraints are polynomial and also in many other cases. NMaximize is a numerical version of Maximize. If there is a real number in the data, Maximize automatically switches to NMaximize. If the above does not work you can try FindMaximum. It searches for a local maximum but if the objective function possesses just (one) global maximum it is likely that this function will find it. Syntax is the same as for Maximize. Moreover, it is possible to choose starting points.

?FindMaximum

sol11=NMaximize[crit1,xx]

Normování

xa=xx/.sol11[[2]]
xnorm=xa/Total[xa]
Total[xnorm]

Hodnota kritéria (je ale také ve výstupu sol11).

val1=(crit1/.{xx->xnorm//Thread})//First

Example 2 (short sales not allowed)

Warning: The following example does not work under Mathematica 10.0.1!!!

ineq=xx≥0//Thread
ineq=Apply[And,ineq]&&(Total[xx]==1)

sol2=NMaximize[{crit1,ineq},xx]
Total[xx/.sol2[[2]]]

(xx/.Last[sol2])//Chop

Example 2 (Revisited)

Místo rovnosti (∑_(n=1)^N)(Subscript[x, n])=1 použijeme omezení  (∑_(n=1)^N)(Subscript[x, n])≤ 1.

Text@Grid[Prepend[{expected,Diagonal[cov]}//Transpose//Sort,{"Exp. Return","Variance"}],Frame->True,Dividers->{{True,True},{True,True}}]

ineq2=xx≥0//Thread
ineq2=Apply[And,ineq2]&&Total[xx]≤1
sol2r=NMaximize[{crit1,ineq2},xx]
Total[xx/.sol2r[[2]]]

Ale

(xx/.sol2r[[2]]).expected

zatimco v predchozim pripade

(xx/.Last[sol2]).expected

Pokud však normujeme řešení, dostaneme stejnou hodnotu Sharpeova poměru, ale očekávaný výnos portfolia odpovídající prvnímu případu:

{crit1/.sol2r[[2]],((xx/(Total[xx]))/.sol2r[[2]]).expected}

Example 3a (Markowitz) Portfolio with prescribed (target) expected return and minimum risk, short sales not allowed)

Aktiva nesplnuji predpoklady efektivniho trhu (hned první dvě aktiva, první má menší očekávaný výnos než druhé, ale větší riziko), takze investor nemusi ani vyuzit veskere disponibilni bohatstvi a presto dosahne stejne hodnoty cilove funkce (optimalizacniho kriteria). 1. aktivum ma mensi ocekavany vynos nez 2. aktivum, ale riziko ma vetsi. Aktivum s nejvyšším očekávaným výnosem má nejmenší rozptyl.

Text@Grid[{expected,Diagonal[cov]},Frame->All]

crit3=xx.cov.xx//Simplify
cons3=Apply[And,Thread[xx≥0]]&&Total[xx]==1&&xx.expected== 4

sol3=NMinimize[{crit3,cons3},xx,MaxIterations->300]//Chop
(* Zkuste s původním implicitním nastavením MaxIterations->100 *)

Text@Row@{"Součet vah = ",Total[xx3=xx/.Last[sol3]],"   Očekávaný výnos optimálního portfolia = ",xx3.expected}

Ještě srovnání vah s očekávaným výnosy a riziky aktiv v portfoliu:

{xx3,expected,(Sqrt[Diagonal[cov]])}//TableForm

Example 3b (inequality instead of equality)

crit3b=xx.cov.xx//Simplify;
cons3b=Apply[And,Thread[xx≥0]]&&Total[xx]≤ 1&&xx.expected==4;
sol3b=NMinimize[{crit3b,cons3b},xx]
{Total[xx3b=xx/.Last[sol3b]],xx3b.expected}

Zkusíme najít nějaké (nějaká) počáteční řešení (vysvětlení v Help k funkci FindInstance):

xx3binit=FindInstance[cons3b,xx,Reals,3]

Zadání počátečního řešení při použití optimalizačních funkcí vyřaduje tuto syntaxi:

Thread[{xx,xx/.(xx3binit//First)}]

Bez zadání počátečního řešení:

FindMinimum[{crit3b,cons3b},xx]

Pro 3 různá počáteční řešení:

Text@Grid@Map[FindMinimum[{crit3b,cons3b},Thread[{xx,xx/.#}]]&,xx3binit]

Example 3c (inequalities instead of equalities)

crit3c=xx.cov.xx//Simplify;
cons3c=Apply[And,Thread[xx≥0]]&&Total[xx]≤ 1&&xx.expected≥4;
sol3c=NMinimize[{crit3c,cons3c},xx]
Total[xx3c=xx/.Last[sol3c]]
xx3c
xx3c.expected

Using FindMinimum :

sol3cfindminimum=FindMinimum[{crit3c,cons3c},xx]
Total[xx3cfindminimum=xx/.Last[sol3cfindminimum]]
xx3c
xx3cfindminimum.expected

Using all(?) available methods for FindMinimum:

"ConjugateGradient", "PrincipalAxis", "LevenbergMarquardt", "Newton", "QuasiNewton"

Unfeasible requirement
(Neither of the assets reaches the expected return reaches 4.3.)

crit34=xx.cov.xx//Simplify;
cons34=Apply[And,Thread[xx≥0]]&&Total[xx]==1&&xx.expected≥ 4.3;
sol3=NMinimize[{crit34,cons34},xx]

Example 4

We have 8 assets traded on Prague Stock Exchange with the expected returns

returns={-9.92488533927622*10^-04,5.72524775783378*10^-03,9.04818959590086*10^-03,-1.44968966764537*10^-03,-1.74045537023702*10^-02,5.70188394543127*10^-03,3.33476815091662*10^-03,2.15075479228363*10^-03};

and the covariance matrix of returns

covariancematrix={{1.35640293495777*10^-03,2.56330097904098*10^-04,3.33037161321956*10^-04,1.80223328810003*10^-04,2.81325992644196*10^-04,5.93263545509886*10^-04,7.13610711759175*10^-04,3.20932535820455*10^-04},{2.56330097904098*10^-04,2.35439634554186*10^-03,4.42407197078591*10^-04,6.57567906193998*10^-06,4.01068448708833*10^-04,5.93785356343409*10^-04,1.30961261626908*10^-04,2.93338399396577*10^-04},{3.33037161321956*10^-04,4.42407197078591*10^-04,1.57895651834543*10^-03,-1.16804549527263*10^-04,1.85336104268171*10^-04,.000176059157865,3.41400743910472*10^-04,1.86624552570071*10^-04},{1.80223328810003*10^-04,6.57567906193998*10^-06,-1.16804549527263*10^-04,6.16786555694974*10^-03,4.84828341822248*10^-04,8.50333422445824*10^-04,7.74803938060802*10^-05,4.39412705238888*10^-04},{2.81325992644196*10^-04,4.01068448708833*10^-04,1.85336104268171*10^-04,4.84828341822248*10^-04,9.45147795376653*10^-03,1.78331918975426*10^-03,5.0987274991634*10^-05,1.49823427374484*10^-03},{5.93263545509886*10^-04,5.93785356343409*10^-04,.000176059157865,8.50333422445824*10^-04,1.78331918975426*10^-03,7.38754498647722*10^-03,1.03084013803777*10^-03,9.34434830622224*10^-04},{7.13610711759175*10^-04,1.30961261626908*10^-04,3.41400743910472*10^-04,7.74803938060802*10^-05,5.0987274991634*10^-05,1.03084013803777*10^-03,2.1036055256453*10^-03,2.40818723671803*10^-04},{3.20932535820455*10^-04,2.93338399396577*10^-04,1.86624552570071*10^-04,4.39412705238888*10^-04,1.49823427374484*10^-03,9.34434830622224*10^-04,2.40818723671803*10^-04,2.77726103166242*10^-03}};

We see that the above matrix is badly conditioned (ill-conditioned):

Det[covariancematrix]

More precisely about measuring so called “condition number” see http://mathworld.wolfram.com/ConditionNumber.html

Correlation matrix

((Sqrt[DiagonalMatrix[1/Diagonal[covariancematrix]]]).covariancematrix.(Sqrt[DiagonalMatrix[1/Diagonal[covariancematrix]]]))//MatrixForm

xxPS=Table[(Subscript[x, i]),{i,1,Length[returns]}]

The criterion is given by

criterion=(((xxPS.returns))/(Sqrt[xxPS.covariancematrix.xxPS]))//Simplify;

The constraints are

constraints1=Apply[And,Table[(Subscript[x, i])≥ 0,{i,1,Length[returns]}]];
constraints2=Total[xxPS]==1;
constraints=constraints1&&(constraints2)

NMaximize[{criterion,constraints},xxPS]

Next we solve the problem using the option for the method:

soldif=NMaximize[{criterion,constraints},xxPS,Method->"DifferentialEvolution"]

Všechny (?) dostupné metody (trvá dlouho, 103 sec):

Map[{#,NMaximize[{criterion,constraints},xxPS,Method->#]}&,{"DifferentialEvolution","NelderMead","SimulatedAnnealing","RandomSearch"}]//TableForm

Text@Row@{"Součet = ",Total[xxPS/.soldif[[2]]],Spacer[10],
"Expected return of the optimal portfolio = ",(xxPS/.soldif[[2]]).returns}

Use FindMaximum:

FindMaximum[{criterion,constraints},xxPS]

Lagrange multipliers

Illustration on Example 3 (Markowitz, short sales allowed, μ prescribed (target) expected return)

Clear[lagrangeMultipliers];lagrangeMultipliers[expected_,covariance_,targetreturn_]:=
Module[{n=Length[expected],lagrangeFunction,xx,xxλ,λ1,λ2,equations,xx0},
xx=Table[Unique[],{n}];
lagrangeFunction=(1/2)xx.covariance.xx+λ1(1-Total[xx])+λ2(targetreturn-expected.xx)//Simplify;
xxλ={xx,λ1,λ2}//Flatten;
equations=Map[D[lagrangeFunction,#]&,xxλ]==0;
Text@Row@{"Optimal portfolio   ",xx0=Take[Flatten[xxλ/.Solve[equations,xxλ]],n],"\n","Expected return = ",expected.xx0,"   Variance = ",xx0.covariance.xx0}]

lagrangeMultipliers[expected,cov,3]

Capital Asset Pricing Model (CAPM)

Security Market Line

[3] Cipra, T.: Matematika cenných papírů. Kamil Mařík Professional Publishing. Praha 2013.

Capital Market Line

**Optimalizační funkce systému Mathematica

V optimalizacnich ulohach je mozne volit normy (Subscript[L, 2]), (Subscript[L, 1]), (Subscript[L, ∞]).

Row@{Hyperlink[Button["ConstrainedOptimizationLinearProgramming"],"paclet:tutorial/ConstrainedOptimizationLinearProgramming"],Spacer[20],Hyperlink[Button["ConstrainedOptimization"],"paclet:tutorial/ConstrainedOptimizationOverview"]}

Další odkazy

FindMinimum, FindMaximum, NMinimize, NMaximize, Minimize, and Maximize. LinearProgramming

Práce s databází

**DatabaseLink/tutorial/Overview

Hyperlink[Button[" DatabaseLink "],"paclet:DatabaseLink/tutorial/Overview"]

***Approach in elder versions (you can skip it)

Simulation of a simple insurance database with fields {names, sex (Male, Female), age, insured amount}

c1=CharacterRange["A","Z"]
ToCharacterCode[c1]//Flatten

ToCharacterCode[{"M","F"}]//Flatten

genernames:=FromCharacterCode[RandomInteger[{65,90},5]]

sex2=Table[FromCharacterCode[RandomInteger[] (77-70)+70],{30}];
names2=Table[genernames,{30}];
ages2=RandomInteger[{20,85},30];
insured2=Table[RandomInteger[{20,100}] 1000,{30}];
database=Transpose[{names2,sex2,ages2,insured2}];

database

Find all men elder than 60, insured over 50000. Both of the following constructions give the same result.

Cases[database,_?(And[#[[2]]=="M",#[[3]]>60,#[[4]]>50000]&)]

sele1=Select[database,(And[#[[2]]=="M",#[[3]]>60,#[[4]]>50000]&)]

Sort these selecting records according to the insured amount:

Sort[sele1,#1[[4]]>#2[[4]]&]

Export the database in the Excel format:

SetDirectory[NotebookDirectory[]]
Export["database.xls",database,"XLS"]

Modern approach

SetDirectory[NotebookDirectory[]]

Simulation of a simple insurance database with fields {names, sex (Male, Female), age, insured amount}
Simulace jednoduché databáze pojistek s položkami {jméno, pohlaví, věk, pojistná částka}

(* generovaní jmen náhodné délky od 3 do 10 *)
Clear[genername]
genername[n_,seed_:13131]:=Module[{},SeedRandom[seed];
Table[StringJoin[RandomChoice[CharacterRange["A","Z"],RandomInteger[{3,10}]]],{n}]]
genername[4]

(* pohlaví M muž, F žena*)
Clear[sex]
sex[n_,seed_:13131]:=Module[{},SeedRandom[seed];Table[RandomChoice[{"M","F"}],{n}]]
sex[4]

(* věky náhodné, rovnoměrně rozdělené na intervalu [20,85]*)
Clear[ages]
ages[n_,seed_:13131]:=Module[{},SeedRandom[seed];Table[RandomInteger[{20,85}],{n}]]
ages[4]

(* pojistná částka s rovnoměrným rozdělením na intervalu [20000,100000] *)
Clear[insuredamount]
insuredamount[n_,seed_:13131]:=Module[{},SeedRandom[seed];Table[RandomInteger[{20,100}] 1000,{n}]]
insuredamount[4]

(* hlavička databáze *)
head={"Name","Sex ","Age ","Insured amount"}

(* vytvoření databáze *) 
Clear[database];
database[n_]:=Module[{aux},aux=Transpose[{genername[n],sex[n],ages[n],insuredamount[n]}];PrependTo[aux,head]]
database[4]//TableForm

Úloha

Find all men elder than 60, insured over 50000. Both of the following constructions give the same result.

Vyberte pojistky všech mužů starších 60 let s pojistnou částkou vyšší než 50000. Oba následující postupy jsou ekvivalentní.

Join[{head},Cases[database[100],_?(And[#[[2]]=="M",#[[3]]>60,#[[4]]>50000]&)]]//TableForm

The equivalent solution

(sele=Select[database[100],(And[#[[2]]=="M",#[[3]]>60,#[[4]]>50000]&)])//TableForm

Setřídit vybrané položky podle pojistné částky
Sort these selecting records according to the insured amount:

Sort[sele,#1[[4]]>#2[[4]]&]//TableForm

Export ve formátu *.xls
Export the database in the Excel format:

SetDirectory[NotebookDirectory[]]
Export["database.xls",database[1000]]

2017-01-10 Lesson 14

Doplňky k přednášce NMF201 Finanční management z LS 2015/16

FAQ

Smazání posledního prvku v řetězci

StringDrop["abcde",-1]

(* Viz také StringDelete *)

Hodnocení investic (Investice s pevným výnosem)

Zde budeme finanční investice hodnotit současnou hodnotou, případně střední hodnotou současné hodnoty.

Investice s pevným výnosem

Pozor, definice se v různých pramenech liší!!!

Cenné papíry (securities) s pevným výnosem, fixed-income securities jsou obvykle obchodovatelné finanční nástroje, které poskytují jejich vlastníkovi jistým způsobem definovaný příjem (tj.  peněžní tok) během určitého časového období. Pro investory jsou důležité, neboť vlastně definují  peněžní trh, poskytují zpětnou vazbu prostřednictvím informace o ceně peněz a většina investorů se více méně musí na peněžním trhu angažovat.

V minulosti pevný výnos skutečně zaručoval vlastníkovi příslušného ceného papíru pevný výnos, pomineme-li ovšem selhání emitenta (default) (dlužníka). V současnosti je pojem pevný výnos nutno brát s jistou rezervou. Většina emitentů nyní totiž váže výplaty úroků na nějakou obecně dobře kontrolovatelnou veličinu jako je např. depozitní úroková sazba centrální banky, mezibankovní úroková míra typu PRIBOR, LIBOR, případně jiná dohodnutá referenční sazba, méně již míra inflace apod. Obecně však platí, že cenné papíry s pevným výnosem poskytují zafixovaný peněžní tok až na dobře definované náhodné výjimky. Budeme tedy za cenné papíry s pevným výnosem považovat cenné papíry s předem definovanou strukturou posloupnosti plateb s tím, že některé platby jsou závislé na exogenních faktorech, které pravděpodobně žádná ze stran kontraktu nemůže významně ovlivnit.

Kupónové obligace (dluhopisy, bonds)

Označení

Terminologie je nejednotná, často zavádějící. Uvádíme řadu možností. Největší problémy asi činí rozdíl mezi výnosem do splatnosti a výnosem (ve smyslu hodnotící úrokové míry).

Fair = dirty = gross = hrubá = spravedlivá cena, hodnota (price, full value),
clean = pure = čistá cena (clean price, value) 
t ... hodnotící čas, settlement
T ... splatnost (maturita)
i ... hodnotící úroková míra (tržní úroková míra, někdy nazývaná výnos, yield resp. požadovaný výnos, neplést s výnosem do splatnosti!)
v=1/(1+i) ... diskontní faktor
c=C/F... kuponova sazba!!!
n ... počet období do splatnosti n=T-t, invertovaný čas; n=0 je okamžik splatnosti (vypršení, maturity), předpokládáme t<T
A,(Subscript[I, i]) ... alikvótní úrok (alikvótní úrokový výnos, AUV, Accrued Interest, AI) při úrokové míře i (v [1] jsou vzorce pro AI špatně)
YTM ... výnos do splatnosti, yield to maturity, implied yield to maturity

Hodnocení obligací (dluhopisů)

Obligace s maturitou T roků (všude předpokládáme T∈ℕ) a nominální hodnotou F  emitovaná v čase 0 vyplácí kupóny ve výši C v časech 1,...,T. Nominální hodnota je splatná taktéž v čase T. Pro držitele obligace po celou dobu její životnosti je odpovídající peněžní tok:

Import["Cashflowofabond.pdf"]//First

Obligace je však obchodovatelný cenný papír, nutno znát jeho hodnotu v libovolném čase do splatnosti  t<T. Situace je poněkud komplikována administrativními důvody (v tomto případě pochopitelnými, nutno evidovat řádově tisíce držitelů): Emitent stanoví datum ex-kupónu (Subscript[t, ex]), tj. datum, od kterého je dluhopis obchodován bez nejbližšího následujícího kupónu. (The ex coupon date is the first day the bond starts trading without the coupon attached to it.) Datum ex-kupónu je obvykle několik dnů před výplatou kupónu, typicky 14 dnů. Na obrázku je hodnotící čas t∉ℕ, t<(Subscript[t, ex]). Držiteli obligace tedy náleží kupóny v časech ⌊t⌋+1,⌊t⌋+2,...,T-1,T, celkem tedy T-⌊t⌋ kupónů. Od času (Subscript[t, ex])  jsou vypláceny kupóny v časech ⌊t⌋+2,...,T-1,T. V dalším uvedeme spravedlivé ceny obligace ve všech možných případech.

Import["CashflowofabondValuation.eps"]

V dalším užíváme elementární vztahy mezi celou ⌊⌋, zlomkovou částí {} a stropem ⌈⌉, zdůrazněme T celé.

t=⌊t⌋+{t} ,  ⌊T-t⌋=T-⌈t⌉,   ⌊t⌋+1-t=1-{t}.

Spravedlivá cena obligace: t∉ℕ, t<(Subscript[t, ex])

P,V=C,(v^(⌊t⌋+1-t))+C,(v^(⌊t⌋+2-t))+...+(Cv^(T-1-t))+(C+F)(v^(T-t))=
C,(v^(1-{t}))((1-(v^(T-⌊t⌋)))/(1-v))+F,,(v^(T-t))

Spravedlivá cena cena obligace: t∉ℕ, (Subscript[t, ex])≤t≤⌊t⌋+1

P,V=C,(v^(⌊t⌋+2-t))+C,(v^(⌊t⌋+3-t))+...+(Cv^(T-1-t))+(C+F)(v^(T-t))=
C,(v^(2-{t}))((1-(v^(T-⌊t⌋-1)))/(1-v))+F,,(v^(T-t))

Spravedlivá cena cena obligace: t∈ℕ, v čase t se pochopitelně žádný kupón nevyplácí

P,V=C,v+C,(v^2)+...+(Cv^(T-1-t))+(C+F)(v^(T-t))=
C,v((1-(v^(T-t)))/(1-v))+F,,(v^(T-t))

Čistá cena (t=0, kupóny se vyplácejí v okamžicích t=1,2,...,T):

P,(Subscript[V, p])=C,v+C,(v^2)...+(C+F)(v^T)=C,(∑_(j=1)^T)(v^j)+F,(v^T)=((C,,v((v^T)-1))/(v-1))+F,(v^T)=(C/i)+(1/(((1+i))^T))(F-(C/i))

**Procedury pro hodnocení obligací (dluhopisů)

⚠

V následujících třech procedurách se používá invertovaný čas n=T-t. Vzorec pro výpočet čisté ceny (použito v proceduře cleanvalue pro výpočet čisté hodnoty):

Procedury pro spravedlivou (dirty) cenu, čistou (clean) cenu a alikvótní úrok:

Clear[dirtyvalue,cleanvalue,accruedinterest];
{(dirtyvalue[c_,F_,n_,i_]=Module[{v},
c F  (v^(n-⌊n⌋))(If[⌊n⌋-n==0,0,1]+ (∑_(j=1)^(⌊n⌋))(v^j))+F (v^n)/.v->(1/(1+i))]//FullSimplify[#,Assumptions->i>-1]&),
(cleanvalue[c_,F_,n_,i_]=Module[{v},F ((v^n)+((c v ((v^n)-1))/(v-1)))/.v->(1/(1+i))]//FullSimplify[#,Assumptions->i>-1]&),
(accruedinterest[c_,F_,n_,i_]=
((c F (-1+(((1+i))^(1-n+Floor[n]))))/i))}//TraditionalForm

Skutečně pro alikvótní úrok platí:

dirtyvalue[c,F,n,i]-cleanvalue[c,F,n,i]//FullSimplify[#,Assumptions->i>-1]&//TraditionalForm

Ve finančním tisku se většinou uvádí hodnota A,I(Subscript[,, 0]):=C(1-{n}), nebere se v potaz hodnotící úroková míra. Ve všech případech je 0≤A,(Subscript[I, i])≤1 a 0≤A,(Subscript[I, 0])≤1.

Limit[((c F (-1+(((1+i))^(1-n+Floor[n]))))/i),i->0]//FullSimplify[#1,Assumptions->n≥0]&//TraditionalForm

Rozdíl mezi A,(Subscript[I, i]) a A,(Subscript[I, 0]):

Manipulate[Plot[({c F t,accruedinterest[c,F,1-t,i]}/.{F->1})//Evaluate,{t,0,1},PlotPoints->500,Exclusions->None,AxesLabel->{t,AI},PlotLabel->"AI a (Subscript[AI, 0])",PlotStyle->{{Dashed,Thick},{Orange,Thick}}],
{{c,0.1,"c"},0.01,0.20,0.01,Appearance->"Labeled"},
{{i,0.5,"i"},0.01,0.50,0.01,Appearance->"Labeled"},SaveDefinitions->True]

A,(Subscript[I, 0])-A,(Subscript[I, i]); Derivace podle t je pro i>0 záporná, takže ∀0<t<1 je A,(Subscript[I, 0])>A,(Subscript[I, i]). (Srovnejte s analogickým výsledkem pro současnou hodnotu při úročení jednoduchém a složeném a úrokovém období kratší jednoho roku.)

dif=(c F t-accruedinterest[c,F,1-t,i]/.{F->1})//FullSimplify[#,Assumptions->i>0∧c>0∧0<t<1]&
D[dif,t]

Výnos do splatnosti (YTM) je definován jako IRR (vnitřní míra výnosnosti) peněžního toku {-MP,C,...,C,C+F}, kde MP je pořizovací cena (tržní cena, market price).

Clear[YTMdirty];
(* Používá se počáteční aproximace Hawawini & Vora, viz [3], str. 42 *)
YTMdirty[MP_,c_,F_,n_]:=Module[{ytm0=((c F+(F-MP)/n)/(0.6 MP+0.4 F)),ytm},
{ytm0,ytm/.FindRoot[dirtyvalue[c,F,n,ytm]==MP,{ytm,ytm0}]}(*//Last*)]

Manipulate[Plot[YTMdirty[MP,c,F,T-t],{t,0,0.9T},PlotPoints->500,Exclusions->None,AxesLabel->{t,YTM},PlotStyle->Thick,PlotRange->{{0,T},{0,0.2F}}],
{{T,10,"T",Appearance->"Labeled"},1,30,1,Appearance->"Labeled"},
{{c,0.1,"c"},0.01,0.20,0.01,Appearance->"Labeled"},
{{F,1,"F"},1,10,Appearance->"Labeled"},
{{MP,F+c F,"MP"},0.4F,1.4F,0.05F,Appearance->"Labeled"},
SaveDefinitions->True]

Clear[YTMclean];
(* Používá se počáteční aproximace Hawawini & Vora, viz [3], str. 42 *)
YTMclean[MP_,c_,F_,n_]:=Module[{ytm0=((c F+(F-MP)/n)/(0.6 MP+0.4 F)),ytm},
{ytm0,ytm/.FindRoot[cleanvalue[c,F,n,ytm]==MP,{ytm,ytm0}]}(*//Last*)]

Manipulate[Plot[YTMclean[MP,c,F,T-t],{t,0,0.9T},PlotPoints->500,Exclusions->None,AxesLabel->{t,YTM},PlotStyle->Thick,PlotRange->{{0,T},{0,0.2F}}],
{{T,10,"T",Appearance->"Labeled"},1,30,1,Appearance->"Labeled"},
{{c,0.1,"c"},0.01,0.20,0.01,Appearance->"Labeled"},
{{F,1,"F"},1,10,Appearance->"Labeled"},
{{MP,F+c F,"MP"},0.4F,1.4F,0.05F,Appearance->"Labeled"},
SaveDefinitions->True]

Příklad

Znázornění ve skutečném (a ne invertovaném) čase:

Kuponova obligace s kuponovou sazbou c=0.1, splatnost T=10, nominalni hodnota F=1, hodnotici urokova sazba i=0.15, tj. diskontni obligace.

p12=Plot[{dirtyvalue[0.1,1,10-n,0.15],cleanvalue[0.1,1,10-n,0.15]},{n,0,10},Exclusions->None,PlotPoints->500,PlotStyle->Thick,AxesLabel->{t,PV}]

Kuponova obligace s kuponovou sazbou c=0.1, splatnost T=10, nominalni hodnota F=1, hodnotici urokova sazba i=0.1.

p3=Plot[dirtyvalue[0.1,1,10-n,0.1],{n,0,10},Exclusions->None,PlotStyle->{{Dashing[{0.01,0.01}],Black,Thick}},AxesLabel->{t,PV}]

Kuponova obligace s kuponovou sazbou c=0.1, splatnost T=10, nominalni hodnota F=1, hodnotici urokova sazba i=0.05, tj. premiova obligace.

p45=Plot[{dirtyvalue[0.1,1,10-n,0.05],cleanvalue[0.1,1,10-n,0.05]},{n,0,10},PlotPoints->500,Exclusions->None,PlotStyle->Thick,AxesLabel->{t,PV}]

Show[p12,p3,p45,PlotRange->All]

Obecně

Manipulate[Plot[{dirtyvalue[c,f,T-t,i],cleanvalue[c,f,T-t,i],cleanvalue[c,f,T-t,c]},{t,0,T},PlotPoints->500,Exclusions->None,AxesLabel->{t,PV},PlotStyle->Thick,PlotRange->{{0,T},{0,2f}}],
{{T,10,"T",Appearance->"Labeled"},5,30,1,Appearance->"Labeled"},
{{c,0.1,"c"},0.01,0.20,0.01,Appearance->"Labeled"},
{{f,1,"F"},1,1000,50,Appearance->"Labeled"},
{{i,0.15,"i"},0.01,0.20,0.01,Appearance->"Labeled"},SaveDefinitions->True]

Alikvótní úrok (Všimněte si, že změny úrokové míry se na grafu neprojeví.)

Manipulate[Plot[{dirtyvalue[c,f,T-t,i]-cleanvalue[c,f,T-t,i]},{t,0,T},PlotPoints->500,Exclusions->None,PlotStyle->Thick,AxesLabel->{t,AI},PlotLabel->"Alikvótní úrok",PlotRange->{{0,T},{0,0.22 f}}],
{{T,10,"T",Appearance->"Labeled"},1,30,1,Appearance->"Labeled"},
{{c,0.1,"c"},0.01,0.20,0.01,Appearance->"Labeled"},
{{f,1,"F"},1,1000,50,Appearance->"Labeled"},
{{i,0.15,"i"},0.01,0.20,0.01,Appearance->"Labeled"},SaveDefinitions->True]

Duration of a coupon bond

Definice durace kuponove obligace

((c F(∑_(j=1)^n)j (v^j)+F n (v^n))/(c F(∑_(j=1)^n) (v^j)+F  (v^n)))/.v->(1/(1+i))//PowerExpand//FullSimplify

Clear[cleanduration,dirtyduration,v];
(cleanduration[c_,F_,n_,i_]=1+(1/i)-((1+i+c n-i n)/(i+c (-1+(((1+i))^n))))//FullSimplify[#,Assumptions->i>-1]&)//TraditionalForm
(dirtyduration[c_,F_,n_,i_]=((c F (∑_(j=0)^(⌊n⌋)) (n-⌊n⌋+j) (v^(n-⌊n⌋+j))+F n (v^n))/(c F (v^(n-⌊n⌋)) (∑_(j=0)^(⌊n⌋))(v^j)+F (v^n))/.v->(1/(1+i)))//FullSimplify[#,Assumptions->i>-1]&)//TraditionalForm

Plot[{dirtyduration[0.1,1,10-t,0.15],cleanduration[0.1,1,10-t,0.15]},{t,0,10},PlotPoints->500,Exclusions->None]

Plot[{dirtyduration[0.1,1,10-n,0.05],cleanduration[0.1,1,10-n,0.05]},{n,0,10},PlotPoints->500,Exclusions->None]

* Mathematica funkce FinancialBond (obligace, dluhopis)

Tento odstavec slouží k procvičení.

*Popis zabudované funkce

FinancialBond (* Označte kursorem a stiskněte F1 *)

Označení: “FaceValue” nominální hodnota F, “Coupon” kuponova sazba c, “Maturity” doba do splatnosti od okamziku vydani T, “Settlement” hodnotici okamzik t, “InterestRate” hodnotici urokova mira r, trzni urokova mira pro srovnatelnou investici, cenu kapitalu, “CouponInterval” rocni frekvence vyplaty kuponu 1/f, (f=2 znamena dvakrat rocne), “DayCountBasis” kalendářová konvence, “AccruedInterest” alikvotni urok, “Value” clean value, “FullValue” dirty value.

POZOR NA SYNTAXI!!! PRI RESENI ULOH ZKOPIRUJTE Z HELPU!!!

propertiesFinancialBond=FinancialBond["Properties"]

Poznamka: Properties:

({{"Value", price adjusted for accrued interest}, {"FullValue", unadjusted price}, {"AccruedInterest", accrued interest at settlement}, {"Duration", Macaulay duration}, {"ModifiedDuration", modified duration}, {"Convexity", convexity}, {"CouponPeriodDays", days in coupon period containing the settlement}, {"CouponToSettlementDays", days from previous coupon to settlement}, {"SettlementToCouponDays", days from settlement to next coupon}, {"NextCouponDate", next coupon date}, {"PreviousCouponDate", previous coupon date}, {"RemainingCoupons", remaining coupon payments}})

1 Příklad (numerický)

Současná hodnotící úroková míra je  6%. Jaká je spravedlivá cena kuponové obligace splatné za 30 let s roční kuponovou sazbou 5.75% a nominální hodnotou 1000Kč?

FinancialBond[{"FaceValue"->1000,"Coupon"->0.0575,"Maturity"->30},{"InterestRate"->0.06,"Settlement"->0}]

2 Příklad (numerický)

10 - letá obligace, nominální hodnota 1000Kč, kupon dvakrát ročně, kupon 5.75% p.a., hodnocená 9 měsíců po vydání, hodnotící úr. míra r=5% p.a.:

FinancialBond[{"FaceValue"->1000,"Coupon"->0.0575,"Maturity"->10,"CouponInterval"->(1/2)},{"InterestRate"->0.05,"Settlement"->(9/12)}]

3 Příklad (numerický)

F=1000, c=0.04, kupon ctvrtletni, splatnost 31. 12. 2030, hodnocena ke dni 5. 9. 2013, r=0.06.

FinancialBond[{"FaceValue"->1000,"Coupon"->0.04,"Maturity"->{2030,12,31},"CouponInterval"->(1/4)},{"InterestRate"->.06,"Settlement"->{2013,9,5}}]

Graficky v zavislosti na hodnotici urokove mire:

Plot[FinancialBond[{"FaceValue"->1000,"Coupon"->0.04,"Maturity"->{2030,12,31},"CouponInterval"->(1/4)},{"InterestRate"->r,"Settlement"->{2013,9,5}}],{r,0.03,0.05}]

4 Priklad (alikvótní úrok)

Alikvotni urok pri kalendari "Actual/360". Ostatni je zrejme z predchoziho vykladu.

FinancialBond[{"FaceValue"->1000,"Coupon"->0.07,"Maturity"->{2030,12,31},"CouponInterval"->(1/2)},{"InterestRate"->0.06,"Settlement"->{2010,11,12},"DayCountBasis"->"Actual/360"},"AccruedInterest"]

ListPlot[Table[FinancialBond[{"FaceValue"->1000,"Coupon"->0.07,"Maturity"->{2030,12,31},"CouponInterval"->(1/2)},{"InterestRate"->0.06,"Settlement"->{2010,11,d},"DayCountBasis"->"Actual/360"},"AccruedInterest"],{d,1,30}]]

Cviceni:
Graficky znazornete alikvotni urok jako funkci hodnoticiho data pro obdobi 1.11.2010 az 31.12.2013. Navod: Pouzijte funkci DaysPlus.

5 Příklad (výnos do splatnosti)

Vynos do splatnosti (YTM, Yield To Maturity, zde nazyvany “Implied yield to maturity”) obligace, ktera se 3.5.2013 prodavala za trzni cenu 900.

FindRoot[FinancialBond[{"FaceValue"->1000,"Coupon"->0.05,"Maturity"->{2018,6,31},"CouponInterval"->(1/4)},{"InterestRate"->ytm,"Settlement"->{2013,5,3}}]==900,{ytm,.1}]

6a Příklad (explicitni vzorce)

Je mozne ziskat i explicitni vzorce:

FinancialBond[{"FaceValue"->F,"Coupon"->c,"Maturity"->T,"CouponInterval"->(1/f)},{"InterestRate"->r,"Settlement"->t}]//Apart//TraditionalForm

Value

(value=FinancialBond[{"FaceValue"->F,"Coupon"->c,"Maturity"->T,"CouponInterval"->(1/f)},{"InterestRate"->r,"Settlement"->t},"Value"])//Apart//FullSimplify//TraditionalForm

FullValue

(fullvalue=FinancialBond[{"FaceValue"->F,"Coupon"->c,"Maturity"->T,"CouponInterval"->(1/f)},{"InterestRate"->r,"Settlement"->t},"FullValue"])//Apart//TraditionalForm

Alikvótní úrok

(accrued=FinancialBond[{"FaceValue"->F,"Coupon"->c,"Maturity"->T,"CouponInterval"->(1/f)},{"InterestRate"->r,"Settlement"->t},"AccruedInterest"])//Apart//TraditionalForm

fullvalue-value//FullSimplify//TraditionalForm

fullvalue-value==accrued//FullSimplify

FinancialBond[{"FaceValue"->F,"Coupon"->c,"Maturity"->5},{"InterestRate"->r,"Settlement"->0}]
%//Apart//TraditionalForm

6b Příklad (explicitni vzorce pro vsechny vlastnosti)

propertiesFinancialBond

Map[{#,FinancialBond[{"FaceValue"->F,"Coupon"->c,"Maturity"->T,"CouponInterval"->(1/f)},{"InterestRate"->r,"Settlement"->t},#]//FullSimplify}&,propertiesFinancialBond]//TableForm

7 Příklad (Durace, konvexita)

FinancialBond[{"FaceValue"->F,"Coupon"->c,"Maturity"->T,"CouponInterval"->(1/f)},{"InterestRate"->r,"Settlement"->0},"Duration"]//Simplify

Podobně konvexita, místo “Duration” použít “Convexity”.

8 Příklad (Hodnoceni pri uziti urokovych mer ze spotove vynosove krivky)

vynosovakrivka=Thread[Range[5]->Table[(Subscript[R, i]),{i,5}]]

FinancialBond[{"FaceValue"->F,"Coupon"->c,"Maturity"->5},{"InterestRate"->vynosovakrivka,"Settlement"->0}]
%//Apart//TraditionalForm

***9 Příklad (Nahodna urokova mira)

pricer=FinancialBond[{"FaceValue"->1000,"RedemptionValue"->1100,"Coupon"->0.07`,"Maturity"->5,"CouponInterval"->(1/2)},{"InterestRate"->r,"Settlement"->0}]

Expectation[pricer,r\[Distributed]NormalDistribution[0.05,0.01]]

V teto podobe nefunguje. Ale treba pro dobu do splatnosti funguje:

pricet=FinancialBond[{"FaceValue"->1000,"RedemptionValue"->1100,"Coupon"->0.07`,"Maturity"->t,"CouponInterval"->(1/2)},{"InterestRate"->.09,"Settlement"->0}]
Expectation[pricet,t\[Distributed]NormalDistribution[12.5,1]]

***10 Příklad (Rules)

Je mozne ziskat i explicitni vzorce:

(FinancialBond[{"FaceValue"->F,"Coupon"->c,"Maturity"->T,"CouponInterval"->(1/f)},{"InterestRate"->i,"Settlement"->t}]/.f->1)//FullSimplify[#,Assumptions->i>-1]&

Value

(value=FinancialBond[{"FaceValue"->F,"Coupon"->c,"Maturity"->T,"CouponInterval"->(1/f)},{"InterestRate"->i,"Settlement"->t},"Value"]/.f->1)//FullSimplify[#,Assumptions->i>-1]&
(%/.i->(1/v)-1)//FullSimplify[#,Assumptions->0<v<1]&

(value=FinancialBond[{"FaceValue"->F,"Coupon"->c,"Maturity"->T,"CouponInterval"->(1/f)},{"InterestRate"->i,"Settlement"->t},"Value"]/.{f->1,t->0})//FullSimplify[#,Assumptions->i>-1]&

FullValue

(fullvalue=FinancialBond[{"FaceValue"->F,"Coupon"->c,"Maturity"->T,"CouponInterval"->(1/f)},{"InterestRate"->i,"Settlement"->t},"FullValue"]/.f->1)//FullSimplify[#,Assumptions->i>-1]&

FullValue minus value

fullvalue-value//FullSimplify[#,Assumptions->i>0]&

Alikvótní úrok

(accrued=FinancialBond[{"FaceValue"->F,"Coupon"->c,"Maturity"->T,"CouponInterval"->(1/f)},{"InterestRate"->i,"Settlement"->t},"AccruedInterest"]/.f->1)//TraditionalForm

Rules

(rules=FinancialBond[{"FaceValue"->F,"Coupon"->c,"Maturity"->T,"CouponInterval"->(1/f)},{"InterestRate"->i,"Settlement"->t},"Rules"]/.f->1)//FullSimplify[#,Assumptions->i>-1]&
(%/.i->(1/v)-1)//FullSimplify[#,Assumptions->0<v<1]&

(value+accrued-fullvalue//FullSimplify[#,Assumptions->i>0]&)/.{t->3.4,T->6,i->.05}

fullvalue-value//FullSimplify

FinancialBond[{"FaceValue"->F,"Coupon"->c,"Maturity"->5},{"InterestRate"->r,"Settlement"->0}]
%//Apart//TraditionalForm

***11 Příklad ([3] Cipra, Matematika cenných papírů, 2013, str. 29 a dále)

Pozor, ve vzorcích zde figuruje kupónová sazba c=C/F!!!

Clear[cipraPV124,cipraVτ126,cipraCτ127];
(* Vzorec 1.2.4 *)
{(cipraPV124[c_,F_,n_,i_]=Module[{v},c F  (∑_(j=1)^n)(v^j)+F (v^n)/.v->(1/(1+i))]//FullSimplify[#,Assumptions->i>-1]&)//Apart//TraditionalForm,
(* Vzorec 1.2.6 *)(cipraVτ126[c_,F_,n_,τ_,i_]=(((1+i))^τ)cipraPV124[c,F,n,i]//FullSimplify[#,Assumptions->i>-1]&)//Apart//TraditionalForm,(cipraCτ127[c_,F_,n_,τ_,i_]=((c F)/i)((((1+i))^τ)-1)//FullSimplify[#,Assumptions->i>-1]&)//Apart//TraditionalForm}
(%[[2]]-%//Last)//FullSimplify[#,Assumptions->i>-1]&

C (v^(-τ))(∑_(j=1)^n)(v^j)+F (v^(n-τ))
(%/.v->(1/(1+i)))//FullSimplify[#,Assumptions->i>-1]&

***12 Příklad ([3] Cipra, Matematika cenných papírů, 2013, str. 100 a dále, Příklad 1.7.1)

Plot[{FinancialBond[{"FaceValue"->10000,"Coupon"->0.1,"Maturity"->3},{"InterestRate"->.05,"Settlement"->0}](1.05^t),
FinancialBond[{"FaceValue"->10000,"Coupon"->0.1,"Maturity"->3},{"InterestRate"->.1,"Settlement"->0}](1.1^t),
FinancialBond[{"FaceValue"->10000,"Coupon"->0.1,"Maturity"->3},{"InterestRate"->.15,"Settlement"->0}](1.15^t)}//Evaluate,{t,2.7,2.8}]

8858.39 (1.15^3)

***Obligace (bonds)

Assuming[t ∈Reals∧T∈Integers∧0<t<T,Simplify[T-Floor[T-t]]]
Assuming[t ∈Reals∧T∈Integers,Simplify[Floor[T+t]]]
Assuming[t ∈Reals∧T∈Integers,Simplify[Floor[T-t]]]
Assuming[t ∈Reals∧T∈Integers∧¬(t∈Integers),Simplify[Floor[T-t]]]
Assuming[x ∈Reals∧n∈Integers∧x>0,Simplify[Ceiling[x]-Floor[x]-1]]
Assuming[x ∈Reals∧n∈Integers,n-Ceiling[x]==n-Floor[x]-1]
Plot[-1+Ceiling[x]-Floor[x],{x,-2.5,2.5},PlotStyle->{Red,Thick}]

Hodnocení investic (Investice s pohyblivým výnosem)

Svolatelný dluhopis (vypověditelný, callable bond)

Emitent může dluhopis splatit (odkoupit, svolat) před uplynutím normální doby splatnosti. Zpravidla tak učiní v případě, že má přístup k “levnějším” penězům než musí platit v úrocích emitovaného dluhopisu. Pro držitele dluhopisu (investora) to bývá nevýhodné (emitent obvykle svolává v případě, že tržní ú. m. je nižší než kupónová sazba, investor tedy obvykle na trhu nenajde stejně výhodnou investiční příležitost) , takže emitent musí nabídnout určitou kompenzaci. Ta je obvykle zakotvena ve svolávacím plánu (call schedule).

Je-li T doba do splatnosti, nominální hodnota F, pak emitent může obvykle svolat v okamžicích (Subscript[T, -k])=T-k, k=1,...,K    se splatnými částkami (Subscript[F, -1]),...,(Subscript[F, -K]). Z podstaty věci vyplývá, že by mělo platit (Subscript[F, -k])>F. K exaktnímu hodnocení musíme též znát pravděpodobnosti svolání (Subscript[p, -1]),...(Subscript[p, K]) v okamžicích (Subscript[T, -1]),...,(Subscript[T, K]). Je přirozené, že tyto pravděpodobnosti se mění v závislosti na tržní situaci a jsou závislé na hodnotícím okamžiku t: (Subscript[p, -1])(t),...(Subscript[p, K])(t). Struktura CALL opce je tedy poměrně komplikovaná.

V praxi se uvádějí svolávací ceny v procentech: (Subscript[F, 0])=100%,(Subscript[F, -1])=102%,(Subscript[F, -2])=104%,....

Mluví se o též dluhopisu s vnořenou opcí (embedded option). Opci může uplatnit emitent (je v dlouhé pozici), takže

(cena svolatelného dluhopisu) = (cena ekvivalentního dluhopisu bez možnosti svolání) - (cena CALL opce).

***Price of a callable bond is always lower than the price of a straight bond because the call option adds value to an issuer. Yield on a callable bond is higher than the yield on a straight bond.

Viz též [3], str. 11, 90 a dále.

Poznámka (puttable bond)

V tomto případě má držitel právo prodat dluhopis emitentovi, opět za předem dohodnutých podmínek (prodejní opce). Exisují také dluhopisy s oběma opcemi, CALL opce a PUT opce se vzájemně nevylučují.

Amortizované obligace

Emitent nesplatí v okamžiku vypršení nominální hodnotu, ale “amortizuje” ji v konstatních kupónech. Místo standardního peněžního toku pro běžnou kupónovou obligaci {C,C,...,C,C+F} tak investor dostává anuitu {(SuperStar[C]),(SuperStar[C]),...,(SuperStar[C])}. Amortizovaná obligace je, ceteris paribus, méně riskantní (proč?), takže “ekvivalentní” kupón bude nižší než vypočtený z přesné ekvivalence peněžních toků (samozřejmě závislých na hodnotící ú. m.).

Dluhopisy za nejistoty

Simple Bonds under Uncertainty I

Suppose that a zero coupon bond pays F with probability p and pays η,F with probability 1-p at maturity one year , where η ∈[0, 1) is called the recovery rate (míra pokrytí, míra zotavení), and  λ:=1-η  is called the loss rate (ztrátový poměr). The case η=0  is equivalent to the default (nesplacení). Suppose that the valuation interest rate is r. The fair value of the bond is the expected present value:

(OverBar[PV]) =(1/(1+r))[p,F+(1-p)η,F]

Simple Bonds under Uncertainty 2

Uvažujme pro změnu obligaci s nulovým kuponem splatnou za jeden rok s nominální hodnotou F=1, ale ve skutečnosti vyplaíi X, kde X je náhodná veličina, 0≤X≤1. Nechť r je hodnotici urokova mira. Spravedlivá hodnota obligace je pak

(OverBar[PV]) =(1/(1+r))E,X

Stanovení rizikové přirážky

Podobnou myšlenku můžeme užít i pro hodnoceni půjček, resp. při stanovení prémie z rizika nesplacení (default risk premium). Předpokládejme, že půjčka ve výši PV = 1 je splatná za 1 rok, ale ve skutečnosti dlužník splatí náhodnou částku X, 0≤X≤1, úrok v to nepočítaje. Otázkou je, jaká by měla být prémie za riziko z nesplacení (Subscript[r, default]) účtovaná věřitelem, aby dostal v průměru bezrizikový úrok (Subscript[r, 0]). Jistá budoucí hodnota půjčky je 1+(Subscript[r, 0]), takže věřitel by měl požadovat rizikovou přirážku vyplývajici ze vztahu

1+(Subscript[r, 0])=(1+(Subscript[r, 0]))(1+(Subscript[r, default]))E,X

z čehož

(Subscript[r, default])=(1/(E,X))-1.

Hodnocení opcí a futures

Úvod

Arbitráž a zajišťování (hedging)

All the models treated assume no-arbitrage principle, in other words, the absence of arbitrage opportunities. By an arbitrage opportunity we mean any of the two situations:
(1) At the same time, the same asset is sold at different prices at different places. Nowadays, this can hardly happen in the financial world since the information from one stock exchange is available on the stock exchange on the opposite side of the globe within a second.
(2) With zero investment at time 0 there is no probability of loss but there is a possibility of a riskless profit at time 1. More rigorously, an arbitrage opportunity in this case is a self-financing trading strategy with no initial investment, and a positive probability of positive profit and zero probability of negative profit later on.

Arbitrage opportunity is often characterized as a “money pump” and no-arbitrage
principle by the slogan: “There is no such thing like a free lunch.”.

Velmi často se setkáme s následujicí, poněkud nepřesnou terminologií.
Investor je v krátké pozici, short position, jestliže nějaké aktivum nevlastní, ale má závazky z něj plynoucí. Obvykle se jedná o emitenta dluhopisu nebo prodávajicího opce. V dlouhé pozici, long position je investor, ktery je držitelem (kupujícim) nějakého aktiva, ze kterého pro protistranu plynou nějaké závazky. V připadě opcí investorovi v krátké pozici nezbývá než trpně přihližet, jak se bude trh vyvíjet, a jak se protistrana zachová. V případě racionálně se chovajícího se investora v dlouhé pozici je jeho rozhodnutí determinováno trhem.

Zkráceně se někdy dlouhá pozice značí “+“, krátká “-“.

Příklad arbitráže

Nulová investice v čase 0 a nenulová pravděpodobnost zisku v čase 1 a nulová pravděpodobnost ztráty v čase 1.

Cena akcie v čase t je (Subscript[S, t]), t=0,1. V čase t=0 si půjčím částku B=-(Subscript[S, 0]), (úroková míra r) a za ní  si koupím akcii. Moje bilance (hodnota portfólia) v čase t=0 je (Subscript[S, 0])+B=0. V čase t=1 je hodnota portfólia (Subscript[S, 1])+(1+r)B. Jestliže P((Subscript[S, 1])+(1+r)B>0)>0 a zároveň P((Subscript[S, 1])+(1+r)B<0)=0, jedná se o arbitráž.

Bezriziková úroková míra (riskless, riskfree)

Abstraktní pojem, předpokládá se že existuje úroková míra (Subscript[r, 0]), která je stejná pro dlužníky, vypůjčovatele (borrowers) i věřitele (lenders). Investice při této ú. m. poskytují zaručený, jistý výnos. S touto úrokovou mírou se setkáváme v řadě modelů. V praktických výpočtech se obvykle nahrazuje (proxy) úrokovou mírou výnosu státních dluhopisů (poukázek) pro srovnatelnou dobu splatnosti. V současnosti při tzv. “kvantitavním uvolňování” (rozuměj tištění nekrytých bankovek) jak v USD tak EUR zóně je možné o bezrizikovosti s úspěchem pochybovat. To také platí při iracionálních zásazích centrální banky.

***Záleží na kontextu, stejná pro dlužníky, vypůjčovatele (borrowers) i věřitele (lenders) je jistě nereálné, navíc transakční náklady.

Evropské a americké opce (vanilla options, obyčejné opce)

r ... bezriziková úr. míra (někdy značena  (Subscript[r, 0]))
(Subscript[S, t]) ... cena podkladového aktiva (akcie) v čase t
(Subscript[c, t]) resp. (Subscript[p, t]) ... cena evropské CALL resp. PUT opce
K ... realizační cena
T ... čas vypršení evropské opce
τ ... čas realizace americké opce τ≤T

Výplatní funkce (payoff function) evropské opce

v okamžiku vypršení

CALL: (SuperPlus[((Subscript[S, T])-K)])

PUT: (SuperPlus[(K-(Subscript[S, T]))])

Výplatní funkce (payoff function) americké opce

v okamžiku realizace τ

CALL: (SuperPlus[((Subscript[S, τ])-K)])

PUT: (SuperPlus[(K-(Subscript[S, τ]))])

PUT - CALL parita (platí pouze pro evropské opce!)

({{({{(Subscript[S, t])+(Subscript[p, t])=(Subscript[c, t])+K,(e^(-r(T-t)))}})}})

Mnemotechnická pomůcka pro zapamatování: státní podnik = císařsko-královské

Důkaz: viz též [1], str. 54. Uvažujme portfolio + PUT + akcie - CALL, vše na stejnou akcii, opce evropské se stejnou dobou vypršení. Hodnota portfolia v čase t≤T je

({{(Subscript[Π, t])=(Subscript[S, t])+(Subscript[p, t])-(Subscript[c, t]).}})

V čase vypršení T je hodnota tohoto portfolia

({{({{(Subscript[Π, T])=(Subscript[S, T])+(SuperPlus[(K-(Subscript[S, T]))])-(SuperPlus[((Subscript[S, T])-K)]).}})}})

V případě (Subscript[S, T])≤K je (Subscript[Π, T])=(Subscript[S, T])+K-(Subscript[S, T])-0=K, v případě (Subscript[S, T])>K je (Subscript[Π, T])=(Subscript[S, T])+0-((Subscript[S, T])-K)=K. To znamená, že portfolio je bezrizikové vedoucí k jistému zisku K. Budoucí hodnota je  (Subscript[Π, T])=K  a současná hodnota je tedy (Subscript[Π, t])=K,(e^(-r(T-t))).

Současná hodnota výplatní funkce (payoff function) evropské opce v čase t≤T

CALL: (SuperPlus[(e^(-r(T-t)))((Subscript[S, T])-K)])

PUT: (SuperPlus[(e^(-r(T-t)))(K-(Subscript[S, T]))])

Black-Scholesův vzorec

Risk Neutral Valuation (rizikově neutrální ptostředí, rizikově neutrální svět)

We assume that the stochastic process of the prices of an asset  (Subscript[{(Subscript[S, t])}, t≥0]) is goverened by a geometrical Brownian motion, hence

({{({{ℒ((Subscript[S, T])|(Subscript[S, t]))=L,N(ln (Subscript[S, t])+(μ-(1/2)(σ^2))(T-t),(σ^2)(T-t))}})}})

where μ is the rate of return on the underlying asset and σ its volatility.

Rizikově neutrální hodnocení: Investoři se chovají racionálně, čím větší riziko (volatilita), tím vyšší očekávaný výnos požadují. Čím vyšší averze k riziku, tím vyšší očekávaný výnos je požadován. Vyloučením rizikových preferencí dojdou investoři ke shodě na jediném rizikově neutrálním výnosu μ=r. Pozor, v žádném případě to neznamená, že by výnos podkladového aktiva byl roven r !!!

Alternativní princip vedoucí k témuž závěru: Očekávaný výnos z držení akcie v hodnotě (Subscript[S, t])  v období (t,T) by měl být stejný jako bezrizikový výnos z investice  ve výši (Subscript[S, t])  při úrokové míře r:

({{({{(SuperStar[E])((Subscript[S, T])|(Subscript[S, t]))=FV((Subscript[S, t]),r)=(Subscript[S, t])(e^(r(T-t)))}}).}})

Hvězdičkou zde i v dalším značíme skutečnost, že za výnos bereme rizikově-neutrální výnos r.

Neuvažujeme-li žádné rizikové preference investorů, je

({{({{(SuperStar[ℒ])((Subscript[S, T])|(Subscript[S, t]))=L,N(ln (Subscript[S, t])+(r-(1/2)(σ^2))(T-t),(σ^2)(T-t))}}).}})

Then

({{({{(SuperStar[E])((Subscript[S, T])|(Subscript[S, t]))=}})}})

Mean[LogNormalDistribution[Log[(Subscript[S, t])]+(r-(1/2)(σ^2))(T-t),σ(Sqrt[T-t])]]//Simplify//TraditionalForm

Similarly for the variance:

({{({{(SuperStar[var])((Subscript[S, T])|(Subscript[S, t]))=}})}})

Variance[LogNormalDistribution[Log[(Subscript[S, t])]+(r-(1/2)(σ^2))(T-t),σ(Sqrt[T-t])]]//Simplify//TraditionalForm

Viz [1], str. 55-56.

Hodnota (cena) evropské opce

Jako přirozené se jeví vzít za hodnotu evropské opce v čase t podmíněnou střední hodnotu současné hodnoty výplatní funkce při dané hodnotě podkladového aktiva (Subscript[S, t]) při čemž střední hodnota je uvažovaná při bezrizikové (tj. rizikově neutrální) úrokové míře r:

({{({{(Subscript[c, t])=(e^(-r(T-t)))(SuperStar[E])((SuperPlus[((Subscript[S, T])-K)])|(Subscript[S, t]))}, {(Subscript[p, t])=(e^(-r(T-t)))(SuperPlus[(SuperStar[E])(K-(Subscript[S, T]))])|(Subscript[S, t]))}})}})

ct=(E^(-r(T-t)))Expectation[Max[0,((Subscript[S, T])-K)],(Subscript[S, T])\[Distributed]LogNormalDistribution[Log[(Subscript[S, t])]+(r-(1/2)(σ^2))(T-t),σ(Sqrt[T-t])]]

ct[[2,2]]//FullSimplify

Tuto formuli lze převést do běžně uváděného tvaru (Black-Scholes formula)

({{({{(Subscript[c, t])=(Subscript[S, t])Φ((Subscript[d, 1]))-K (e^(-r(T-t)))Φ((Subscript[d, 2])),
(Subscript[d, 1,2])=((log((Subscript[S, t])/K)+(r±(σ^2)/2)(T-t))/(σ(Sqrt[T-t]))).}})}})

Hodnota PUT opce se získá z PUT - CALL parity: ({{({{(Subscript[p, t])=(Subscript[c, t])+K,(e^(-r(T-t)))}})-(Subscript[S, t]).}})

Poznámka (opce na akcie vyplácející dividendu)

Vyplácí-li akcie dividendu s dividendovou intenzitou d, pak se v předchozím vzorci nahradí r→r-d. Vyplácením dividendy se snižuje hodnota firmy a tudíž i kapitálový výnos.

Citlivosti (Comparative Statics, The Greeks)

Statics je sice vžitý, ale asi chybně použitý termín nevystihující podstatu. Greeks: charakteristiky (až na jednu) se označují řeckými písmeny.

Nechť (Subscript[V, t]) označuje hodnotu CALL resp. PUT opce, (Subscript[V, t])=(Subscript[c, t]) resp. (Subscript[V, t])=(Subscript[p, t]). Z Black-Scholesova vzorce je patrné, že (Subscript[V, t]) je funkcí pěti proměnných (parametrů):

({{({{(Subscript[V, t])=(Subscript[V, t])((Subscript[S, t]),K,σ,T-t,r)}}).}})

Derivace podle jednotlivých proměnných se nazývají citlivosti a protože se označují řeckými písmeny, jsou též známé jako “The Greeks”. Jejich výpočet je přímočarý, ale v některých případech technicky dosti komplikovaný. Uvedeme jen jednu míru citlivosti delta, derivaci podle aktuální ceny akcie:

({{({{Δ=((∂(Subscript[V, t]))/(∂(Subscript[S, t])))}}).}})

Pro CALL resp. PUT dostaneme

({{({{(Subscript[Δ, c])=Φ((Subscript[d, 1]))   resp.   (Subscript[Δ, p])=(Subscript[Δ, c])-1=-Φ(}})-(Subscript[d, 1])).}})

Charakteristiky Δ se používá k tzv. delta-zajišťování, delta hedging. Uvažujme portfolio skládající se z dlouhé pozice jedné akcie a krátké pozice v A kusech CALL opcí na tutéž akcii. Hodnota portfolia je tedy (Subscript[Π, t])=(Subscript[S, t])-A,(Subscript[c, t]). Chceme najít A takové, aby hodnota portfolia byla invariantní vůči (malým) změnám ceny akcie, tj.

({{({{((∂,(Subscript[Π, t]))/(∂(Subscript[S, t])))}})=0.}})

Hledané A=1/(Subscript[Δ, c]), nazývané zajišťovací poměr, hedge ratio. Vzhledem k tomu, že se delta mění v čase, musí se portfolio často měnit → dynamické zajišťování, dynamic hedge. To může být nákladné kvůli transakčním nákladům. Tudíž vhodné pro makléře a tvůrce trhu, kteří mají relativně nízké transakční náklady. Všimněme si, že čím nižší (Subscript[S, t]) ve srovnání s K, tím vyšší je zajišťovací poměr. Podobnou mírou citlivosti je elasticita ceny CALL opce vzhledem k ceně akcie definovaná jako (Subscript[E, c])=(Subscript[Δ, c])(Subscript[S, t])/(Subscript[c, t]). Vždy je (Subscript[E, c])>1. (Dokažte za cvičení.) Proto je CALL opce vždy riskantnější než její podkladové aktivum. Analogie k Δ je durace.

**Další míry citlivosti viz [1], str. 60-61.

Implied Volatility (Implikovaná volatilita)

({{({{(Subscript[V, t])=(Subscript[V, t])((Subscript[S, t]),K,σ,T-t,r)}}).}})

Ve výše uvedeném vzorci pro (Subscript[V, t]) v okamžiku t vždy známe hodnoty (Subscript[S, t]),K,T-t,r. Při aplikaci Black-Scholesova vzorce pro neznámou volatilitu obvykle použijeme výběrovou směrodatnou odchylku z historických (známých) dat logaritmických výnosů ln((Subscript[S, t+1])/(Subscript[S, t])) pro nějaké rozumné historické hodnoty. Sofistikovanější metody jsou založené na modelech volatility typu ARCH, GARCH, jejich zobecněních a modifikacích. Viz zabudované funkce (nezahrnují zdaleka všechny dnes používané modely):

?*ARCH*

?*AR*

Můžeme ale též přistoupit k odhadu volatility jiným způsobem. V daném časovém okamžiku t, (teď, hodnotící časový okamžik), známe nejenom  hodnoty (Subscript[S, t]),K,T-t,r, ale i tržní hodnotu opce (Subscript[V, t]^M). Po substituci známých hodnot do Black-Scholesovy formule dostaneme rovnici pro neznámou σ:

({{(Subscript[V, t]^M)=({{(Subscript[V, t])((Subscript[S, t]),K,σ,T-t,r)}}).}})

Tato rovnice nemusí mít žádné řešení (řešení je nutné hledat numericky), může mít právě jedno (nejpříjemnější situace, i když i tam můžeme býti překvapeni) nebo více řešení - z těch je pak zapotřebí citlivě vybírat.

Důležité! Volatilita a implikovaná volatilita viz [1], str. 61-62.

Portfolia opcí

Příklad v [1], str. 62-63.

SetDirectory[NotebookDirectory[]]

Import["FM1aPortfolia_opci.jpg"]

Illustration of a cap:

With[{K=50,B=70},Plot[Max[0,S-K]-Max[0,S-K-B],{S,0,200},PlotTheme->"Business"]]

Forwardy a futures

Na rozdíl od opcí je smlouva mezi stranami závazná. Forwardy jsou individuálně uzavírané kontrakty o budoucím vypořádání, futures standardizované.

4.3.2 Termínové obchody: Forwardy a futures

Připomeňme nejprve mechanismus fungování opcí. U nich investor (držitel, kupující) v dlouhé pozici má právo, nikoli povinnost své právo zakotvené v opční smlouvě uplatnit. To znamená,že podkladové aktivum (underlying) může buď koupit (v případě CALL opce) nebo prodat (v případě PUT opce). Prodávající (pisatel) pak trpně čeká, jak se vyvíjí tržní situace, a jestli držitel své právo uplatní. Ten tak ovšem učiní v případě, že uplatněním opce dosáhne zisku nebo alespoň bude minimalizovat ztrátu vzniklou náklady na pořízení opce.

U kontraktů typu forward a futures není možná volba jako u opcí. Pro obě strany je smlouva závazná, tudíž tady v okamžiku uzavření kontraktu neexistuje cena kontraktu v pravém slova smyslu. Forwardový kontrakt je termínový obchod, smlouva mezi dvěma partnery (řekněme A a B), ve kterém se strana kupující A (v dlouhé pozici) zavazuje koupit od strany prodávající B (v krátké pozici) určitou komoditu v určeném množství za určitou cenu F fixovanou v okamžiku uzavření kontraktu v určitém budoucím termínu T (dodání, delivery). Vše je závazně domluveno dnes, dejme tomu v okamžiku  t = 0, a vlastní transakce proběhne ve sjednaném termínu v budoucnosti T, t<T. Obě strany jsou povinné své závazky splnit. Předpokládejme dále, že aktuální cena podkladového aktiva v okamžiku uzavření kontraktu je (Subscript[S, 0]).

Pozice obou stran v kontraktu je symetrická. V okamžiku vypořádání zisk jedné strany jest roven ztrátě druhé strany. Jestliže  smluvená cena kontraktu v čase vypořádání T je F, pak strana A obdrží v okamžiku T částku (Subscript[S, T])-F a strana B přirozeně obdrží  F-(Subscript[S, T]). To, co se obvykle v teorii neuvažuje, jsou transakční náklady. Pro individuálně uzavřené kontrakty mohou být nezanedbatelné.

Tyto kontrakty mají minimálně tyto dvě funkce. První: ochrana (uhájení) ceny komodity, která je předmětem kontraktu. Druhá: transfer vlastnictví; fixováním ceny dnes (v čase t) je kupující chráněn (jištěn) proti případné vyšší ceně v okamžiku vypořádání kontraktu (tj. okamžité (spotové) ceně na trhu v okamžiku dodání). Prodávající je chráněn (jištěn) proti případné nižší promtní ceně v okamžiku vypořádaní kontraktu (tj. okamžité ceně na trhu v okamžiku dodání).

Obchodování s forwardy není prakticky regulováno, jsou to obchody individuální, takže riziko z nesplacení (default) je nezanedbatelné. V tomto případě se rizikem selhání myslí to, že strana v dlouhé pozici cukne, nebude chtít koupit nebo strana v krátké pozici odmítne prodat. Toto riziko je z velké části eliminováno standardizací. Není možné postihnout všechny individuální obchody a převést je ke globálnímu obchodování, nicméně je mnoho komodit (obilí, ropa, strategické kovy, měny, . . . ), které je možné dovést ke standardizovanému obchodování. Standardizované obchody tohoto typu se provádějí na specializované burze a nazývají se futures.

Futures: Z matematického hlediska jsou forwards a futures prakticky totožné. Proto se na hodnocení futures vztahují stejná kritéria jako na forwardy. Dále budeme mluvit o hodnocení forwardů.

Uvedeme některé přístupy k hodnocení forwardových kontraktů. Nejprve uveďme hodnocení na základě principu neexistence arbitráže. Jako dříve předpokládáme, že cena podkladového aktiva v čase t=0 je (Subscript[S, 0]) a z držení aktiva neplynou žádné závazky např. ve formě dividend. Dále uvažujeme bezrizikovou hodnotící úrokovou míru r.

Strana B, krátká v kontraktu, jest povinnou doručit (deliver) částku (Subscript[S, T]) v okamžiku T. Strana B si vypůjčí částku (Subscript[S, 0]) v čase t=0 (čas uzavření kontraktu), koupí předmětné aktivum a v čase T obdrží F. Touto částkou (F) splatí půjčku, která v čase T je ve výši budoucí hodnoty (Subscript[S, 0])(e^(r,T)) , takže forwardová cena je

F=(Subscript[S, 0])(e^(r,T))

V okamžiku t=0 si strany nevyměňují žádné peníze, hodnota kontraktu je tudíž nulová.
V libovolném čase 0≤t≤T je však hodnota kontraktu

(Subscript[f, t])=(Subscript[S, t])-F,(e^(-r(,T-t)))

V takovém okamžiku může každá ze stran „uzamknout, lock” svou pozici tak, že uzavře pozici opačnou. Může tak fixovat zisk nebo ztrátu. Je-li (Subscript[S, t])<F,(e^(-r(T-t))), strana B si půjčí (Subscript[S, t]), koupí akcii, v okamžiku T splatí (Subscript[S, t])(e^(r(T-t))) a akcii prodá za F. Je-li naopak (Subscript[S, t])>F,(e^(-r(T-t))), strana A prodá akcii nakrátko, dostane za ni (Subscript[S, t]), tuto částku uloží a v okamžiku T vybere (Subscript[S, t])(e^(r(T-t)))>F. Koupí akcii za F a akcii vrátí.

4.3.9 Poznámka. (Ekvivalentní portfolio) Výplatní funkce forwardu v dlouhé pozici je (Subscript[S, T])-F. Dlouhá pozice ve forwardu je ekvivalentní v dlouhé evropské CALL a krátké pozici v evropské PUT, obě se stejnou dobou vypršení, stejnou realizační cenou K=F jako má forwardový kontrakt. Taková kombinace opcí má stejnou výplatní funkci jako forward, a tedy i v okamžiku uzavření kontraktu musí mít stejnou hodnotu. V čase t=0 (okamžik uzavření kontraktu) je však hodnota kontraktu nulová (nedochází k žádné výměně peněz), jinými slovy (Subscript[c, 0])-(Subscript[p, 0])=0. Ale z PUT-CALL parity (Subscript[c, 0])-(Subscript[p, 0])=(Subscript[S, 0])-F,(e^(-r,T)). Z toho tedy vyplývá vzorec pro F.

With[{K=50},GraphicsRow[{Plot[Max[0,S-K],{S,0,100},PlotStyle->{Thick,Red},PlotLabel->"CALL",AxesLabel->{"(Subscript[S, T])","(Subscript[c, T])"}],
Plot[Max[0,K-S],{S,0,100},PlotStyle->{Thick,Orange},PlotLabel->"PUT",AxesLabel->{"(Subscript[S, T])","(Subscript[p, T])"}],
Plot[Max[0,S-K]-Max[0,K-S],{S,0,100},PlotStyle->{Thick,Blue},PlotLabel->"Forward",AxesLabel->{"(Subscript[S, T])","(Subscript[f, T])"}]}]]

4.3.10 Poznámka. (Hodnocení pomocí Black–Scholesovy formule) Při rizikově neutrálním
oceňování a předpokladu, že cena akcie se řídí Black–Scholesovým vzorcem, je E((Subscript[S, T])|(Subscript[S, 0]))=(Subscript[S, 0])(e^(r,T)).  Výplatní funkce forwardu je (Subscript[S, T])-F. Střední hodnota této funkce podmíněná známou cenou akcie v okamžiku uzavření kontraktu t=0 a diskontovaná k okamžiku 0 je tedy (Subscript[S, 0])-F,(e^(-r,T)). Tento výraz je však roven nule, neboť v okamžiku uzavření kontraktu je cena nulová.
(WILMOTT Students, p. 99)

FinancialDerivative v systému  Mathematica  (v této verzi (10) zatím omezeno jenom na opce)

FinancialDerivative

Označení: “StrikePrice” realizacni cena K, “Expiration” doba do splatnosti, doba do vyprseni T, pokud se uvede “ReferenceTime” t, pak je to T-t,  “InterestRate” bezrizikova urokova mira (Subscript[r, 0]), “Volatility” volatilita ceny podkladoveho aktiva σ (underlying asset), “CurrentPrice” soucasna cena podkladoveho aktiva (Subscript[S, 0]) resp. (Subscript[S, t]) . “Dividend” je dividendova intenzita q. Vsechny udaje se vztahuji ke stejnemu casovemu obdobi, typicky 1 rok.

(* vsechny zabudovane derivaty, zde zvane "Contracts" *)
FinancialDerivative[]
(* //Length *)

POZOR NA SYNTAXI!!! PRI RESENI ULOH ZKOPIRUJTE Z HELPU!!! Typicky ma FinancialDerivative 3 az 4 argumenty, kazdy z nich je seznam (list).

1 Priklad (hodnoty opci)

FinancialDerivative[{"European","Call"}, {"StrikePrice"-> 50.00, "Expiration"->1},  {"InterestRate"-> 0.1, "Volatility" -> 0.5, "CurrentPrice"-> 50, "Dividend"->0.05}]

{FinancialDerivative[{"American","Call"}, {"StrikePrice"-> 50.00, "Expiration"->1},  {"InterestRate"-> 0.1, "Volatility" -> 0.5, "CurrentPrice"-> 50, "Dividend"->0.05}],FinancialDerivative[{"American","Call"}, {"StrikePrice"-> 50.00, "Expiration"->1},  {"InterestRate"-> 0.1, "Volatility" -> 0.5, "CurrentPrice"-> 50, "Dividend"->0.05},Method->"Binomial","Steps"->5000],FinancialDerivative[{"American","Call"}, {"StrikePrice"-> 50.00, "Expiration"->1},  {"InterestRate"-> 0.1, "Volatility" -> 0.5, "CurrentPrice"-> 50, "Dividend"->0.05},"GridSize"->{250,250}],FinancialDerivative[{"American","Call"}, {"StrikePrice"-> 50.00, "Expiration"->1},  {"InterestRate"-> 0.1, "Volatility" -> 0.5, "CurrentPrice"-> 50, "Dividend"->0.05},"GridSize"->{1000,1250}]}

2 Priklad (hodnoty opci a jejich citlivosti, The Greeks)

Opce z predchoziho prikladu, vystupem hodnota opce a citlivosti

FinancialDerivative[{"European","Call"}, {"StrikePrice"-> 50.00, "Expiration"->1},  {"InterestRate"-> 0.1, "Volatility" -> 0.5, "CurrentPrice"-> 50, "Dividend"->0.05}, {"Value", "Greeks"}]

3 Priklad (Graficke znazorneni)

Manipulate[Plot[FinancialDerivative[{"European","Call"}, {"StrikePrice"-> 50.00, "Expiration"->T},  {"InterestRate"-> 0.1, "Volatility" ->σ, "CurrentPrice"-> s, "Dividend"->0.05}],{s,40,60},AxesOrigin->{Automatic,0},PlotRange->{0,25},PlotStyle->{Thick,Red}],{{T,0.5},0.0001,1,Appearance->"Labeled"},{{σ,0.5},0.01,1,Appearance->"Labeled"},SaveDefinitions->True]

Manipulate[Plot[FinancialDerivative[{"American","Call"}, {"StrikePrice"-> 50.00, "Expiration"->T},  {"InterestRate"-> 0.1, "Volatility" ->σ, "CurrentPrice"-> s, "Dividend"->0.05},Method->"Binomial"],{s,45,55},AxesOrigin->{Automatic,0},PlotRange->{0,25},PlotStyle->Thick],{{T,0.5},0.0001,1,Appearance->"Labeled"},{{σ,0.5},0.01,1,Appearance->"Labeled"},SaveDefinitions->True]

4 Priklad (Graficke znazorneni)

Plot[FinancialDerivative[{"European","Call"}, {"StrikePrice"-> 50.00, "Expiration"->1},  {"InterestRate"-> 0.1, "Volatility" -> 0.5, "CurrentPrice"-> st, "Dividend"->0.05}],{st,30,60}]

Plot[Table[FinancialDerivative[{"European",(* "Call" *)"Put"}, {"StrikePrice"-> 50.00, "Expiration"->t},  {"InterestRate"-> 0.1, "Volatility" -> 0.5, "CurrentPrice"-> st, "Dividend"->0.05}],{t,{0,0.01,0.1,0.5,1}}],{st,30,60}]

Manipulate[Plot[FinancialDerivative[{"European","Call"}, {"StrikePrice"-> 50.00, "Expiration"->t},  {"InterestRate"-> 0.1, "Volatility" -> 0.5, "CurrentPrice"-> st, "Dividend"->0.05}],{st,40,60},PlotRange->{0,15},PlotStyle->Thick],
{{t,0,"Doba do vyprseni"},0,1,Appearance->"Labeled"},SaveDefinitions->True]

Hodnocení derivátů typu Cap (strop) a Floor  (dno)

Důvod, proč ve funkci FinancialDerivative není volba Cap resp. Floor (přesněji Caplet a Floorlet) vidím v tom, že tyto pojmy nejsou jednoznačně 
definovány a možností je celá řada. Obvykle jsou však kombinací elementárních finančních instrumentů (obligací, opcí, apod.)

Uvedeme ilustraci Cap na evropskou CALL opci s dobou vypršení T a realizační cenou K. Chrání investora v krátké pozici před neomezenou ztrátou. V případě, že cena (Subscript[S, T]) podkladového aktiva je v okamžiku vypršení vyšší než B,  vyplácí se B.

vyplataCAPnaCALL[St_,K_,B_]:=Min[Max[St-K,0],B]
Plot[vyplataCAPnaCALL[st,1,2],{st,0,5},PlotStyle->Thick]

Dlouhá pozice v tomto finančním instrumentu je ekvivalentní držení portfolia dvou CALL opcí, obě se stejnou dobou vypršení, jedna v dlouhé pozici s realizační cenou K, druhá v krátké pozici s realizační cenou K+B.

vyplataportfolia[St_,K_,B_]:=Max[St-K,0]-Max[St-K-B,0]
Plot[vyplataportfolia[st,1,2],{st,0,5},PlotStyle->Thick]

Cena tohoto instrumentu podle Black-Scholesova vzorce je tedy (musíme přidat bezrizikovou úrokovou míru r,0, volatilitu σ a dobu do vypršení T,t.

Clear[cenaCAPnaCALL];
cenaCAPnaCALL[St_,K_,B_,r0_,σ_,Tt_]:=FinancialDerivative[{"European","Call"}, {"StrikePrice"-> K, "Expiration"->Tt},  {"InterestRate"-> r0, "Volatility" -> σ, "CurrentPrice"-> St}]-FinancialDerivative[{"European","Call"}, {"StrikePrice"-> K+B, "Expiration"->Tt},  {"InterestRate"-> r0, "Volatility" -> σ, "CurrentPrice"-> St}]

Vyzkoušejte si manipulovat s některými parametry:

Manipulate[Plot[cenaCAPnaCALL[st,1,2,0.05,σ,Tt],{st,0,5},PlotRange->{0,2},PlotStyle->Thick],{{σ,0.4},0.01,1,Appearance->"Labeled"},
{{Tt,0.5,"T-t"},0.001,1,Appearance->"Labeled"}]

Dokončení přednášky VPFPM

Zde se mohou některé partie z předchozích materiálů opakovat.

FAQ

Metody Monte Carlo (MC) 2 (Simulační metody)

Signs of differences test (Test podle znamének diferencí)

This is the simplest test that immediately shows a rude violence of independence, but it is not robust against alternatives like oscillations, &c. The test statistic C is the total number of sign differences in the sequence. Likely a monotonous trend may be discovered but, as mentioned, it fails if the alternative are oscillating observations.

Necht testovana posloupnost je (Subscript[X, 1]),...,(Subscript[X, n]). Polozme (Subscript[Y, i])=I{(Subscript[X, i])<(Subscript[X, i+1])},  i=1,...,n-1,

C=(Underoverscript[∑ , ( i=1), (n-1)])(Subscript[Y, i]).

Nulová hypotéza je (Subscript[H, 0]): (Subscript[X, 1]),...,(Subscript[X, n]) je náhodná posloupnost, tj., je to posloupnost iid. Pozor, ani za platnosti (Subscript[H, 0]) nejsou (Subscript[Y, j]) nezávislé! Jsou ale stejně rozdělené a konečně závislé (finitely dependent, 1-finitely dependent, 1-závislé): (Subscript[Y, 1]),(Subscript[Y, 2]) jsou závislé, ale (Subscript[Y, 1]),(Subscript[Y, 3]) jsou již  za platnosti (Subscript[H, 0]) nezávislé!

Pro střední hodnotu C platí E,C=(n-1)E,(Subscript[Y, 1]) a pro rozptyl tedy s uvážením cov((Subscript[Y, 1]),(Subscript[Y, j]))=0 pro j≥3 platí,

var C=(∑_(j=1)^(n-1))var (Subscript[Y, j])+(∑_(j=1)^(n-1))(∑_(k=1,j≠k)^(n-1)) cov ((Subscript[Y, j]),(Subscript[Y, k]))=
(n-1)var (Subscript[Y, 1])+2(n-2)cov ((Subscript[Y, 1]),(Subscript[Y, 2])).

Poznamenejme, že následující úvahy neplatí jenom pro rovnoměrné rozdělení, ale pro libovolné spojité rozdělení, které má rostoucí distribuční funkci na svém nosiči. (Dokažte za cvičení.)

For proofs we may restrict ourselves to the case of the uniform distribution of (Subscript[X, i])'s on (0,1). Define the join distribution of  ((Subscript[Y, 1]),(Subscript[Y, 2]),(Subscript[Y, 3])), here vector yy.

Clear[xx,x];
xx=Table[x[i],{i,5}];
yy=TransformedDistribution[{Boole[x[1]<x[2]],Boole[x[2]<x[3]],Boole[x[3]<x[4]]},xx\[Distributed]ProductDistribution[{UniformDistribution[],Length[xx]}]]
Text@Row@{"Mean: ",meanYY=Mean[yy],Spacer[20],"Covariance matrix:  ",(covarianceYY=Covariance[yy])//MatrixForm}

The central limit theorem for finitely dependent random variables (r. v.) may apply. In the sequence of differences only the neighbours are dependent while the farther observations are independent. So the sequence consists of 1-finitely dependent r. v.

We need to calculate the mean and variance and use them for the standardized test statistic. After a simple algebra (analogous approach we use in the more complicated case of local extremes analyzed in the next Subsection) we get

Text@Row@{"EC = ",(EC=(n-1)meanYY[[1]])//TraditionalForm,Spacer[20],"   var C = ", (varC=(n-1)covarianceYY[[1,1]]+2(n-2)covarianceYY[[1,2]])//TraditionalForm}//Simplify

Nyní stačí aplikovat CLV pro konečně závislé (v tomto případě 1 - závislé) náhodné veličiny:

({{({{((C-E,C)/(Sqrt[var C]))(Overscript[⟶, 𝒟])}})N(0,1)}})

pro n ⟶ ∞, (konvergence je v distribuci).

Implementace:

Needs["HypothesisTesting`"];
Clear[differencesTestAsymptotic];
differencesTestAsymptotic[data_,datasource_:"General Data"]:=Module[{signs=(1/2)(Sign[Rest[data]-Most[data]]+1),n=Length[data],crit,totalofsigns},
totalofsigns=Total[signs];
(* standardized statistic: *)
crit=Abs[(Sqrt[(12/(n+1))])(totalofsigns-(1./2)(n-1))];
Text@Grid[{{"Data   ",ToString[datasource]},
{"No. of observations   ",n},{"Total number of sign differences   ",totalofsigns},{"Standardized statistic   ",crit},{"Two-sided p-value  ",TwoSidedPValue/.NormalPValue[crit,TwoSided->True]}},Frame->{False,All},Alignment->Left]
	]

Example (Random Sequence)

(* Intentionally no RandomSeed here *)
differencesTestAsymptotic[RandomVariate[UniformDistribution[],1000]]
(* Just the p-value: *)
Cases[%,_?NumberQ,Infinity]//Last

Vysvětlení následujícího postupu:

With[{test=differencesTestAsymptotic[RandomVariate[UniformDistribution[],1000]]},
Cases[test,_?NumberQ,Infinity]//Last]

Následně generujeme tabulku 1000 p - hodnot  testů z tisíce výběrů rozsahu 1000. Interpretace hladiny testu α: platí-li nulová hypotéza a provedeme-li 1000 testů, pak by hypotéza měla být zamítnuta zhruba v 1000α případech; zamítnutí hypotézy je ekvivalentní tomu, že p-hodnota<α. Vyzkoušíme na hladiny 0.05 a 0.01. Zamítnutí by tedy mělo být přibližně v 50 resp. 10 případech.

tab1000=Table[With[{test=differencesTestAsymptotic[RandomVariate[UniformDistribution[],1000]]},
Cases[test,_?NumberQ,Infinity]//Last],1000];
{Select[tab1000,#<0.05&]//Length,Select[tab1000,#<0.01&]//Length}

Real Data: Standard & Poor’s 500, Coke, Coca-Cola, VW, Apple

Budeme zkoumat denní výnosy pěti aktiv za 1 rok.

Text@Row@{"Sledované období od ",startDate=(Today//Normal)[[1;;3]]-{1,0,0}," do ",endDate=(Today//Normal)[[1;;3]]}
companies={"SP500","Coke","KO","F:VOW","AAPL"};
Text@Row@{"Aktuální datum  ",DateObject[]}
Text@Grid[Prepend[ Map[{#,FinancialData[#,"Company"],FinancialData[#]}&,companies],{"Ticker","Name","Actual Price"}],Frame->All]

DateObject[]
returnsDailyValues=Map[FinancialData[#,"Return",{startDate,endDate},"Value"]&,companies];

returnsAssociation=Association[Thread[companies->returnsDailyValues]];
Keys[returnsAssociation]
(* Počty obchodních dnů pro studované tituly *)
Map[Length,Values[returnsAssociation]]

Correlation matrix of the returns (VW excluded since the correlation matrix may be computed from the vectors of the equal length).

returnsAssociationWithoutVW=KeyDrop[returnsAssociation,"F:VOW"];
Correlation[returnsAssociationWithoutVW//Values//Transpose]//TableForm

differencesTestAsymptotic[returnsAssociation//Values//First,returnsAssociation//Keys//First]

Map[differencesTestAsymptotic[#//First,#//Last]&,{returnsAssociation//Values,returnsAssociation//Keys}//Transpose]

Závěry z 4. ledna 2016: U SP500 na základě testu podle znamének diferencí zamítáme hypotézu nezávislosti na 5% (ale už ne na 1%), u Apple na 10% (ale už ne na 5%). U zbylých společností na základě tohoto testu nemůžeme hypotézu nezávislosti zamítnout.

Závěry z 2. ledna 2017: Na základě testu znamének diferencí nemůžeme hypotézu nezávislosti zamítnout u žádné z uvedených společností.

Test of local extremes (test extremálních hodnot, body zvratu)

Note that this test is equivalent to the test of sequences and reversals (see [2]). The test statistic is the total number of local extremes (both maximum and minimum) in the data:

Preliminaries

Despite the results are well known, we show how to use built-in TransformedDistribution X-> Y for to derive the exact probabilities. For the sake of simplicity we first consider the sequence of length 5 which is the minimum length for valid considerations.

Clear[X,XX,Y,YY];
XX=Table[X[i],{i,5}];
YY=Table[Y[i]=Boole[Or[X[i]<X[i+1]>X[i+2],X[i]>X[i+1]<X[i+2]]],{i,3}]

Zde Y[i] je indikátor lokálního extrému: Y[i]=1 jestliže X[i+1] je větší nebo menší než okolní hodnoty X[i],X[i+2]. Dále sice uvádíme mechanický postup pro ilustraci zabudovaných funkcí, ale je možné také vyjít z následující úvahy: Všech možných uspořádání trojice (různých) čísel je 3!,=6. V kolika případech je prostřední číslo větší resp. menší než sousedi? Atd.

Testová statistika je celkový počet lokálních extrémů v posloupnosti

P=(Underoverscript[∑ , ( i=1), (n-2)])(Subscript[Y, i]).

Je zřejmé, že (Subscript[Y, 1]),(Subscript[Y, 2]),... je posloupnost 2- závislých veličin.  Pro střední hodnotu P platí E,P=(n-2)E,(Subscript[Y, 1]) a pro rozptyl tedy s uvážením cov((Subscript[Y, 1]),(Subscript[Y, j]))=0 pro j≥4 platí,

var P=(∑_(j=1)^(n-2))var (Subscript[Y, j])+(∑_(j=1)^(n-2))(∑_(k=1,j≠k)^(n-2)) cov ((Subscript[Y, j]),(Subscript[Y, k]))=
(n-2)var (Subscript[Y, 1])+2(n-3)cov ((Subscript[Y, 1]),(Subscript[Y, 2]))+2(n-4)cov ((Subscript[Y, 1]),(Subscript[Y, 3])).

Pro jednoduchost se opět omezíme na rozdělení R(0,1). 𝒟cinque je sdružené rozdělení náhodného vektoru pěti iid R(0,1) složek. Pro úplnost uvádíme také číselné charakteristiky.

𝒟cinque=ProductDistribution[{UniformDistribution[],5}];
{Mean[𝒟cinque],Variance[𝒟cinque],Covariance[𝒟cinque]};

Sdružené rozdělení ((Subscript[Y, 1]),(Subscript[Y, 2]),(Subscript[Y, 3])):

𝒟extreme=TransformedDistribution[YY,XX\[Distributed]𝒟cinque];
{expextreme=Mean[𝒟extreme],Variance[𝒟extreme]}
(covextreme=Covariance[𝒟extreme])//MatrixForm

Clear[n]; (* n-2 summands *)
Text@Row@{"Mean of P:   ", (meanP=(n-2)expextreme[[1]])//TraditionalForm,"   Variance of P:   ",
(PvarP=((n-2) covextreme[[1,1]]+2(n-3) covextreme[[1,2]]+2(n-4) covextreme[[1,3]])//Simplify)//TraditionalForm}

So if P is the total number of local extremes in the sequence then

E,P=((2(n-2))/3)           var P=((16n-29)/90).

Here we apply the central limit theorem for finitely dependent r. v. again. Recall that the sequence of Boolean indicators is a sequence of 2-finitely dependent r. v.:

({{({{((P-E,P)/(Sqrt[var P]))(Overscript[⟶, 𝒟])}})N(0,1)}})

pro n ⟶ ∞, (konvergence je v distribuci).

The procedure

To identify local extremes we use Partition with the offset to create subsequent triples:

Clear[iX,iXX];
iXX=Table[iX[k],{k,10}]
Partition[iXX,3,1]//TableForm

Needs["HypothesisTesting`"];
Clear[localExtremesTestAsymptotic];localExtremesTestAsymptotic[data_,datasource_:"General Data"]:=Module[{triples,booleextreme,n=Length[data],crit,totalofextremes},
booleextreme[{x1_,x2_,x3_}]:=Boole[(x1<x2&&x2>x3)||(x1>x2&&x2<x3)];triples=Partition[data,3,1];
totalofextremes=Total[Map[booleextreme,triples]];
(* standardized statistic *)crit=Abs[(Sqrt[(90/(16n-29))])(totalofextremes-(2./3)(n-2))];
Text@Grid[{{"Data   ",ToString[datasource]},
{"No. of observations   ",n},{"Total number of local extremes   ",totalofextremes},{"Standardized statistic   ",crit},{"Two-sided p-value  ",TwoSidedPValue/.NormalPValue[crit,TwoSided->True]}},Frame->{False,All},Alignment->Left]
]

Example: Simulation

(* Intentionally no RandomSeed here *)
localExtremesTestAsymptotic[RandomVariate[UniformDistribution[],1000],"Random Sequence"]
(* Just the p-value: *)
Cases[%,_?NumberQ,Infinity]//Last

Example (Random Oscillating Sequence)

ListPlot[RandomSeed[13];
oscillatingSin=RandomVariate[UniformDistribution[],100]+10Sin[Range[100]],Joined->True,PlotTheme->"Detailed",PlotLabel->"Oscillating sequence"]
localExtremesTestAsymptotic[oscillatingSin,"Oscillating sequence"]

Conclusion: Obvious dependence. Note that the test of sign differences did not discover anything.

Real Data: Standard & Poor’s 500, Coke, Coca-Cola, VW, Apple

Budeme opět zkoumat denní výnosy pěti aktiv za 1 rok.

Map[localExtremesTestAsymptotic[#//First,#//Last]&,{returnsAssociation//Values,returnsAssociation//Keys}//Transpose]

Zde je na 5% významné jenom VW. Připomeňme závěry testu podle znamének diferencí :

U SP500 na základě testu podle znamének diferencí zamítáme hypotézu nezávislosti na 5% (ale už ne na 1%), u Apple na 10% (ale už ne na 5%). U zbylých společností na základě tohoto testu nemůžeme hypotézu nezávislosti zamítnout.

Už po provedení dvou testů náhodnosti je patrné, že jeden nebo dva testy nestačí. Podobně jako u generátorů náhodných čísel je i pro reálná data vhodné aplikovat baterii statistických testů zejména s ohledem na volbu vhodného modelu. Viz

**Baterie statistickych testu

Generatory nahodnych cisel se testuji baterii statistickych testu, z nichz nektere uvadime. Podrobnosti viz výše citované  HURT: Simulacni metody, jeste podrobneji KNUTH: The Art of Computer Programming. Viz take CIPRA: Financni ekonometrie a HURT (WTC 2012):

Hyperlink[Button["Statistical Inference from Financial Data with Mathematica"],"http://www.karlin.mff.cuni.cz/~hurt/WTC2012_Jan_Hurt_Statistical_Inference_Working_with_Reference2.nb"]

**Runs test

This test is based on iterations below and above some value like mean or median, more often called runs. If we have a series of the elements of two kinds, A and B, say, then by a run we mean a contiguous sequence of the elements of the same kind. For example in the sequence A,A,B,B,B,A,A,B,A there are runs A,A, B,B,B, A,A, B, A and the total number of runs is 5. Note that the original Wald-Wolfowitz runs test was designed as a test whether two samples are from the same population, see [4] e. g.

Here we consider runs below and above median. Suppose (Subscript[X, 1]),...,(Subscript[X, n]) is the series in question, M the sample median. If we delete possible zeros in the sequence

𝒮={sign((Subscript[X, 1])-M),...,sign((Subscript[X, n])-M) }

we get the sequence of ±1’s. Let Q be the total number of runs in this sequence, i. e., the total number of contiguous subsequences plus ones and minus ones, respectively.  Note that if n is odd and there are no ties in sequence 𝒮 then there is the same number m=(n-1)/2 of plus ones and minus ones in 𝒮. Analogously, if n is even, no ties, there is the same number m=n/2 of plus ones and minus ones in 𝒮.  In [5], p. 361 (e. g.) we find that the first two moments of the number of runs are

E,Q=m+1           var Q=((m(m-1))/(2m-1)).

Since the procedure below is designed for a more general case (not only the iterations below and above median), we distinguish between the number of positive signs (Subscript[n, 1]) and negative signs (Subscript[n, 2]) in 𝒮.

Needs["HypothesisTesting`"];
Clear[runsTestAsymptotic]; (* iterations below and above median *)
runsTestAsymptotic[data_,datasource_:"General Data"]:=
Module[{signs,splitting,numberofruns,n,n1,n2,rmean,rvariance,crit,median=Median[data]},
signs=Sign[data-median]//N;
splitting=Split[DeleteCases[signs,0.]];
numberofruns=Length[splitting]; (* total number of runs *)
n1=Count[signs,1.]; (* number of positive values *)
n2=Count[signs,-1.]; (* number of negative values *)
n=n1+n2;
rmean=((2 n1 n2)/(n1+n2))+1; rvariance=((2.n1 n2(2n1 n2 -n1-n2))/((((n1+n2))^2)(n1+n2-1)));
crit=Abs[((numberofruns-rmean)/(Sqrt[rvariance]))];
Text@Grid[{{"Data   ",ToString[datasource]},
{"No. of observations   ",Length[data]},{"Median   ",median},{"Number of runs   ",numberofruns},{"Expected   ",rmean},{"Standardized statistic   ",crit},{"Two-sided p-value  ",TwoSidedPValue/.NormalPValue[crit,TwoSided->True]}},Frame->{False,All},Alignment->Left]
]

Example: Simulation

(* Intentionally no RandomSeed here *)
runsTestAsymptotic[RandomVariate[UniformDistribution[],1000],"Random Sequence"]
(* Just the p-value: *)
Cases[%,_?NumberQ,Infinity]//Last

Example (Random Oscillating Sequence)

ListPlot[RandomSeed[13];
oscillatingSin=RandomVariate[UniformDistribution[],100]+10Sin[Range[100]],Joined->True,PlotTheme->"Detailed",PlotLabel->"Oscillating sequence"]
runsTestAsymptotic[oscillatingSin,"Oscillating sequence"]

Conclusion: Obvious dependence. Note that the test of sign differences did not discover anything.

Detailed calculation

median=Median[oscillatingSin]
(signs=Sign[oscillatingSin-median]//N)
splitting=Split[DeleteCases[signs,0.]]
numberofruns=Length[splitting] (* total number of runs *)
n1=Count[signs//N,1.] (* number of positive values *)
n2=Count[signs//N,-1.] (* number of negative values *)

Real Data: Standard & Poor’s 500, Coke, Coca-Cola, VW, Apple

Map[runsTestAsymptotic[#//First,#//Last]&,{returnsAssociation//Values,returnsAssociation//Keys}//Transpose]

Zde je na 5% významné jenom VW. Připomeňme závěry testu podle znamének diferencí :

U SP500 na základě testu podle znamének diferencí zamítáme hypotézu nezávislosti na 5% (ale už ne na 1%), u Apple na 10% (ale už ne na 5%). U zbylých společností na základě tohoto testu nemůžeme hypotézu nezávislosti zamítnout.

Už po provedení dvou testů náhodnosti je patrné, že jeden nebo dva testy nestačí. Podobně jako u generátorů náhodných čísel je i pro reálná data vhodné aplikovat baterii statistických testů zejména s ohledem na volbu vhodného modelu. Viz

Aplikace

Pokus: dokaze clovek generovat nahodne cislice?

Pokusná osoba se snaží na numerické klávesnici “náhodně” vytvářet posloupnost číslic 0,1,...,9. Požadovaným výstupem je posloupnost, která se chová jako náhodný výběr z diskrétního rovnoměrného rozdělení U(0,1,...,9).

EscscDEsc vytvori 𝒟

SeedRandom[152];
RandomSample[{sona,petr,jelena,petra,tobias},1]

𝒟unif=DiscreteUniformDistribution[{0,9}];
{Mean[𝒟unif],Median[𝒟unif],StandardDeviation[𝒟unif]}//N

SeedRandom[1313131];
Sort[Tally[unif=RandomVariate[𝒟unif,315]],#1[[2]]<#2[[2]]&]
SeedRandom[1313];
Sort[Map[Reverse,Tally[unif=RandomVariate[𝒟unif,315]]]]
(* DistributionFitTest viz dale *)
ℋunif=DistributionFitTest[unif,DiscreteUniformDistribution[{0,9}],"HypothesisTestData"];
ℋunif["TestDataTable",All]

Histogram[unif]

petr=
;alena=;
vera=;
michal=;
martin=;
honza=;

michal5=IntegerDigits[michal];
vera5=IntegerDigits[vera];
alena5=IntegerDigits[alena];
martin5=IntegerDigits[martin];
honza5=IntegerDigits[honza];
petr5=IntegerDigits[petr];
{Length[michal5],Length[honza5]}

Clear[datareport];
datareport[data_,noclass___]:=Module[{mi=Min[data],ma=Max[data],bin,h,k,le,mea,med,se},
k=If[noclass===Null,10,noclass];
bin=BinCounts[data,{mi,ma,h=((ma-mi)/k)}];Print["No. = ",le=Length[data],"\nMin = ",mi," Max = ",ma,"\nMean= ",mea=Mean[data]//N," Median = ",med=Median[data]//N,"\nSE = ",se=StandardDeviation[data]//N," VaR 5% = ",Quantile[data,0.05`]," VaR 1% = ",Quantile[data,0.01`]];Histogram[data,k]]

𝒟unif=DiscreteUniformDistribution[{0,9}];
{Mean[𝒟unif],Median[𝒟unif],StandardDeviation[𝒟unif]}//N

datareport[petr5,10]
(* Vsimnete si rozdilu mezi //N a bez numericke hodnoty! *)

Test dobre shody (test of goodness of fit)

ℋmichal=DistributionFitTest[michal5,DiscreteUniformDistribution[{0,9}],"HypothesisTestData"];ℋvera=DistributionFitTest[vera5,DiscreteUniformDistribution[{0,9}],"HypothesisTestData"];
ℋalena=DistributionFitTest[alena5,DiscreteUniformDistribution[{0,9}],"HypothesisTestData"];
ℋmartin=DistributionFitTest[martin5,DiscreteUniformDistribution[{0,9}],"HypothesisTestData"];
ℋhonza=DistributionFitTest[honza5,DiscreteUniformDistribution[{0,9}],"HypothesisTestData"];
ℋpetr=DistributionFitTest[petr5,DiscreteUniformDistribution[{0,9}],"HypothesisTestData"];

ℋpetr["Properties"]

ℋmichal["TestDataTable",All]
ℋvera["TestDataTable",All]
ℋalena["TestDataTable",All]
ℋmartin["TestDataTable",All]
ℋhonza["TestDataTable",All]
ℋpetr["TestDataTable",All]

differencesTestAsymptotic[petr5,"Petr"]

localExtremesTestAsymptotic[petr5,"Petr"]

runsTestAsymptotic[petr5,"Petr"]

**Nalezeni vhodneho rozdeleni (ideově automatické vyhledávání vhodného rozdělení není zcela v pořádku)

Zabudovaná funkce

FindDistribution[petr5]

(* distributions={NormalDistribution[μ,σ],ChiSquareDistribution[n],FRatioDistribution[n,m]} *)
SeedRandom[1313];
distributions={Automatic,NormalDistribution[μ,σ],ExponentialDistribution[λ]};
datagener=RandomVariate[ChiSquareDistribution[300],{10000}];
Histogram[datagener]
dft=Map[DistributionFitTest[datagener,#,"HypothesisTestData"]&,distributions];
Map[#["TestDataTable",All]&,dft]

Testovani nahodnosti (korelogram)

?*Distribution

Uvodni priklad (spojite rovnomerne rozdeleni)

Nechť (Subscript[X, 1]), (Subscript[X, 2]), (Subscript[X, 3]) jsou nezávislé stejně rozdělené náhodné veličiny (iid, independent identically distributed random variables) s rovnoměrným rozdělením R(0,1). Spočítáme psti P((Subscript[X, 1])<(Subscript[X, 2])), P((Subscript[X, 1])<(Subscript[X, 2])<(Subscript[X, 3])), P((Subscript[X, 1])<(Subscript[X, 2])>(Subscript[X, 3])) a P((Subscript[X, 1])<(Subscript[X, 2])>(Subscript[X, 3])∨(Subscript[X, 1])>(Subscript[X, 2])<(Subscript[X, 3])):

{Integrate[Boole[x1<x2],{x1,0,1},{x2,0,1}],
Integrate[Boole[x1<x2<x3],{x1,0,1},{x2,0,1},{x3,0,1}],Integrate[Boole[x1<x2>x3],{x1,0,1},{x2,0,1},{x3,0,1}],Integrate[Boole[x1<x2>x3∨x1>x2<x3],{x1,0,1},{x2,0,1},{x3,0,1}]}

Alternativne

𝒟3independentUniformContinuous=ProductDistribution[{UniformDistribution[{0,1}],3}];

{Probability[x<y,{x,y,z}\[Distributed]𝒟3independentUniformContinuous],Probability[x<y<z,{x,y,z}\[Distributed]𝒟3independentUniformContinuous],Probability[x<y>z,{x,y,z}\[Distributed]𝒟3independentUniformContinuous],Probability[x<y>z∨x>y<z,{x,y,z}\[Distributed]𝒟3independentUniformContinuous]}

Neplatí jenom pro rovnoměrné rozdělení, ale pro libovolné spojité rozdělení, které má rostoucí distribuční funkci na svém nosiči.

*Uvodni priklad (diskretni rovnomerne rozdeleni)

Clear[𝒟5independentUniformDiscrete];
(* Sdruzene rozdeleni 5 nezavislych stejne rozdelenych nahodnych velicin s diskretnim rovnomernym rozdelenim na {0,m} *)
𝒟5independentUniformDiscrete[m_]:=
ProductDistribution[{DiscreteUniformDistribution[{0,m}],5}];

Clear[XX];
XX=Table[X[i],{i,5}];
{Probability[X[1]<X[2],XX\[Distributed]𝒟5independentUniformDiscrete[m]],Probability[X[1]<X[2]<X[3],XX\[Distributed]𝒟5independentUniformDiscrete[m]],Probability[(X[1]<X[2]>X[3]||X[1]>X[2]<X[3]),XX\[Distributed]𝒟5independentUniformDiscrete[m]]}//Simplify[#,Assumptions->m>2]&
(* Pro spojite rozdeleni *)Limit[%,m->∞]

Příklad (kámen, papír, nůžky)

Hyperlink[Button["Kámen, papír, nůžky"],"http://demonstrations.wolfram.com/RockPaperScissorsWithAIPlayer/"]

Nelineární regrese a výnosové křivky

Pozor na terminologii (dva podstatně se lišící problémy):

Fitting = vyrovnání: Úloha najít křivku, která se na základě nějakého kritéria (typicky principu nejmenších čtverců) co “nejlépe” přibližuje pozorovaným hodnotám. Obvyklé a vhodné při řešení statistických problémů. Nepoužívejte českých paskvilů “fitovat”, “nafitovat”, apod.

Interpolation = interpolace: Úloha najít křivku, která prochází pozorovanými hodnotami. Umožňuje jednoduchý výpočet funkčních hodnot ve všech mezilehlých bodech. Bez dalších specifikací má tato úloha nekonečně mnoho řešení. Nutné stanovit vhodné kritérium. Oblíbená polynomiální interpolace vede při řešení úloh finanční a pojistné matematiky ke katastrofálním výsledkům. V těchto oblastech často velmi dobré výsledky poskytují metody založené na interpolaci pomocí splinů (“splajnů”). Interpolace je obvyklá a vhodná při řešení numerických problémů.

There is a number of parametric models used for the either fitting or interpolation of empirical data coming from markets. We will deal with just two of them which, under the author's opinion are most vital.

Příklad (reálný)

Reálná data ir3, dvojice ve tvaru {splatnost ve dnech, úrokova míra}:

Data odrážejí situaci, kdy subjekt (může být i pojišťovna, banka) potřebuje hotovost (likviditu) poměrně rychle a je tedy dán na pospas věřiteli. Věřitel přirozeně využívá  (zneužívá?) tísně potřebného subjektu. Zde se začíná na splatnosti 7 dnů, jak je možné asi tušit by to bylo horší při půjčce na jeden den (O/N, Over Night). (“Overnight (O/N) interest rates constitute the short end of the yield curve.”). Pro delší doby splatnosti úroková míra nejprve klesá a poté s přibývajícími riziky přirozeně roste, ale zůstává konkávní.

If r(t) is a spot rate and f(t) a forward rate then r(t) is the integral mean of the forward:

({{({{r(t)=(1/t)(∫_0^t)f(τ)dτ.}})}})

plot3=ListPlot[(ir3={{7,4.74},{14,4.72833333333333},{30,4.705},{60,4.595},{90,4.53},{180,4.42},{270,4.415},{360,4.41},{730,4.51},{1095,4.68},{1460,4.85},{1825,4.99},{2190,5.09},{2555,5.19},{2920,5.27},{3285,5.33},{3650,5.38`},{4015,5.42},{4380,5.46},{4745,5.48666666666667},{5110,5.51333333333333},{5475,5.54}}),PlotTheme->"Business", PlotStyle->{Red,PointSize[0.01]}]

Nelson-Siegel

Clear[nelsonsiegelspot]; (* Spot curve or zero-coupon *)
nelsonsiegelspot[b0_,b1_,b2_,c_,t_]:=b0+(((b1+b2) (1-(E^(-(t/c)))))/(t/c))-b2 (E^(-(t/c)))

The parameters have the following meaning: the function starts at level b0+b1 at time 0 and has asymptote at level b0; a local extreme is determined by parameter c.

Clear[t];
Limit[nelsonsiegelspot[b0,b1,b2,c,t],t->0]
Limit[nelsonsiegelspot[b0,b1,b2,c,t],t->∞,Assumptions->{b0>0∧b1>0∧b2>0∧c>0}]

Manipulating spot:

Manipulate[Plot[nelsonsiegelspot[b0,b1,b2,c,t],{t,0,10000},PlotRange->{{0,10000},{3,6}},AxesOrigin->{0,3},PlotStyle->Thick],
{{b0,5.8,"b0"},5,6,0.1,Appearance->"Labeled"},
{{b1,-0.4,"b1"},2,-1.5,0.1,Appearance->"Labeled"},
{{b2,-3,"b2"},-5,-1,0.2,Appearance->"Labeled"},
{{c,400,"c"},100,1000,10,Appearance->"Labeled"},SaveDefinitions->True
]

(* Forward curve *)
Clear[nelsonsiegelforward];
nelsonsiegelforward[b0_,b1_,b2_,c_,t_]:=b0+b1 (E^(-t/c))+b2 (t/c) (E^(-t/c))
Clear[nelsonsiegelforwardcalculated];
nelsonsiegelforwardcalculated[b0_,b1_,b2_,c_,t_]=nelsonsiegelspot[b0,b1,b2,c,t]+t D[nelsonsiegelspot[b0,b1,b2,c,t],t]//Simplify

Manipulating forward:

Manipulate[Plot[nelsonsiegelforward[b0,b1,b2,c,t],{t,0,10000},PlotRange->{{0,10000},{3,6}},AxesOrigin->{0,3},PlotStyle->{Orange,Thick}],
{{b0,5.8,"b0"},5,6,0.1,Appearance->"Labeled"},
{{b1,-1,"b1"},2,-1.5,0.1,Appearance->"Labeled"},
{{b2,-3,"b2"},-5,-1,0.2,Appearance->"Labeled"},
{{c,400,"c"},100,1000,10,Appearance->"Labeled"},SaveDefinitions->True]

Fitting Nelson-Siegel: on the graph, estimated spot is blue and estimated forward is orange.

fitnelsonsiegel3= FindFit[ir3,nelsonsiegelspot[b0,b1,b2,c,t],{b0,b1,b2,c},t]
curvenel3=nelsonsiegelspot[b0,b1,b2,c,t]/.fitnelsonsiegel3;
curvenelfc3[t_]:=nelsonsiegelspot[b0,b1,b2,c,t]/.fitnelsonsiegel3;
curvenel3forward=nelsonsiegelforward[b0,b1,b2,c,t]/.fitnelsonsiegel3;
Show[plot3,Plot[curvenel3forward,{t,0,10000},PlotRange->All,PlotStyle->Orange],Plot[curvenel3,{t,0,10000},PlotRange->All],PlotRange->All]

ir3={{7,4.74},{14,4.72833333333333},{30,4.705},{60,4.595},{90,4.53},{180,4.42},{270,4.415},{360,4.41},{730,4.51},{1095,4.68},{1460,4.85},{1825,4.99},{2190,5.09},{2555,5.19},{2920,5.27},{3285,5.33},{3650,5.38`},{4015,5.42},{4380,5.46},{4745,5.48666666666667},{5110,5.51333333333333},{5475,5.54}};
plot3=ListPlot[ir3,PlotTheme->"Business",PlotStyle->{Red,PointSize[0.01]}]

Swensson

By adding two more parameters in Nelson-Siegel model we get Swensson model. Note that possibly two extremes are determined by parameters c1 and c2.

Clear[swenssonforward];
swenssonforward[b0_,b1_,b2_,b3_,c1_,c2_,t_]:=b0+b1 (E^(-t/c1))+b2 (t/c1) (E^(-t/c1))+b3 (t/c2)(E^(-t/c2))

Spotová úroková míra je integrální průměr forwardové úrokové míry. V definici je důležité okamžité přiřazení, integrace chvíli trvá (>1sec) a při grafickém znázornění by byla časová ztráta nezanedbatelná.

Clear[swenssonspot];
swenssonspot[b0_,b1_,b2_,b3_,c1_,c2_,t_]=(1/t)(∫_0^t)swenssonforward[b0,b1,b2,b3,c1,c2,τ]\[DifferentialD]τ//Simplify

Limit[swenssonspot[b0,b1,b2,b3,c1,c2,t],t->0,Assumptions->{b0>0&&b1>0&&b2>0&&b3>0&&c1>0&&c2>0}]
Limit[swenssonspot[b0,b1,b2,b3,c1,c2,t],t->∞,Assumptions->{b0>0&&b1>0&&b2>0&&b3>0&&c1>0&&c2>0}]

Manipulate[Plot[swenssonspot[b0,b1,b2,b3,c1,c2,t],{t,0,5000},PlotRange->{{0,5000},{3,6}},AxesOrigin->{0,3},PlotStyle->Thick],
{{b0,5.8,"b0"},5,6,0.1,Appearance->"Labeled"},
{{b1,-1,"b1"},2,-1.5,0.1,Appearance->"Labeled"},
{{b2,-3,"b2"},-5,-1,0.2,Appearance->"Labeled"},
{{b3,-3,"b3"},-5,-1,0.2,Appearance->"Labeled"},
{{c1,200,"c1"},100,1000,10,Appearance->"Labeled"},
{{c2,5000,"c2"},100,10000,10,Appearance->"Labeled"},SaveDefinitions->True]

Manipulate[Plot[swenssonforward[b0,b1,b2,b3,c1,c2,t],{t,0,5000},PlotRange->{{0,5000},{3,6}},AxesOrigin->{0,3},PlotStyle->{Orange,Thick}],
{{b0,5.8,"b0"},5,6,0.1},
{{b1,-1,"b1"},2,-1.5,0.1},
{{b2,-3,"b2"},-5,-1,0.2},
{{b3,-3,"b3"},-5,-1,0.2},
{{c1,200,"c1"},100,1000,10},
{{c2,5000,"c2"},100,10000,10},SaveDefinitions->True]

fitswensson3= FindFit[ir3,swenssonspot[b0,b1,b2,b3,c1,c2,t],{b0,b1,b2,b3,c1,c2},t]
(curveswe3=swenssonspot[b0,b1,b2,b3,c1,c2,t]/.fitswensson3)//Simplify;
curveswefc3[t_]:=swenssonspot[b0,b1,b2,b3,c1,c2,t]/.fitswensson3
(curveswe3forward=swenssonforward[b0,b1,b2,b3,c1,c2,t]/.fitswensson3)//Simplify;
Show[plot3,Plot[curveswe3,{t,0,10000},PlotRange->All,PlotStyle->Thick],Plot[curveswe3forward,{t,0,10000},PlotRange->All,PlotStyle->{Orange,Thick}],PlotRange->All]

***Interpolation by polynomials

***Polynomials of degree n-1

Stupid but sometimes observable method: for data size n, use polynomial of the degree n-1. Since the maximum allowed order for interpolation is 21 we use it for the demonstration of the catastrophic behaviour of the interpolated function

intpol3=Interpolation[ir3,InterpolationOrder->Min[Length[ir3],21]];
plotpol3=Plot[intpol3[t],{t,Min[First[ir3][[1]]],Max[Last[ir3][[1]]]},PlotRange->All];
Show[plot3,plotpol3,PlotRange->All]

Manipulate[intpol3=Interpolation[ir3,InterpolationOrder->order];
Show[plotpol3=Plot[intpol3[t],{t,Min[First[ir3][[1]]],Max[Last[ir3][[1]]]},PlotRange->All],plot3,PlotRange->All],
{{order,4,"order"},1,21,1},SaveDefinitions->True]

Hodnocení opcí a futures

Evropské a americké opce (vanilla options)

r ... bezriziková úr. míra (nekdy značena  (Subscript[r, 0]))
(Subscript[S, t]) ... cena podkladového aktiva (akcie) v čase t
(Subscript[c, t]) resp. (Subscript[p, t]) ... cena evropské CALL resp. PUT opce
K ... realizační cena (strike)
T ... čas vypršení evropské opce (expiry)

Výplatní funkce (payoff function) evropské opce

v okamžiku vypršení

CALL: (SuperPlus[((Subscript[S, T])-K)])

PUT: (SuperPlus[(K-(Subscript[S, T]))])

PUT - CALL parita (platí pouze pro evropské opce!)

({{({{(Subscript[S, t])+(Subscript[p, t])=(Subscript[c, t])+K,(e^(-r(T-t)))}})}})

Mnemotechnická pomůcka pro zapamatování: státní podnik = císařsko-královské

Důkaz: viz též [1], str. 54. Uvažujme portfolio +PUT +akcie -CALL, vše na stejnou akcii, opce evropské se stejnou dobou vypršení. Hodnota portfolia v čase t≤T je

({{(Subscript[Π, t])=(Subscript[S, t])+(Subscript[p, t])-(Subscript[c, t]).}})

V čase vypršení T je hodnota tohoto portfolia

({{({{(Subscript[Π, T])=(Subscript[S, T])+(SuperPlus[(K-(Subscript[S, T]))])-(SuperPlus[((Subscript[S, T])-K)]).}})}})

V případě (Subscript[S, T])≤K je (Subscript[Π, T])=(Subscript[S, T])+K-(Subscript[S, T])-0=K, v případě (Subscript[S, T])>K je (Subscript[Π, T])=(Subscript[S, T])+0-((Subscript[S, T])-K)=K. To znamená, že portfolio je bezrizikové vedoucí k jistému zisku K. Budoucí hodnota je  (Subscript[Π, T])=K  a současná hodnota je tedy (Subscript[Π, t])=K,(e^(-r(T-t))).

Současná hodnota výplatní funkce (payoff function) evropské opce v čase t≤T

CALL: (SuperPlus[(e^(-r(T-t)))((Subscript[S, T])-K)])

PUT: (SuperPlus[(e^(-r(T-t)))(K-(Subscript[S, T]))])

Black-Scholesův vzorec

Risk Neutral Valuation

We assume that the stochastic process of the prices of an asset  (Subscript[{(Subscript[S, t])}, t≥0]) is goverened by a geometrical Brownian motion, hence

({{({{ℒ((Subscript[S, T])|(Subscript[S, t]))=L,N(ln (Subscript[S, t])+(μ-(1/2)(σ^2))(T-t),(σ^2)(T-t))}})}})

where μ is the rate of return on the underlying asset and σ its volatility.

Rizikově neutrální hodnocení: Investoři se chovají racionálně, čím větší riziko (volatilita), tím vyšší očekávaný výnos požadují. Čím vyšší averze k riziku, tím vyšší očekávaný výnos je požadován. Vyloučením rizikových preferencí dojdou investoři ke shodě na jediném rizikově neutrálním výnosu μ=r. Pozor, v žádném případě to neznamená, že by výnos podkladového aktiva byl roven r !!!

Alternativní princip vedoucí k témuž závěru: Očekávaný výnos z držení akcie v hodnotě (Subscript[S, t])  v období (t,T) by měl být stejný jako bezrizikový výnos z investice  ve výši (Subscript[S, t])  při úrokové míře r:

({{({{(SuperStar[E])((Subscript[S, T])|(Subscript[S, t]))=FV((Subscript[S, t]),r)=(Subscript[S, t])(e^(r(T-t)))}}).}})

Hvězdičkou zde i v dalším značíme skutečnost, že za výnos bereme rizikově-neutrální výnos r.

Neuvažujeme-li žádné rizikové preference investorů, je

({{({{(SuperStar[ℒ])((Subscript[S, T])|(Subscript[S, t]))=L,N(ln (Subscript[S, t])+(r-(1/2)(σ^2))(T-t),(σ^2)(T-t))}}).}})

Then

({{({{(SuperStar[E])((Subscript[S, T])|(Subscript[S, t]))=}})}})

Mean[LogNormalDistribution[Log[(Subscript[S, t])]+(r-(1/2)(σ^2))(T-t),σ(Sqrt[T-t])]]//Simplify//TraditionalForm

Similarly for the variance:

({{({{(SuperStar[var])((Subscript[S, T])|(Subscript[S, t]))=}})}})

Variance[LogNormalDistribution[Log[(Subscript[S, t])]+(r-(1/2)(σ^2))(T-t),σ(Sqrt[T-t])]]//Simplify//TraditionalForm

See [1], pp. 55-56.

Hodnota (cena) evropské opce

Jako přirozené se jeví vzít za hodnotu evropské opce v čase t podmíněnou střední hodnotu současné hodnoty výplatní funkce při dané hodnotě podkladového aktiva (Subscript[S, t]) při čemž střední hodnota je uvažovaná při bezrizikové (tj. rizikově neutrální) úrokové míře r:

({{({{(Subscript[c, t])=(e^(-r(T-t)))(SuperStar[E])((SuperPlus[((Subscript[S, T])-K)])|(Subscript[S, t]))}, {(Subscript[p, t])=(e^(-r(T-t)))(SuperPlus[(SuperStar[E])(K-(Subscript[S, T]))])|(Subscript[S, t]))}})}})

(* 80 sec!!! *)ct=(E^(-r(T-t)))Expectation[Max[0,((Subscript[S, T])-K)],(Subscript[S, T])\[Distributed]LogNormalDistribution[Log[(Subscript[S, t])]+(r-(1/2)(σ^2))(T-t),σ(Sqrt[T-t])]]

ct[[2,2]]//FullSimplify

Tuto formuli lze převést do běžně uváděného tvaru (Black-Scholes formula)

({{({{(Subscript[c, t])=(Subscript[S, t])Φ((Subscript[d, 1]))-K (e^(-r(T-t)))Φ((Subscript[d, 2])),
(Subscript[d, 1,2])=((log((Subscript[S, t])/K)+(r±(σ^2)/2)(T-t))/(σ(Sqrt[T-t]))).}})}})

Hodnota PUT opce se získá z PUT - CALL parity: ({{({{(Subscript[p, t])=(Subscript[c, t])+K,(e^(-r(T-t)))}})-(Subscript[S, t]).}})

Poznámka (opce na akcie vyplácející dividendu)

Vyplácí-li akcie dividendu s dividendovou intenzitou d, pak se v předchozím vzorci nahradí r→r-d. Vyplácením dividendy se snižuje hodnota firmy a tudíž i kapitálový výnos.

Citlivosti (Comparative Statics, The Greeks)

Statics je sice vžitý, ale asi chybně použitý termín nevystihující podstatu.

Nechť (Subscript[V, t]) označuje hodnotu CALL resp. PUT opce, (Subscript[V, t])=(Subscript[c, t]) resp. (Subscript[V, t])=(Subscript[p, t]). Z Black-Scholesova vzorce je patrné, že (Subscript[V, t]) je funkcí pěti proměnných (parametrů):

({{({{(Subscript[V, t])=(Subscript[V, t])((Subscript[S, t]),K,σ,T-t,r)}}).}})

Derivace podle jednotlivých proměnných se nazývají citlivosti a protože se označují řeckými písmeny, jsou též známé jako “The Greeks”. Jejich výpočet je přímočarý, ale v některých případech technicky dosti komplikovaný. Uvedeme jen jednu míru citlivosti delta, derivaci podle aktuální ceny akcie:

({{({{Δ=((∂(Subscript[V, t]))/(∂(Subscript[S, t])))}}).}})

Pro CALL resp. PUT dostaneme

({{({{(Subscript[Δ, c])=Φ((Subscript[d, 1]))   resp.   (Subscript[Δ, p])=(Subscript[Δ, c])-1=-Φ(}})-(Subscript[d, 1])).}})

Charakteristiky Δ se používá k tzv. delta-zajišťování, delta hedging. Uvažujme portfolio skládající se z dlouhé pozice jedné akcie a krátké pozice v A kusech CALL opcí na tutéž akcii. Hodnota portfolia je tedy (Subscript[Π, t])=(Subscript[S, t])-A,(Subscript[c, t]). Chceme najít A takové, aby hodnota portfolia byla invariantní vůči (malým) změnám ceny akcie, tj.

({{({{((∂,(Subscript[Π, t]))/(∂(Subscript[S, t])))}})=0.}})

Hledané A=1/(Subscript[Δ, c]), nazývané zajišťovací poměr, hedge ratio. Vzhledem k tomu, že se delta mění v čase, musí se portfolio často měnit → dynamické zajišťování, dynamic hedge. To může být nákladné kvůli transakčním nákladům. Tudíž vhodné pro makléře a tvůrce trhu, kteří mají relativně nízké transakční náklady. Všimněme si, že čím nižší (Subscript[S, t]) ve srovnání s K, tím vyšší je zajišťovací poměr. Podobnou mírou citlivosti je elasticita ceny CALL opce vzhledem k ceně akcie definovaná jako (Subscript[E, c])=(Subscript[Δ, c])(Subscript[S, t])/(Subscript[c, t]). Vždy je (Subscript[E, c])>1. (Dokažte za cvičení.) Proto je CALL opce vždy riskantnější než její podkladové aktivum. Analogie k Δ je durace.

**Další míry citlivosti viz [1], str. 60-61.

Implied Volatility (Implikovaná volatilita)

Ve výše uvedeném vzorci pro (Subscript[V, t]) v okamžiku t vždy známe hodnoty (Subscript[S, t]),K,T-t,r. Při aplikaci Black-Scholesova vzorce pro neznámou volatilitu obvykle použijeme výběrovou směrodatnou odchylku z historických (známých) dat logaritmických výnosů ln((Subscript[S, t+1])/(Subscript[S, t])) pro nějaké rozumné historické hodnoty. Sofistikovanější metody jsou založené na modelech volatility typu ARCH, GARCH, jejich zobecněních a modifikacích. Viz zabudované funkce (nezahrnují zdaleka všechny dnes používané modely):

?*ARCH*

?*AR*

Můžeme ale též přistoupit k odhadu volatility jiným způsobem. V daném časovém okamžiku t, (teď, hodnotící časový okamžik), známe nejenom  hodnoty (Subscript[S, t]),K,T-t,r, ale i tržní hodnotu opce (Subscript[V, t]^M). Po substituci známých hodnot do Black-Scholesovy formule dostaneme rovnici pro neznámou σ:

({{(Subscript[V, t]^M)=({{(Subscript[V, t])((Subscript[S, t]),K,σ,T-t,r)}}).}})

Tato rovnice nemusí mít žádné řešení (řešení je nutné hledat numericky), může mít právě jedno (nejpříjemnější situace, i když i tam můžeme býti překvapeni) nebo více řešení - z těch je pak zapotřebí citlivě vybírat.

Důležité! Volatilita a implikovaná volatilita viz [1], str. 61-62.

Portfolia opcí

Příklad v [1], str. 62-63.

SetDirectory[NotebookDirectory[]];

Import["FM1aPortfolia_opci.jpg"]

With[{K=50,B=70},Plot[Max[0,S-K]-Max[0,S-K-B],{S,0,200},PlotTheme->"Business"]]

Forwardy a futures

Na rozdíl od opcí je smlouva mezi stranami závazná. Forwardy jsou individuálně uzavírané kontrakty o budoucím vypořádání, futures standardizované).

4.3.2 Termínové obchody: Forwardy a futures

Připomeňme nejprve mechanismus fungování opcí. U nich investor (držitel, kupující) v dlouhé pozici má právo, nikoli povinnost své právo zakotvené v opční smlouvě uplatnit. To znamená,že podkladové aktivum (underlying) může buď koupit (v případě CALL opce) nebo prodat (v případě PUT opce). Prodávající (pisatel) pak trpně čeká, jak se vyvíjí tržní situace, a jestli držitel své právo uplatní. Ten tak ovšem učiní v případě, že uplatněním opce dosáhne zisku nebo alespoň bude minimalizovat ztrátu vzniklou náklady na pořízení opce.

U kontraktů typu forward a futures není možná volba jako u opcí. Pro obě strany je smlouva závazná, tudíž tady v okamžiku uzavření kontraktu neexistuje cena kontraktu v pravém slova smyslu. Forwardový kontrakt je termínový obchod, smlouva mezi dvěma partnery (řekněme A a B), ve kterém se strana kupující A (v dlouhé pozici) zavazuje koupit od strany prodávající B (v krátké pozici) určitou komoditu v určeném množství za určitou cenu F fixovanou v okamžiku uzavření kontraktu v určitém budoucím termínu T (dodání, delivery). Vše je závazně domluveno dnes, dejme tomu v okamžiku  t = 0, a vlastní transakce proběhne ve sjednaném termínu v budoucnosti T, t<T. Obě strany jsou povinné své závazky splnit. Předpokládejme dále, že aktuální cena podkladového aktiva v okamžiku uzavření kontraktu je (Subscript[S, 0]).

Pozice obou stran v kontraktu je symetrická. V okamžiku vypořádání zisk jedné strany jest roven ztrátě druhé strany. Jestliže  smluvená cena kontraktu v čase vypořádání T je F, pak strana A obdrží v okamžiku T částku (Subscript[S, T])-F a strana B přirozeně obdrží  F-(Subscript[S, T]). To, co se obvykle v teorii neuvažuje, jsou transakční náklady. Pro individuálně uzavřené kontrakty mohou být nezanedbatelné.

Tyto kontrakty mají minimálně tyto dvě funkce. První: ochrana (uhájení) ceny komodity, která je předmětem kontraktu. Druhá: transfer vlastnictví; fixováním ceny dnes (v čase t) je kupující chráněn (jištěn) proti případné vyšší ceně v okamžiku vypořádání kontraktu (tj. okamžité (spotové) ceně na trhu v okamžiku dodání). Prodávající je chráněn (jištěn) proti případné nižší promtní ceně v okamžiku vypořádaní kontraktu (tj. okamžité ceně na trhu v okamžiku dodání).

Obchodování s forwardy není prakticky regulováno, jsou to obchody individuální, takže riziko z nesplacení (default) je nezanedbatelné. V tomto případě se rizikem selhání myslí to, že strana v dlouhé pozici cukne, nebude chtít koupit nebo strana v krátké pozici odmítne prodat. Toto riziko je z velké části eliminováno standardizací. Není možné postihnout všechny individuální obchody a převést je ke globálnímu obchodování, nicméně je mnoho komodit (obilí, ropa, strategické kovy, měny, . . . ), které je možné dovést ke standardizovanému obchodování. Standardizované obchody tohoto typu se provádějí na specializované burze a nazývají se futures.

Futures: Z matematického hlediska jsou forwards a futures prakticky totožné. Proto se na hodnocení futures vztahují stejná kritéria jako na forwardy. Dále budeme mluvit o hodnocení forwardů.

Uvedeme některé přístupy k hodnocení forwardových kontraktů. Nejprve uveďme hodnocení na základě principu neexistence arbitráže. Jako dříve předpokládáme, že cena podkladového aktiva v čase t=0 je (Subscript[S, 0]) a z držení aktiva neplynou žádné závazky např. ve formě dividend. Dále uvažujeme bezrizikovou hodnotící úrokovou míru r.

Strana B, krátká v kontraktu, jest povinnou doručit (deliver) straně A částku (Subscript[S, T]) v okamžiku T. Strana B si vypůjčí částku (Subscript[S, 0]) v čase t=0 (čas uzavření kontraktu), koupí předmětné aktivum a v čase T obdrží F. Touto částkou (F) splatí půjčku, která v čase T je ve výši budoucí honoty (Subscript[S, 0])(e^(r,T)) , takže forwardová cena je

F=(Subscript[S, 0])(e^(r,T))

V okamžiku t=0 si strany nevyměňují žádné peníze, hodnota kontraktu je tudíž nulová.
V libovolném čase 0≤t≤T je však hodnota kontraktu

(Subscript[f, t])=(Subscript[S, t])-F,(e^(-r(,T-t)))

V takovém okamžiku může každá ze stran „uzamknout, lock” svou pozici tak, že uzavře pozici opačnou. Může tak fixovat zisk nebo ztrátu. Je-li (Subscript[S, t])<F,(e^(-r(T-t))), strana B si půjčí (Subscript[S, t]), koupí akcii, v okamžiku T splatí (Subscript[S, t])(e^(r(T-t))) a akcii prodá za F. Je-li naopak (Subscript[S, t])>F,(e^(-r(T-t))), strana A prodá akcii nakrátko, dostane za ni (Subscript[S, t]), tuto částku uloží a v okamžiku T vybere (Subscript[S, t])(e^(r(T-t)))>F. Koupí akcii za F a akcii vrátí.

4.3.9 Poznámka. (Ekvivalentní portfolio) Výplatní funkce forwardu v dlouhé pozici je (Subscript[S, T])-F. Dlouhá pozice ve forwardu je ekvivalentní v dlouhé evropské CALL a krátké pozici v evropské PUT, obě se stejnou dobou vypršení, stejnou realizační cenou K=F jako má forwardový kontrakt. Taková kombinace opcí má stejnou výplatní funkci jako forward, a tedy i v okamžiku uzavření kontraktu musí mít stejnou hodnotu. V čase t=0 (okamžik uzavření kontraktu) je však hodnota kontraktu nulová (nedochází k žádné výměně peněz), jinými slovy (Subscript[c, 0])-(Subscript[p, 0])=0. Ale z PUT-CALL parity (Subscript[c, 0])-(Subscript[p, 0])=(Subscript[S, 0])-F,(e^(-r,T)). Z toho tedy vyplývá vzorec pro F.

With[{K=50},GraphicsRow[{Plot[Max[0,S-K],{S,0,100},PlotStyle->{Thick,Red},PlotRange->{-50,50},PlotLabel->"CALL"],Plot[Max[0,K-S],{S,0,100},PlotStyle->{Thick,Orange},PlotRange->{-50,50},PlotLabel->"PUT"],Plot[Max[0,S-K]-Max[0,K-S],{S,0,100},PlotStyle->{Thick,Blue},PlotRange->{-50,50},PlotLabel->"Forward (CALL - PUT)"]}]]

4.3.10 Poznámka. (Hodnocení pomocí Black–Scholesovy formule) Při rizikově neutrálním
oceňování a předpokladu, že cena akcie se řídí Black–Scholesovým vzorcem, je E((Subscript[S, T])|(Subscript[S, 0]))=(Subscript[S, 0])(e^(r,T)).  Výplatní funkce forwardu je (Subscript[S, T])-F. Střední hodnota této funkce podmíněná známou cenou akcie v okamžiku uzavření kontraktu t=0 a diskontovaná k okamžiku 0 je tedy (Subscript[S, 0])-F,(e^(-r,T)). Tento výraz je však roven nule, neboť v okamžiku uzavření kontraktu je cena nulová.
(WILMOTT Students, p. 99)

FinancialDerivative v systému  Mathematica  (v této verzi (11) zatím omezeno jenom na opce)

FinancialDerivative

Označení: “StrikePrice” realizacni cena K, “Expiration” doba do splatnosti, doba do vyprseni T, pokud se uvede “ReferenceTime” t, pak je to T-t,  “InterestRate” bezrizikova urokova mira (Subscript[r, 0]), “Volatility” volatilita ceny podkladoveho aktiva σ (underlying asset), “CurrentPrice” soucasna cena podkladoveho aktiva (Subscript[S, 0]) resp. (Subscript[S, t]) . “Dividend” je dividendova intenzita q. Vsechny udaje se vztahuji ke stejnemu casovemu obdobi, typicky 1 rok.

(* vsechny zabudovane derivaty, zde zvane "Contracts" *)
FinancialDerivative[](* //Length *)

POZOR NA SYNTAXI!!! PRI RESENI ULOH ZKOPIRUJTE Z HELPU!!! Typicky ma FinancialDerivative 3 az 4 argumenty, kazdy z nich je seznam (list).

1 Priklad (hodnoty opci)

FinancialDerivative[{"European","Call"}, {"StrikePrice"-> 50.00, "Expiration"->1},  {"InterestRate"-> 0.1, "Volatility" -> 0.5, "CurrentPrice"-> 50, "Dividend"->0.05}]

FinancialDerivative[{"American","Call"}, {"StrikePrice"-> 50.00, "Expiration"->1},  {"InterestRate"-> 0.1, "Volatility" -> 0.5, "CurrentPrice"-> 50, "Dividend"->0.05}]

2 Priklad (hodnoty opci a jejich citlivosti, The Greeks)

V ... price of the option, Δ=(∂/(∂(Subscript[S, t])))V,  Γ=((∂^2)/(∂(Subscript[S, t]^2)))V,  Ρ=(∂/(∂r))V,  Θ=(∂/(∂t))V,  𝒱=(∂/(∂σ))V

Opce z predchoziho prikladu, vystupem hodnota opce a citlivosti

FinancialDerivative[{"European","Call"}, {"StrikePrice"-> 50.00, "Expiration"->1},  {"InterestRate"-> 0.1, "Volatility" -> 0.5, "CurrentPrice"-> 50, "Dividend"->0.05}, {"Value", "Greeks"}]

3 Priklad (Graficke znazorneni)

Manipulate[Plot[FinancialDerivative[{"European","Call"}, {"StrikePrice"-> 50.00, "Expiration"->T},  {"InterestRate"-> 0.1, "Volatility" ->σ, "CurrentPrice"-> s, "Dividend"->0.05}],{s,40,60},AxesOrigin->{Automatic,0},PlotRange->{0,25},PlotStyle->{Thick,Red}],{{T,0.5},0.0001,1,Appearance->"Labeled"},{{σ,0.5},0.01,1,Appearance->"Labeled"},SaveDefinitions->True]

Manipulate[Plot[FinancialDerivative[{"American","Call"}, {"StrikePrice"-> 50.00, "Expiration"->T},  {"InterestRate"-> 0.1, "Volatility" ->σ, "CurrentPrice"-> s, "Dividend"->0.05}],{s,45,55},AxesOrigin->{Automatic,0},PlotRange->{0,25},PlotStyle->Thick],{{T,0.5},0.0001,1,Appearance->"Labeled"},{{σ,0.5},0.01,1,Appearance->"Labeled"},SaveDefinitions->True]

4 Priklad (Graficke znazorneni)

Plot[FinancialDerivative[{"European","Call"}, {"StrikePrice"-> 50.00, "Expiration"->1},  {"InterestRate"-> 0.1, "Volatility" -> 0.5, "CurrentPrice"-> st, "Dividend"->0.05}],{st,30,60}]

Plot[Table[FinancialDerivative[{"European","Call"}, {"StrikePrice"-> 50.00, "Expiration"->t},  {"InterestRate"-> 0.1, "Volatility" -> 0.5, "CurrentPrice"-> st, "Dividend"->0.05}],{t,{0,0.01,0.1,0.5,1}}],{st,30,60}]

Manipulate[Plot[FinancialDerivative[{"European","Call"}, {"StrikePrice"-> 50.00, "Expiration"->t},  {"InterestRate"-> 0.1, "Volatility" -> 0.5, "CurrentPrice"-> st, "Dividend"->0.05}],{st,40,60},PlotRange->{0,15},PlotStyle->Thick],
{{t,0,"Doba do vyprseni"},0,1,Appearance->"Labeled"},SaveDefinitions->True]

Hodnota evropske CALL a citlivosti (Value and all Greeks of a European call option):

FinancialDerivative[{"European","Call"}, {"StrikePrice"-> 50.00, "Expiration"->1},  {"InterestRate"-> 0.1, "Volatility" -> 0.5, "CurrentPrice"-> 50, "Dividend"->0.05}, {"Value", "Greeks"}]

Podle (podle mne pochybne konstrukce, viz DHS)  teorie by mela byt hodnota americke CALL stejna jako evropske. Ejhle, neni!!!

FinancialDerivative[{"American","Call"}, {"StrikePrice"-> 50.00, "Expiration"->1},  {"InterestRate"-> 0.1, "Volatility" -> 0.5, "CurrentPrice"-> 50, "Dividend"->0.05}, {"Value", "Greeks"}]

Hodnocení derivátů typu Cap (strop) a Floor  (dno)

Důvod, proč ve funkci FinancialDerivative není volba Cap resp. Floor (přesněji Caplet a Floorlet) vidím v tom, že tyto pojmy nejsou jednoznačně definovány a možností je celá řada. Obvykle jsou však kombinací elementárních finančních instrumentů (obligací, opcí, apod.)

Uvedeme ilustraci Cap na evropskou CALL opci s dobou vypršení T a realizační cenou K. Chrání investora v krátké pozici před neomezenou ztrátou. V případě, že cena (Subscript[S, T]) podkladového aktiva je v okamžiku vypršení vyšší než B,  vyplácí se B.

vyplataCAPnaCALL[St_,K_,B_]:=Min[Max[St-K,0],B]
Plot[vyplataCAPnaCALL[st,1,2],{st,0,5},PlotStyle->Thick]

Dlouhá pozice v tomto finančním instrumentu je ekvivalentní držení portfolia dvou CALL opcí, obě se stejnou dobou vypršení, jedna v dlouhé pozici s realizační cenou K, druhá v krátké pozici s realizační cenou K+B.

vyplataportfolia[St_,K_,B_]:=Max[St-K,0]-Max[St-K-B,0]
Plot[vyplataportfolia[st,1,2],{st,0,5},PlotStyle->Thick]

Cena tohoto instrumentu podle Black-Scholesova vzorce je tedy (musíme přidat bezrizikovou úrokovou míru r,0, volatilitu σ a dobu do vypršení T,t.

Clear[cenaCAPnaCALL];
cenaCAPnaCALL[St_,K_,B_,r0_,σ_,Tt_]:=FinancialDerivative[{"European","Call"}, {"StrikePrice"-> K, "Expiration"->Tt},  {"InterestRate"-> r0, "Volatility" -> σ, "CurrentPrice"-> St}]-FinancialDerivative[{"European","Call"}, {"StrikePrice"-> K+B, "Expiration"->Tt},  {"InterestRate"-> r0, "Volatility" -> σ, "CurrentPrice"-> St}]

Plot[cenaCAPnaCALL[st,1,2,0.05,0.4,1],{st,0,5},PlotRange->{0,2},PlotStyle->Thick]

Vyzkoušejte si manipulovat s některými parametry:

Manipulate[Plot[cenaCAPnaCALL[st,1,2,0.05,σ,Tt],{st,0,5},PlotRange->{0,2},PlotStyle->Thick],{{σ,0.3},0.1,0.5,Appearance->"Labeled"},{{Tt,1},0.01,2,Appearance->"Labeled"},SaveDefinitions->True]

Teorie portfolia

Varování: Některé z následujících příkladů zkolabují při spuštění ve verzi Mathematica 10.0.1!!!

**Tržní portfolio, Market portfolio (New Jan 6, 2015)

Zde je mj. matematická formulace tržního portfolia.

Hyperlink[Button[" Tržní portfolio v modelu CAPM "],"http://www.karlin.mff.cuni.cz/~hurt/Market_Portfolio_in_CAPM.pdf"]

Vynechat poznámku 7. 1. 1. na poslední straně.

Úvodní příklady

Výnosy dvou perfektně negativně korelovaných aktiv:

Import["fig3.eps"]

Eficientní hranice portfolia dvou aktiv:

Import["EfficientFrontier.eps"]

Example 9.2.1 from [1], p. 82

Manipulate[ParametricPlot[{(Sqrt[36-72 x1+45 (x1^2)+36 x1 ρ-36 (x1^2) ρ]),14-6 x1},{x1,0,1},AxesOrigin->{0,8},AspectRatio->3/4,AxesLabel->{Style["(Subscript[σ, p])",Italic,16],Style["(Subscript[r, p])",Italic,16]},AxesStyle->Directive[14],PlotPoints->50,PlotStyle->{Black,Thick,Dashing[0.01+0.01ρ]}],{{ρ,0},-1,1,Appearance->"Labeled"},SaveDefinitions->True]

Portfolia s minimálním rizikem:

Import["portfoliorisky2.eps"]

Portfolia s minimálním rizikem při existenci bezrizikového aktiva:

Import["portfolior2riskyplusriskless.eps"]

!!Sharpe ratio and Markowitz portfolio

Data (Mesicni vynosy 5 akcii)

SetDirectory[NotebookDirectory[]]

i1=Import["Returns.csv"]//TableForm
(i2=Rest[Rest[i1]]);

i3=Map[Rest,i2]
Covariance[i3]

Nemate-li ve svem adresari soubor "Returns.dat", pouzijte "tvrdy vstup":

d1={{(* pocet akcií = *)5},{"Month","AMR","BS","UTX","WX","Z"},{1,11.594`,1.515`,-1.579`,-9.36`,-0.408`},{2,22.078`,5.299`,9.947`,7.578`,0.`},{3,-8.511`,-8.`,9.446`,-16.327`,0.694`},{4,-3.488`,0.395`,5.164`,-8.571`,-3.862`},{5,-9.639`,-9.764`,-3.571`,-18.243`,-10.949`},{6,-12.`,6.195`,-0.943`,-11.57`,-8.197`},{7,-10.606`,-0.417`,-7.619`,-8.441`,-6.786`},{8,-1.695`,-6.276`,11.856`,-8.22`,-13.725`},{9,-12.069`,-9.091`,-3.286`,-10.227`,-2.273`},{10,27.451`,15.`,11.186`,-3.797`,2.791`},{11,-21.538`,-4.465`,6.55`,-4.021`,-8.14`},{12,-19.608`,-6.132`,8.75`,12.676`,-5.063`},{13,48.78`,27.156`,4.215`,12.5`,35.2`},{14,19.672`,-2.372`,7.355`,15.271`,12.121`},{15,1.37`,15.19`,13.889`,18.`,-0.901`},{16,4.054`,15.751`,17.073`,-0.847`,18.548`},{17,-15.584`,-9.81`,1.042`,23.884`,-10.958`},{18,3.077`,4.27`,20.833`,4.196`,14.912`},{19,-4.478`,-6.485`,-7.543`,-4.027`,-5.058`},{20,4.688`,11.679`,3.263`,-6.333`,4.918`},{21,-11.94`,-7.285`,3.189`,-18.939`,-3.125`},{22,-1.695`,-3.214`,-7.506`,-2.856`,27.742`},{23,15.517`,0.369`,-3.58`,5.882`,16.026`},{24,5.97`,-1.866`,-7.25`,-0.926`,-2.762`},{25,11.268`,26.616`,15.903`,16.822`,13.295`}};

Text@Grid[d1,Frame->All]

d1[[{1,2,3,4}]]
d2=Rest[d1];
d3=Rest[d2];
datareturns=Map[Rest,d3];
expected=Mean[datareturns]
(cov=Covariance[datareturns])//MatrixForm
(Correlation[datareturns])//MatrixForm
Text@Row@{"Je kovarianční matice positivně definitní?  ",PositiveDefiniteMatrixQ[cov]}

Pokud mate jiz aktivovane predchozi bunky, nasledujici odstavec neaktivujte!!!

SetDirectory[NotebookDirectory[]];
d1=Import["Returns.dat","Table"]
d1[[{1,2,3,4}]]
d2=Rest[d1];
d3=Rest[d2];
datareturns=Map[Rest,d3];
expected=Mean[datareturns]
(cov=Covariance[datareturns])//MatrixForm
(Correlation[datareturns])//MatrixForm

Sharpe Ratio and Markowitz Mean-Variance Portfolio

We assume that N assets have returns (rates of return)  expected returns given by the N×1 vector r and the covariance matrix of returns V. If the investor possesses the wealth 1, then she/he may distribute it among N tradable assets. The proportions of the invested amounts in the individual assets are expresed by the weights x=((((Subscript[x, 1]),...(Subscript[x, N])))^T) which is called portfolio. We will seek the optimal portfolio in the sense that the Sharpe's ratio (also called Sharpe's measure of portfolio) is maximum:

max(((x^T)r)/(Sqrt[(x^T)Vx]))    subject to conditions   x≥0   and     (∑_(n=1)^N)(Subscript[x, n])=1,

so that short sales are not allowed.

Example 1 (short sales allowed)

Clear[xx];
xx=Table[Unique[],{Length[expected]}]

Uloha je invariantni vzhledem ke kladnemu nasobku, resime zatim bez omezujici normovaci podminky.

crit1=((xx.expected)/(Sqrt[xx.cov.xx]))//Simplify

?*Max*

Maximize will always find a global maximum if the objective function and the constraints are polynomial and also in many other cases. NMaximize is a numerical version of Maximize. If there is a real number in the data, Maximize automatically switches to NMaximize. If the above does not work you can try FindMaximum. It searches for a local maximum but if the objective function possesses just (one) global maximum it is likely that this function will find it. Syntax is the same as for Maximize. Moreover, it is possible to choose starting points.

?FindMaximum

sol11=NMaximize[crit1,xx]

Normování

xa=xx/.sol11[[2]]
xnorm=xa/Total[xa]
Total[xnorm]

Hodnota kritéria (je ale také ve výstupu sol11).

val1=(crit1/.{xx->xnorm//Thread})//First

Example 2 (short sales not allowed)

Warning: The following example does not work under Mathematica 10.0.1!!!

ineq=xx≥0//Thread
ineq=Apply[And,ineq]&&(Total[xx]==1)

sol2=NMaximize[{crit1,ineq},xx]
Total[xx/.sol2[[2]]]

(xx/.Last[sol2])//Chop

Example 2 (Revisited)

Místo rovnosti (∑_(n=1)^N)(Subscript[x, n])=1 použijeme omezení  (∑_(n=1)^N)(Subscript[x, n])≤ 1.

Text@Grid[Prepend[{expected,Diagonal[cov]}//Transpose//Sort,{"Exp. Return","Variance"}],Frame->True,Dividers->{{True,True},{True,True}}]

ineq2=xx≥0//Thread
ineq2=Apply[And,ineq2]&&Total[xx]≤1
sol2r=NMaximize[{crit1,ineq2},xx]
Total[xx/.sol2r[[2]]]

Ale

(xx/.sol2r[[2]]).expected

zatimco v predchozim pripade

(xx/.Last[sol2]).expected

Pokud však normujeme řešení, dostaneme stejnou hodnotu Sharpeova poměru, ale očekávaný výnos portfolia odpovídající prvnímu případu:

{crit1/.sol2r[[2]],((xx/(Total[xx]))/.sol2r[[2]]).expected}

Example 3a (Markowitz) Portfolio with prescribed (target) expected return and minimum risk, short sales not allowed)

Aktiva nesplnuji predpoklady efektivniho trhu (hned první dvě aktiva, první má menší očekávaný výnos než druhé, ale větší riziko), takze investor nemusi ani vyuzit veskere disponibilni bohatstvi a presto dosahne stejne hodnoty cilove funkce (optimalizacniho kriteria). 1. aktivum ma mensi ocekavany vynos nez 2. aktivum, ale riziko ma vetsi. Aktivum s nejvyšším očekávaným výnosem má nejmenší rozptyl.

Text@Grid[{expected,Diagonal[cov]},Frame->All]

crit3=xx.cov.xx//Simplify
cons3=Apply[And,Thread[xx≥0]]&&Total[xx]==1&&xx.expected== 4

sol3=NMinimize[{crit3,cons3},xx,MaxIterations->300]//Chop
(* Zkuste s původním implicitním nastavením MaxIterations->100 *)

Text@Row@{"Součet vah = ",Total[xx3=xx/.Last[sol3]],"   Očekávaný výnos optimálního portfolia = ",xx3.expected}

Ještě srovnání vah s očekávaným výnosy a riziky aktiv v portfoliu:

{xx3,expected,(Sqrt[Diagonal[cov]])}//TableForm

Example 3b (inequality instead of equality)

crit3b=xx.cov.xx//Simplify;
cons3b=Apply[And,Thread[xx≥0]]&&Total[xx]≤ 1&&xx.expected==4;
sol3b=NMinimize[{crit3b,cons3b},xx]
{Total[xx3b=xx/.Last[sol3b]],xx3b.expected}

Zkusíme najít nějaké (nějaká) počáteční řešení (vysvětlení v Help k funkci FindInstance):

xx3binit=FindInstance[cons3b,xx,Reals,3]

Zadání počátečního řešení při použití optimalizačních funkcí vyřaduje tuto syntaxi:

Thread[{xx,xx/.(xx3binit//First)}]

Bez zadání počátečního řešení:

FindMinimum[{crit3b,cons3b},xx]

Pro 3 různá počáteční řešení:

Text@Grid@Map[FindMinimum[{crit3b,cons3b},Thread[{xx,xx/.#}]]&,xx3binit]

Example 3c (inequalities instead of equalities)

crit3c=xx.cov.xx//Simplify;
cons3c=Apply[And,Thread[xx≥0]]&&Total[xx]≤ 1&&xx.expected≥4;
sol3c=NMinimize[{crit3c,cons3c},xx]
Total[xx3c=xx/.Last[sol3c]]
xx3c
xx3c.expected

Using FindMinimum :

sol3cfindminimum=FindMinimum[{crit3c,cons3c},xx]
Total[xx3cfindminimum=xx/.Last[sol3cfindminimum]]
xx3c
xx3cfindminimum.expected

Using all(?) available methods for FindMinimum:

"ConjugateGradient", "PrincipalAxis", "LevenbergMarquardt", "Newton", "QuasiNewton"

Unfeasible requirement
(Neither of the assets reaches the expected return reaches 4.3.)

crit34=xx.cov.xx//Simplify;
cons34=Apply[And,Thread[xx≥0]]&&Total[xx]==1&&xx.expected≥ 4.3;
sol3=NMinimize[{crit34,cons34},xx]

Example 4

We have 8 assets traded on Prague Stock Exchange with the expected returns

returns={-9.92488533927622*10^-04,5.72524775783378*10^-03,9.04818959590086*10^-03,-1.44968966764537*10^-03,-1.74045537023702*10^-02,5.70188394543127*10^-03,3.33476815091662*10^-03,2.15075479228363*10^-03};

and the covariance matrix of returns

covariancematrix={{1.35640293495777*10^-03,2.56330097904098*10^-04,3.33037161321956*10^-04,1.80223328810003*10^-04,2.81325992644196*10^-04,5.93263545509886*10^-04,7.13610711759175*10^-04,3.20932535820455*10^-04},{2.56330097904098*10^-04,2.35439634554186*10^-03,4.42407197078591*10^-04,6.57567906193998*10^-06,4.01068448708833*10^-04,5.93785356343409*10^-04,1.30961261626908*10^-04,2.93338399396577*10^-04},{3.33037161321956*10^-04,4.42407197078591*10^-04,1.57895651834543*10^-03,-1.16804549527263*10^-04,1.85336104268171*10^-04,.000176059157865,3.41400743910472*10^-04,1.86624552570071*10^-04},{1.80223328810003*10^-04,6.57567906193998*10^-06,-1.16804549527263*10^-04,6.16786555694974*10^-03,4.84828341822248*10^-04,8.50333422445824*10^-04,7.74803938060802*10^-05,4.39412705238888*10^-04},{2.81325992644196*10^-04,4.01068448708833*10^-04,1.85336104268171*10^-04,4.84828341822248*10^-04,9.45147795376653*10^-03,1.78331918975426*10^-03,5.0987274991634*10^-05,1.49823427374484*10^-03},{5.93263545509886*10^-04,5.93785356343409*10^-04,.000176059157865,8.50333422445824*10^-04,1.78331918975426*10^-03,7.38754498647722*10^-03,1.03084013803777*10^-03,9.34434830622224*10^-04},{7.13610711759175*10^-04,1.30961261626908*10^-04,3.41400743910472*10^-04,7.74803938060802*10^-05,5.0987274991634*10^-05,1.03084013803777*10^-03,2.1036055256453*10^-03,2.40818723671803*10^-04},{3.20932535820455*10^-04,2.93338399396577*10^-04,1.86624552570071*10^-04,4.39412705238888*10^-04,1.49823427374484*10^-03,9.34434830622224*10^-04,2.40818723671803*10^-04,2.77726103166242*10^-03}};

We see that the above matrix is badly conditioned (ill-conditioned):

Det[covariancematrix]

More precisely about measuring so called “condition number” see http://mathworld.wolfram.com/ConditionNumber.html

Correlation matrix

((Sqrt[DiagonalMatrix[1/Diagonal[covariancematrix]]]).covariancematrix.(Sqrt[DiagonalMatrix[1/Diagonal[covariancematrix]]]))//MatrixForm

xxPS=Table[(Subscript[x, i]),{i,1,Length[returns]}]

The criterion is given by

criterion=(((xxPS.returns))/(Sqrt[xxPS.covariancematrix.xxPS]))//Simplify;

The constraints are

constraints1=Apply[And,Table[(Subscript[x, i])≥ 0,{i,1,Length[returns]}]];
constraints2=Total[xxPS]==1;
constraints=constraints1&&(constraints2)

NMaximize[{criterion,constraints},xxPS]

Next we solve the problem using the option for the method:

soldif=NMaximize[{criterion,constraints},xxPS,Method->"DifferentialEvolution"]

Všechny (?) dostupné metody (trvá dlouho, 103 sec):

Map[{#,NMaximize[{criterion,constraints},xxPS,Method->#]}&,{"DifferentialEvolution","NelderMead","SimulatedAnnealing","RandomSearch"}]//TableForm

Text@Row@{"Součet = ",Total[xxPS/.soldif[[2]]],Spacer[10],
"Expected return of the optimal portfolio = ",(xxPS/.soldif[[2]]).returns}

Use FindMaximum:

FindMaximum[{criterion,constraints},xxPS]

Lagrange multipliers

Illustration on Example 3 (Markowitz, short sales allowed, μ prescribed (target) expected return)

Clear[lagrangeMultipliers];lagrangeMultipliers[expected_,covariance_,targetreturn_]:=
Module[{n=Length[expected],lagrangeFunction,xx,xxλ,λ1,λ2,equations,xx0},
xx=Table[Unique[],{n}];
lagrangeFunction=(1/2)xx.covariance.xx+λ1(1-Total[xx])+λ2(targetreturn-expected.xx)//Simplify;
xxλ={xx,λ1,λ2}//Flatten;
equations=Map[D[lagrangeFunction,#]&,xxλ]==0;
Text@Row@{"Optimal portfolio   ",xx0=Take[Flatten[xxλ/.Solve[equations,xxλ]],n],"\n","Expected return = ",expected.xx0,"   Variance = ",xx0.covariance.xx0}]

lagrangeMultipliers[expected,cov,3]

***Capital Asset Pricing Model (CAPM)

Security Market Line

[3] Cipra, T.: Matematika cenných papírů. Kamil Mařík Professional Publishing. Praha 2013.

Capital Market Line

**Optimalizační funkce systému Mathematica

V optimalizacnich ulohach je mozne volit normy (Subscript[L, 2]), (Subscript[L, 1]), (Subscript[L, ∞]).

Row@{Hyperlink[Button["ConstrainedOptimizationLinearProgramming"],"paclet:tutorial/ConstrainedOptimizationLinearProgramming"],Spacer[20],Hyperlink[Button["ConstrainedOptimization"],"paclet:tutorial/ConstrainedOptimizationOverview"]}

Další odkazy

FindMinimum, FindMaximum, NMinimize, NMaximize, Minimize, and Maximize. LinearProgramming

!!Práce s databází

***DatabaseLink/tutorial/Overview

Hyperlink[Button[" DatabaseLink "],"paclet:DatabaseLink/tutorial/Overview"]

***Approach in elder versions (you can skip it)

Simulation of a simple insurance database with fields {names, sex (Male, Female), age, insured amount}

c1=CharacterRange["A","Z"]
ToCharacterCode[c1]//Flatten

ToCharacterCode[{"M","F"}]//Flatten

genernames:=FromCharacterCode[RandomInteger[{65,90},5]]

sex2=Table[FromCharacterCode[RandomInteger[] (77-70)+70],{30}];
names2=Table[genernames,{30}];
ages2=RandomInteger[{20,85},30];
insured2=Table[RandomInteger[{20,100}] 1000,{30}];
database=Transpose[{names2,sex2,ages2,insured2}];

database

Find all men elder than 60, insured over 50000. Both of the following constructions give the same result.

Cases[database,_?(And[#[[2]]=="M",#[[3]]>60,#[[4]]>50000]&)]

sele1=Select[database,(And[#[[2]]=="M",#[[3]]>60,#[[4]]>50000]&)]

Sort these selecting records according to the insured amount:

Sort[sele1,#1[[4]]>#2[[4]]&]

Export the database in the Excel format:

SetDirectory[NotebookDirectory[]]
Export["database.xls",database,"XLS"]

Modern approach

SetDirectory[NotebookDirectory[]]

Simulation of a simple insurance database with fields {names, sex (Male, Female), age, insured amount}
Simulace jednoduché databáze pojistek s položkami {jméno, pohlaví, věk, pojistná částka}

(* generovaní jmen náhodné délky od 3 do 10 *)
Clear[genername]
genername[n_,seed_:13131]:=Module[{},SeedRandom[seed];
Table[StringJoin[RandomChoice[CharacterRange["A","Z"],RandomInteger[{3,10}]]],{n}]]
genername[4]

(* pohlaví M muž, F žena*)
Clear[sex]
sex[n_,seed_:13131]:=Module[{},SeedRandom[seed];Table[RandomChoice[{"M","F"}],{n}]]
sex[4]

(* věky náhodné, rovnoměrně rozdělené na intervalu [20,85]*)
Clear[ages]
ages[n_,seed_:13131]:=Module[{},SeedRandom[seed];Table[RandomInteger[{20,85}],{n}]]
ages[4]

(* pojistná částka s rovnoměrným rozdělením na intervalu [20000,100000] zaoukrouhlená na tisíce *)
Clear[insuredamount]
insuredamount[n_,seed_:13131]:=Module[{},SeedRandom[seed];Table[RandomInteger[{20,100}] 1000,{n}]]
insuredamount[4]

(* hlavička databáze *)
head={"Name","Sex ","Age ","Insured amount"}

(* vytvoření databáze *) 
Clear[database];
database[n_]:=Module[{aux},aux=Transpose[{genername[n],sex[n],ages[n],insuredamount[n]}];PrependTo[aux,head]]
database[4]//TableForm

Úloha

Find all men elder than 60, insured over 50000. Both of the following constructions give the same result.

Vyberte pojistky všech mužů starších 60 let s pojistnou částkou vyšší než 50000. Oba následující postupy jsou ekvivalentní.

Join[{head},Cases[database[100],_?(And[#[[2]]=="M",#[[3]]>60,#[[4]]>50000]&)]]//TableForm

The equivalent solution

(sele=Select[database[100],(And[#[[2]]=="M",#[[3]]>60,#[[4]]>50000]&)])//TableForm

Setřídit vybrané položky podle pojistné částky
Sort these selecting records according to the insured amount:

Sort[sele,#1[[4]]>#2[[4]]&]//TableForm

Export ve formátu *.xls
Export the database in the Excel format:

SetDirectory[NotebookDirectory[]]
Export["database.xls",database[1000]]

Různé (všehochuť )

Příklady naivního šifrování

Julius Caesar (posunuti o jedno pismeno)

abeceda=CharacterRange["a","z"]

(* Šifrování *)
caesarcoderules=Thread[abeceda->RotateLeft[abeceda]]

(* Dešífrování *)caesardecoderules=Thread[abeceda->RotateRight[abeceda]]

text="dominika"
roztext=Characters[text]
codetext=roztext/.caesarcoderules
decodetext=codetext/.caesardecoderules
StringJoin[decodetext]

**Lepsi zpusob sifrovani (precist)

Needs["Combinatorica`"]

SeedRandom[13];
permcoderules=Thread[abeceda->(perm=RandomPermutation[abeceda])]

Je také možné použít

RandomSample[abeceda]
(%//Sort)==abeceda

roztext
permc=roztext/.permcoderules

permc/.Thread[perm->abeceda]
%//StringJoin

** Ještě lepší způsob šifrování (RSA)

{p1=Prime[100000000000],p2=Prime[10000000000]}
soucin=p1 p2
factor=FactorInteger[soucin]
Apply[Times,((Map[First,factor])^(Map[Last,factor]))]

http://demonstrations.wolfram.com/RSAEncryptionAndDecryption/

Reduce

Motivation

Fiona Maclachlan: Three-Asset Efficient Frontier. The Wolfram Demonstration Project.  http://demonstrations.wolfram.com/ThreeAssetEfficientFrontier/

Manipulate[weights=DeleteCases[Flatten[Table[{a, b, 1-a-b}, {a, 0,1, .02}, {b,0, 1, .02}],1],{_,_,x_/;x<0}];
points=Transpose[{Sqrt/@Table[With[{wX=weights[[i,1]], wY=weights[[i,2]], wZ=weights[[i,3]]},wX^2 σX^2 +wY^2 σY^2 + wZ^2 σZ^2 + 2 wX wY σX σY rXY + 2 wX wZ σX σZ rXZ +   2 wY wZ σY σZ rYZ], {i,Length[weights]}],Table[With[{wX=weights[[i,1]], wY=weights[[i,2]], wZ=weights[[i,3]]},wX μX +wY μY +wZ μZ],{i, Length[weights]}]}];
Show[ListPlot[points,PlotStyle-> PointSize[.01], PlotRange->{{0,.2}, {0,.5}},
AxesLabel->{Style["portfolio volatility","Label"],Style[ "portfolio expected return", "Label"]}, AspectRatio->1.5, Ticks->{{.05,.15},{.2,.4}}],
ListLinePlot[Tooltip[FixedPoint[Delete[#, Position[Prepend[Differences[Transpose[#][[2]]],0],d_/;d<0]]&, Sort[points]], "efficient frontier"],PlotStyle->{Thick, Orange}],ImageSize->400],
{{μX,.14, "(Subscript[μ, 1])"}, 0, .3,.01,Appearance->"Labeled",ImageSize->Tiny},{{σX,.08,"(Subscript[σ, 1])"}, 0, .7,.01,Appearance->"Labeled",ImageSize->Tiny},Delimiter, {{μY,.1,"(Subscript[μ, 2])"}, 0, .3,.01,Appearance->"Labeled",ImageSize->Tiny},{{σY,.51,"(Subscript[σ, 2])"}, 0, .7,.01,Appearance->"Labeled",ImageSize->Tiny},  Delimiter,{{μZ,.5,"(Subscript[μ, 3])" },0, .5,.01,Appearance->"Labeled",ImageSize->Tiny},{{σZ,.18,"(Subscript[σ, 3])"}, 0, .7,.01,Appearance->"Labeled",ImageSize->Tiny},Delimiter,{{rXY,0.7,"(Subscript[ρ, 12])"}, -1, 1,.01,Appearance->"Labeled",ImageSize->Tiny},{{rXZ,0.8,"(Subscript[ρ, 13])"}, -1, 1,.01,Appearance->"Labeled",ImageSize->Tiny},{{rYZ,-0.76,"(Subscript[ρ, 23])"}, -1, 1,.01,Appearance->"Labeled",ImageSize->Tiny}, TrackedSymbols:>Manipulate,AutorunSequencing->{1,2,3,5}]

This is a little bit strange. First I thought that this is caused by the fact that the assumptions about efficient market are not fulfiled. In the example above, the expected return of the third asset is higher than that of the second one while its risk is lower, (Subscript[μ, 2])<(Subscript[μ, 3]) and (Subscript[σ, 2])>(Subscript[σ, 3]).

The details

The problem is that possible choices of correlations may lead to the “covariance matrix” that is not positive semidefinite. Not all triples from (([-1,1])^3) may form a correlation matrix.

A general covariance matrix ΣΣ:

Clear[μ1,μ2,μ3,σ1,σ2,σ3,ρ12,ρ13,ρ23];
μμ={μ1,μ2,μ3};
σσ={σ1,σ2,σ3}; (* risks = standard deviations *)
ρρ={ρ12,ρ13,ρ23};
(ΣΣ=DiagonalMatrix[((σσ)^2)]+DiagonalMatrix[{σ1 σ2 ρ12,σ2 σ3 ρ23},1]+DiagonalMatrix[{σ1 σ2 ρ12,σ2 σ3 ρ23},-1]+DiagonalMatrix[{σ1 σ3 ρ13},2]+DiagonalMatrix[{σ1 σ3 ρ13},-2])//MatrixForm

(determinantΣΣ=Det[ΣΣ]//FullSimplify)

Plug in the specific values from the demonstartion:

(ΣΣspecific=ΣΣ/.({Thread[σσ->{0.08,0.51,0.18}],
Thread[ρρ->{0.7,0.8,-0.76}]}//Flatten))//MatrixForm

Look at the determinant

determinantΣΣspecific=determinantΣΣ/.({Thread[σσ->{0.08,0.51,0.18}],
Thread[ρρ->{0.7,0.8,-0.76}]}//Flatten)

So the above specific matrix cannot be a positive semidefinite.

Sylvestr criterion

A real symmetric matrix is positive definite if and only if all leading principal minors are positive. Instead of the covariance matrix we may consider the correlation matrix only.

(correlationmatrix3=ΣΣ/.({Thread[σσ->{1,1,1}],
Thread[ρρ->{ρ12,ρ13,ρ23}]}//Flatten))//MatrixForm

The leading principal determinants are

determinantofCorrelationmatrix2=Det[Drop[Drop[correlationmatrix3,-1]//Transpose,-1]]
determinantofCorrelationmatrix3=Det[correlationmatrix3]

Therefore, the necessary and sufficient conditions for the positive definiteness are

conditions=(1-((ρ12)^2)>0&&1-((ρ12)^2)-((ρ13)^2)+2 ρ12 ρ13 ρ23-((ρ23)^2)>0&&-1<ρ12<1&&-1<ρ13<1&&-1<ρ23<1);

We make use of Reduce to find the set of feasible correlation coefficients

positivedefinite3=Reduce[conditions,{ρ12,ρ13,ρ23}]//FullSimplify

We also define the corresponding function which returns True if the correlation coefficients satisfy the above conditions and returns False otherwise.

Clear[functionpositivedefinite3];
functionpositivedefinite3[{ρ12_,ρ13_,ρ23_}]:=(ρ12<0&&-1<ρ13<1&&√((-1+((ρ12)^2)) (-1+((ρ13)^2)))+ρ23>ρ12 ρ13&&ρ12 ρ13+√((-1+((ρ12)^2)) (-1+((ρ13)^2)))>ρ23)||(ρ12==0&&((ρ13==0&&-1<ρ23<1)||(√(1-((ρ13)^2))+ρ23>0&&√(1-((ρ13)^2))>ρ23&&ρ13≠0)))||(0<ρ12<1&&((√((-1+((ρ12)^2)) (-1+((ρ13)^2)))+ρ23>ρ12 ρ13&&((ρ12==ρ13&&ρ23<1)||(ρ12 ρ13+√((-1+((ρ12)^2)) (-1+((ρ13)^2)))>ρ23&&((1+ρ13>0&&ρ12+ρ13<0)||(ρ12>ρ13&&ρ12+ρ13>0)||(ρ12<ρ13&&ρ13<1)))))||(ρ12+ρ13==0&&ρ12 ρ13+√((-1+((ρ12)^2)) (-1+((ρ13)^2)))>ρ23&&1+ρ23>0)))

In our case

correlationmatrix3/.Thread[ρρ->{0.7,0.8,-0.76}]
Det@%

functionpositivedefinite3[{0.7,0.8,-0.76}]

The set of feasible triples (it takes about 60 seconds!!!):

RegionPlot3D[positivedefinite3,{ρ12,-1,1},{ρ13,-1,1},{ρ23,-1,1},PlotPoints->150]

Text@Row@{"Volume of triples generating the positive definite matrix = ",volumeoftheregionoffeasibletriples=(∫_(-1)^1)(∫_(-1)^1)(∫_(-1)^1)Boole[functionpositivedefinite3[{x,y,z}]]\[DifferentialD]x\[DifferentialD]y\[DifferentialD]z," = ",volumeoftheregionoffeasibletriples//N,"\nThe relative portion = ",(volumeoftheregionoffeasibletriples/(2^3))," = ",(volumeoftheregionoffeasibletriples/(2.^3))}

Volume and the probability that a random triple from (([-1,1])^3) will form a correlation matrix:

Text@Grid[{{"Volume",volumeoftheregionoffeasibletriples//N},{"Probability",volumeoftheregionoffeasibletriples/8.}}]

It means that if we take a random triple uniformly distributed on the cube (([0,1])^3) the the probability that it make form a correlation matrix matrix is 0.61685.

Compile

V některých případech podstatně urychluje výpočet, ztrácí se však přesnost dosahována Wolfram Language. Musí být (většinou) deklarovány typy, implicitně _Real.

Hyperlink[Button["Compiling expressions"], 
    "paclet:tutorial/CompilingWolframLanguageExpressions"]

Clear[f,fc];
{f=Function[{x},x Sin[x]],fc=Compile[{x},x Sin[x]]}

testData=0.5 Range[20000000];
Timing[Map[fc,testData];]
Timing[Map[f,testData];]

ToExpression TeX

{ToExpression["\\frac{x}{\\sqrt{5}}",TeXForm],
With[{expr=ToExpression["\\frac{x}{\\sqrt{5}}",TeXForm]},expr/.x->5]}

Link

RLink, DatabaseLink, JLink, Wolfram LibraryLink, MathLink, NETLink, CUDALink, &c.

Database

Hyperlink[Button["DatabaseLikeOperationsOnDatasets"], 
    "paclet:guide/DatabaseLikeOperationsOnDatasets"]