Popularity
9.3
Stable
Activity
0.0
Stable
131
17
13
Monthly Downloads: 7
Programming language: Haskell
License: BSD 3-clause "New" or "Revised" License
Tags:
Finance
quantfin alternatives and similar packages
Based on the "Finance" category.
Alternatively, view quantfin alternatives based on common mentions on social networks and blogs.
-
commodities
A rewrite of Ledger's core mathematical concepts in Haskell -
netrium
Precise description and operational execution of exotic contracts. -
bitx-bitcoin
(Hopefully useful) Haskell bindings to the BitX bitcoin exchange's API. -
dollaridoos
A typesafe wrapper around monetary values represented as numeric values, allowing only sensible operations. -
docusign-example
A basic demonstration of the Haskell `docusign-client` package. -
bitcoin-rpc
Haskell library to communicate with the Satoshi Bitcoin daemon -
eurofxref
Free foreign exchange/currency feed from the European Central Bank -
ochintin-daicho
A module to manage payroll books for Japanese companies. -
bookkeeping-jp
Helper functions of Haskell bookkeeping module for Japanese bookkeeping.
WorkOS - The modern identity platform for B2B SaaS
The APIs are flexible and easy-to-use, supporting authentication, user identity, and complex enterprise features like SSO and SCIM provisioning.
Promo
workos.com
Do you think we are missing an alternative of quantfin or a related project?
README
quantfin
Quant Finance in Pure Haskell.
Initially I'm focusing on a Monte Carlo engine, but plenty more to come.
import Quant.Time
import Data.Monoid
import Quant.MonteCarlo
import Quant.YieldCurve
import Quant.ContingentClaim
import Quant.Models.Black
import Quant.Models.Heston
--create a flat yield curve with a 5% rate
baseYC :: FlatCurve
baseYC = FlatCurve 0.05
black :: Black
black = Black
100 --initial stock price
0.2 --volatility
baseYC --forward generator
baseYC --discount function
--make a vanilla put, struck at 100, maturing at time 1
vanopt :: ContingentClaim1
vanopt = vanillaOption Call 100 (Time 1) --built in function
vanopt' :: ContingentClaim1
vanopt' = specify $ do
x <- monitor (Time 1)
return $ CashFlow (Time 1) (max (x - 100) 0) --roll your own
--Run a Monte Carlo on opt in a a black model with 10000 trials
vanoptPrice :: Double
vanoptPrice = quickSim black vanopt 100000
vanoptPrice' :: Double
vanoptPrice' = quickSim black vanopt' 100000
--Make a call spread with a 100 unit notional, using some handy combinators.
cs :: ContingentClaim1
cs = multiplier 100
$ vanillaOption Call 100 (Time 1)
<> short (vanillaOption Call 120 (Time 1))
--Run a Monte Carlo on the call spread; use antithetic variates
csPrice :: Double
csPrice = quickSim black' cs 100000
black' :: Black
black' = Black
100 --initial stock price
0.2 --volatility
(NetYC (FlatCurve 0.05) (FlatCurve 0.02)) --forward generator, now with a 2% dividend yield
baseYC --discount rate
callSpreadAnti :: Double
callSpreadAnti = quickSimAnti black' cs 100000
--Let's try it with a Heston model
heston :: Heston
heston = Heston
100
0.04 --initial variance
0.04 --final variance
0.2 --volvol
(-0.7) --correlation between processes
1.0 --mean reversion speed
baseYC --forward generator
baseYC --discount function
--price the call spread in the Heston model
csHeston :: Double
csHeston = quickSimAnti heston cs 100000
--create an option that pays off based on the square of its underlying
squareOpt :: ContingentClaim1
squareOpt = terminalOnly (Time 1) $ \x -> x*x --using the built in function
squareOpt' :: ContingentClaim1
squareOpt' = specify $ do --roll your own
x <- monitor (Time 1)
return $ CashFlow (Time 1) $ x*x
squareOptPrice :: Double
squareOptPrice = quickSimAnti black squareOpt 100000
squareOptPrice' :: Double
squareOptPrice' = quickSimAnti black squareOpt' 100000
--create an option with a bizarre payoff
bizarre :: ContingentClaim1
bizarre = specify $ do
x <- monitor (Time 1) --check the price of asset 0 @ time 1
y <- monitor (Time 2) --check the price of asset 0 @ time 2
z <- monitor (Time 3) --check the price of asset 0 @ time 3
return $ CashFlow (Time 4) $ sin x * cos y / (z ** sin x) --payoff @ time 4
bizarrePrice :: Double
bizarrePrice = quickSimAnti black bizarre 100000