Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function F#除法函数错误:应为支持运算符的类型'/';但是给定一个函数类型_Function_F# - Fatal编程技术网

Function F#除法函数错误:应为支持运算符的类型'/';但是给定一个函数类型

Function F#除法函数错误:应为支持运算符的类型'/';但是给定一个函数类型,function,f#,Function,F#,我不是F#程序员。我正在修改现有的库 我试着慢慢地把它捡起来 我要做的是把两个函数分开 我可以通过库的其余部分看到它,所以我知道这是可能的,但是当我尝试分割时,我得到了错误 “需要支持运算符“/”的类型,但给定了函数类型。可能缺少函数的参数” 这就是错误发生的地方 let sharpeRatio2 pfRets bmkRets x = let top pfRets bmkRets = excessReturns2 pfRets bmkRets let bottom pfRets

我不是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结果乘以sqrt(12)

顶部(返回)

有什么想法吗


谢谢gws这对你来说应该很有用:

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.

在划分活跃回报时,您还使用投资组合回报标准差。如果需要查看信息比率,理想情况下应该使用主动回报率的标准差

这应该适合您:

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.
在划分活跃回报时,您还使用投资组合回报标准差。如果需要查看信息比率,理想情况下应该使用主动回报率的标准差

当你写作时

let top pfRets bmkRets = excessReturns2 pfRets bmkRets
您没有根据传入的变量
pfRets2
bmkRets
计算
top
的值。相反,您只定义了一个函数,
top
,该函数的参数名恰好与
shapeRatio2
的参数名相同,但这些参数未指定

也就是说,这两个函数都接受名为
pfRets
bmkRets
的参数,但调用
excessReturns2
也不会自动调用具有相同参数的
top
;它只记录它的定义

显然,这同样适用于
bottom

由于希望
top
bottom
是值,因此需要定义它们而不带参数(这是值和函数之间最简单的区别:后者带参数,前者不带参数):

当你写作时

let top pfRets bmkRets = excessReturns2 pfRets bmkRets
您没有根据传入的变量
pfRets2
bmkRets
计算
top
的值。相反,您只定义了一个函数,
top
,该函数的参数名恰好与
shapeRatio2
的参数名相同,但这些参数未指定

也就是说,这两个函数都接受名为
pfRets
bmkRets
的参数,但调用
excessReturns2
也不会自动调用具有相同参数的
top
;它只记录它的定义

显然,这同样适用于
bottom

由于希望
top
bottom
是值,因此需要定义它们而不带参数(这是值和函数之间最简单的区别:后者带参数,前者不带参数):


这就是类型推断使我们很难看到发生了什么的地方。能否同时显示
top
bottom
函数的类型签名?如果有必要,您可以从REPL复制它。我的猜测是,可能您没有为函数提供所有参数,因此top或bottom不是一个数字。很抱歉,我必须理解您的意思。我相信TOP是seq->seq->seq,bottom float->float是的,这正是我的意思,你可以看到你试图用一个数字来划分一个数字列表。当然你不能这样做。请看下面我的答案。如果你想为每个日或月的回报率获得一系列夏普比率,你可以使用Seq.map。你还错误地表达了“波动性”:-)这就是类型推断让你很难看到发生了什么的原因。能否同时显示
top
bottom
函数的类型签名?如果有必要,您可以从REPL复制它。我的猜测是,可能您没有为函数提供所有参数,因此top或bottom不是一个数字。很抱歉,我必须理解您的意思。我相信TOP是seq->seq->seq,bottom float->float是的,这正是我的意思,你可以看到你试图用一个数字来划分一个数字列表。当然你不能这样做。请看下面我的答案。如果你想为每天或每月的回报率获得一系列夏普比率,你可以使用Seq.map。你也错把“波动率”说了:-)谢谢你帮我介绍了解决方案,出了什么问题,如何解决以及其他选择。你会相信我有seq.sum to calc超额收益,还有一些我在调试时如何将其更改为.zip的问题吗?一个偶然的机会,安甚至没有将此视为问题。感谢你帮助我解决了这个问题,出了什么问题,如何解决它以及其他选择。你会相信我把seq.sum改成了calc超额收益率,还有一些我在调试时把它改成.zip的方法吗?一个偶然的机会,安甚至没有把这当作问题。
let top pfRets bmkRets = excessReturns2 pfRets bmkRets
let sharpeRatio2 pfRets bmkRets x  =
    let top = excessReturns2 pfRets bmkRets
    let bottom = volatilty pfRets false x
    let result = top / bottom
    result