2016-09-07 21 views
1

我不是F#程序员。我正在修改现有的库。F#划分函数错误:期望支持运算符'/'的类型,但给出函数类型

我正在尝试并慢慢捡起来。

我想要做的是划分两个功能。

我可以看到它通过图书馆的其余部分做了,所以我知道这是可能的。然而,当我尝试和鸿沟我得到的错误

“期待型支持运营商‘/’,但给出的函数类型。您可能缺少一个参数传递给函数”

这是错误发生

let sharpeRatio2 pfRets bmkRets x = 
    let top pfRets bmkRets = excessReturns2 pfRets bmkRets 
    let bottom pfRets x = volatilty pfRets false x 
    let result = top/bottom 
    result 

子功能叫我觉得都是很好的,对我创造了它的波动一个唯一的问号应该乘以std结果开方(12)

顶(返回)

let excessReturns2 (pfRets: seq<float>) bmkRets = 
    Seq.zip pfRets bmkRets |> Seq.map activeReturn 
    |> Seq.zip 

let inline activeReturn (ret, bmkRet) = ret - bmkRet 

底部(波动性)

let var xs nmethod = 
    match Seq.fold (fun (i, s, sumsq) x -> i + 1, s + x, sumsq + x * x) (0, 0., 0.) xs with 
    | 0, _, _ -> 0. 
    | 1, _, _ when not nmethod -> 0. 
    | n, xsum, xsumsq -> 
     // denominator is (n-1) or n 
     let d = if nmethod then float n else float n - 1. 
     (xsumsq - xsum * xsum/float n)/d 

    let std xs nmethod = sqrt (var xs nmethod) 

    let volatilty xs nmethod x = (std xs nmethod) * sqrt (x) 

任何想法欢迎请

感谢GWS

+0

这是类型推断使得有点难以看到发生了什么的地方。你能显示'top'和'bottom'功能的类型签名吗?如有必要,您可以从REPL中复制它。 – s952163

+0

我的猜测是,也许你没有提供所有的参数给你的函数,所以顶部或底部不是一个数字(还)。 – s952163

+0

对不起,我必须弄清楚你的意思。我相信TOP是seq - > seq - > seq <'d> - > seq 和底部 - >浮动 - >浮动 –

回答

2

这应该为你工作:

open System 
let rnd = Random() 
rnd.NextDouble() 

let ret1 = List.init 100 (fun _ -> rnd.NextDouble() - 0.5) 
let ret2 = List.init 100 (fun _ -> rnd.NextDouble() - 0.5) 

let inline activeReturn (ret, bmkRet) = ret - bmkRet 
let excessReturns2 (pfRets: seq<float>) bmkRets = 
    Seq.zip pfRets bmkRets |> Seq.map activeReturn |> Seq.sum 

let var xs nmethod = 
    match Seq.fold (fun (i, s, sumsq) x -> i + 1, s + x, sumsq + x * x) (0, 0., 0.) xs with 
    | 0, _, _ -> 0. 
    | 1, _, _ when not nmethod -> 0. 
    | n, xsum, xsumsq -> 
     // denominator is (n-1) or n 
     let d = if nmethod then float n else float n - 1. 
     (xsumsq - xsum * xsum/float n)/d 

let std xs nmethod = sqrt (var xs nmethod) 
let volatilty xs nmethod x = (std xs nmethod) * sqrt (x) 


let sharpeRatio2 pfRets bmkRets x = 
    let top = excessReturns2 pfRets bmkRets 
    let bottom = volatilty pfRets false x 
    let result = top/bottom 
    result 

sharpeRatio2 ret1 ret2 12. 

一些评论:

  1. 尝试为F#编译器那张从左到右,从上到下,以确定和发布功能。因此activeReturn必须在excessreturn之前,而topbottom之前的功能是sharperatio

  2. 您的excessReturns2函数中有一个错误,最后你有一个Seq.zip管道。我假设实际上是Seq.sumSeq.average(您希望该期间的总活跃回报或平均每日/每月活跃回报)。要么你想要一个号码。

  3. 这条线(也是下一条):excessReturns2 pfRets bmkRets:这里excessReturns2是一个函数,它接受投资组合和基准收益两个参数。此功能将返回一个数字,这是顶部,所以你可以只说let top = excessReturns2 pfRets bmkRets,同上。

  4. 你最好使用Mathdotnet,并从那里调用StandardDeviation函数。不需要定义你自己的。

让我知道如果您有任何问题。

在Mathdotnet

这是一个伟大的图书馆,如果你能有它的依赖,你应该能够只是说:

open MathNet.Numerics 
open MathNet.Numerics.Statistics 

Statistics.StandardDeviation ret1 

您还可以使用投资组合回报标准差时,划分主动回报。如果您需要查看信息比率,您应该理想地使用主动回报的标准偏差。

+0

谢谢你让我通过解决方案,什么是错的,如何解决它和替代品。你会相信我有seq.sum来计算超额回报,以及一些如何在调试时将其改为.zip的意外,甚至没有把它看作是问题。 –

2

当你写

let top pfRets bmkRets = excessReturns2 pfRets bmkRets 

计算top基于价值传入的变量pfRets2bmkRets。相反,你只定义了一个函数,top,发生使用与它的参数相同的名称作为shapeRatio2 - 但这些参数是未指定的。

也就是说,两个功能拍摄参数调用pfRetsbmkRets,但调用excessReturns2确实自动还呼吁top与相同参数;它只记录它的定义。

显然,这同样适用于bottom

既然你想topbottom,你需要定义他们没有参数(这就是价值和功能之间的简单区别:后者接受参数,前者不):

let sharpeRatio2 pfRets bmkRets x = 
    let top = excessReturns2 pfRets bmkRets 
    let bottom = volatilty pfRets false x 
    let result = top/bottom 
    result 
相关问题