我只是自己跳进F#,将一个简单的金融工具翻译为练习。我还在等邮件中的参考书。这里有一些我认为F#可以用多种聪明聪明的方式做的事情,但我无法解决语法错误。
我有一个名为Delta的功能选项评估,我想应用它 - 通过两个(并行)输入值列表:
let Delta f k v t r = exp(-r * t) * CDF(D1 f k v t)
let priceList = [100.0; 98.0; 102.0; 100.0] //f
let strike = 100.0 //k
let vol = 0.30 //v
let timeList = [1.0; 0.9; 0.8; 0.7] //t
let rt = 0.005 //r
所以这个函数是递归过程的一部分(使用Newton的方法)。我很乐意制作一个相同长度的增量列表[d1; D2; D3; d4] [编辑:我坚持按照所需结果的增量列表]。我正在寻找聪明的F#方式 - 一举 - 使用列表功能。我试图将这种Delta函数强制转换为这种基本模式:
let sumList = List.map2 (fun x y -> x + y) list1 list2
(似乎许多列表函数可以让我获得Delta列表或Delta列表的总和。)我没有接近猜测法律语法。我还试过了#34; Match head :: tail"模式也是。
编辑:我在这里因为我要求的东西而烦恼,因为我在所有名单中游泳了一下。我不熟悉的功能。让我自己关注:我可以应用(Delta f k v t r)作为(Delta priceList strike vol timeList rt)并生成deltaList,价格,时间和增量都是相同的长度吗?答案 0 :(得分:2)
正如其他人在评论中指出的那样,你的问题并不完全清楚 - 如果你给出了一个你希望获得的输入和输出的具体例子,那么回答会更容易。
也就是说,如果你想用各种值作为参数调用Delta
,那么你需要做两件事。大多数参数只是普通值,所以你可以直接传递; priceList
和timeList
是集合,因此我假设您要为其所有元素计算Delta
。为此,您可以使用Seq.zip
和Seq.map
:
Seq.zip priceList timeList
|> Seq.map (fun (f, t) -> Delta f strike vol t rt)