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