Syntax F#中是否有语法允许我重复命令行I';我已经写了?;
假设我有一个参数x,有几行使用x来计算y,现在有10个x值,我需要使用每个值来计算相应的y,我不想每次更改x并运行命令行10次,F#中是否有语法允许我重复我已经编写的命令行,这样我只需要执行一次就可以算出y的所有10个值 提前谢谢 编辑:我将代码粘贴到下面,基本上,我想要的是为不同的参数组合获取alphas,我的参数是“shreshold”、“WeeksBfReport”和“DaysBfExecution”。我有30组参数组合,所以我不想更改参数并运行命令30次。有没有办法不这样做Syntax F#中是否有语法允许我重复命令行I';我已经写了?;,syntax,f#,repeat,Syntax,F#,Repeat,假设我有一个参数x,有几行使用x来计算y,现在有10个x值,我需要使用每个值来计算相应的y,我不想每次更改x并运行命令行10次,F#中是否有语法允许我重复我已经编写的命令行,这样我只需要执行一次就可以算出y的所有10个值 提前谢谢 编辑:我将代码粘贴到下面,基本上,我想要的是为不同的参数组合获取alphas,我的参数是“shreshold”、“WeeksBfReport”和“DaysBfExecution”。我有30组参数组合,所以我不想更改参数并运行命令30次。有没有办法不这样做 let sh
let shreshold= 2.0
let ReportDate = "2008/12/15"
let ExeDate = "2009/01/05"
let WeeksBfReport = 1
let DaysBfExecution = 3
let Rf=0.01
let DateIn=ReportDate.ToDateTimeExact("yyyy/MM/dd").AddWeeks(-WeeksBfReport)
let DateOut=ExeDate.ToDateTimeExact("yyyy/MM/dd").AddWorkDays(-DaysBfExecution)
let DateInString=DateIn.ToString("yyyy/MM/dd")
let DateOutString=DateOut.ToString("yyyy/MM/dd")
let mutable FundMV=0.
let FundTicker=csvTable.AsEnumerable().Select(fun (x:DataRow) -> x.Field<string>("Ticker")).ToArray()
for i in 0..csvTable.Rows.Count-1 do
let FundUnitPrice= float(csvTable.AsEnumerable().Where(fun (x:DataRow) -> x.Field<string>(0) = FundTicker.[i]).First().Field<string>(DateInString))
let FundShares= float(csvTable1.AsEnumerable().Where(fun (x:DataRow) -> x.Field<string>(0) = FundTicker.[i]).First().Field<string>(DateInString))
FundMV<-FundMV + FundUnitPrice*FundShares
printfn "%e" FundMV
//use TMV to calculate weights of CSI300 constitutes
let mutable csiTMV=0.
let CSITMV : float array = Array.zeroCreate 300
let DictionaryCSI = Dictionary<String,float>()
for i in 0..299 do
let TMV=float(csvTable3.Rows.[i].Field<string>(DateInString))
csiTMV<-csiTMV + TMV
CSITMV.[i] <- TMV
for i in 0..299 do
let Weight=CSITMV.[i]/csiTMV
DictionaryCSI.[csvTable3.Rows.[i].Field<string>("Stock")]<-Weight
let DictionaryOldOut = Dictionary<String,float>()
let array=csvTable2.AsEnumerable().Select(fun (x:DataRow) -> x.Field<string>("Stock")).ToArray()
let OldOutTMV=ResizeArray<float>()
let DictionaryOldOutWeight = Dictionary<string,float>()
let OldOutWeight : float array = Array.zeroCreate (csvTable2.Rows.Count/2)
for i in 0..(csvTable2.Rows.Count/2)-1 do
let Weight=DictionaryCSI.Item(array.[i+(csvTable2.Rows.Count/2)])
DictionaryOldOutWeight.[csvTable2.Rows.[i+csvTable2.Rows.Count/2].Field<string>("Stock")]<-Weight
OldOutWeight.[i]<- Weight
DictionaryOldOut.[csvTable2.Rows.[i+csvTable2.Rows.Count/2].Field<string>("Stock")]<- Weight*FundMV //OldOut Moving Value
OldOutTMV.Add(Weight)
let OldOutTMVarray=OldOutTMV.ToArray() //create an array of OldOut weights and then sum up
let SumOldOutTMV=Array.fold (+) 0. OldOutTMVarray
let mutable NewInTMV=0.
let NewInWeight : float array = Array.zeroCreate (csvTable2.Rows.Count/2)
let DictionaryNewIn = Dictionary<string,float>()
let DictionaryNewInWeight = Dictionary<string,float>()
for i in 0..csvTable3.Rows.Count-300-1 do
let TMV=float(csvTable3.Rows.[i+300].Field<string>(DateInString))
NewInTMV<-NewInTMV + TMV
let Weight=TMV/(csiTMV+NewInTMV-SumOldOutTMV)
NewInWeight.[i]<-Weight
DictionaryNewInWeight.[csvTable3.Rows.[i+300].Field<string>("Stock")]<-Weight
let MovingValue=Weight*FundMV
DictionaryNewIn.[csvTable3.Rows.[i+300].Field<string>("Stock")]<-MovingValue //NewIn Moving Value
let table2array=csvTable2.AsEnumerable().Select(fun (x:DataRow) -> x.Field<string>("Stock")).ToArray()
let NewInturnoverArray : float array = Array.zeroCreate (csvTable2.Rows.Count/2)
for i in 0..(csvTable2.Rows.Count/2)-1 do
let lastday= float(csvTable2.AsEnumerable().Where(fun (x:DataRow) -> x.Field<string>(0) = table2array.[i]).First().Field<string>(DateInString))
let turnover = csvTable2.Rows.[i].ItemArray.Skip(3)|>Seq.map(fun (x:obj)-> System.Double.Parse(x.ToString()))|>Seq.toArray
let lastdayindex : (int) =
if lastday= 0. then
let lastdayfake=float(csvTable2.AsEnumerable().Where(fun (x:DataRow) -> x.Field<string>(0) = table2array.[i+2]).First().Field<string>(DateInString))
let turnoverfake = csvTable2.Rows.[i+2].ItemArray.Skip(3)|>Seq.map(fun (x:obj)-> System.Double.Parse(x.ToString()))|>Seq.toArray
Array.findIndex(fun elem -> elem=lastdayfake) turnoverfake
else
let lastdayfake=lastday
let turnoverfake=turnover
Array.findIndex(fun elem -> elem=lastdayfake) turnoverfake
printfn "%A" lastdayindex
let TurnoverNeed : float array = Array.zeroCreate 21
for t in 0..20 do
TurnoverNeed.[t] <- turnover.[lastdayindex - 20 + t]
let zerotwo : float array = Array.zeroCreate TurnoverNeed.Length
if TurnoverNeed=zerotwo then
let ave_daily_turnover = 0.
NewInturnoverArray.[i] <- ave_daily_turnover
else
let ave_daily_turnover = Seq.average(TurnoverNeed|>Seq.filter(fun x-> x > 0.))
NewInturnoverArray.[i] <- ave_daily_turnover
type totalinfo = {Name:String;Shock:float}
let NewIn=ResizeArray<totalinfo>()
for i in 0..(csvTable2.Rows.Count/2)-1 do
let MovingValue=DictionaryNewIn.Item(array.[i])
let Shock=MovingValue/NewInturnoverArray.[i]
let V= {Name=string(array.[i]); Shock=Shock}
NewIn.Add(V)
let NewInShock=NewIn.ToArray()
let OldOutturnoverArray : float array = Array.zeroCreate (csvTable2.Rows.Count/2)
for i in 0..(csvTable2.Rows.Count/2)-1 do
let turnover = csvTable2.Rows.[i+csvTable2.Rows.Count/2].ItemArray.Skip(3)|>Seq.map(fun (x:obj)-> System.Double.Parse(x.ToString()))
let zero : float array = Array.zeroCreate (turnover|>Seq.toArray).Length
if turnover|>Seq.toArray=zero then
let ave_daily_turnover = 0.
OldOutturnoverArray.[i] <- ave_daily_turnover
else
let ave_daily_turnover = Seq.average(turnover|>Seq.filter(fun x-> x > 0.))
OldOutturnoverArray.[i] <- ave_daily_turnover
let OldOut=ResizeArray<totalinfo>()
for i in 0..(csvTable2.Rows.Count/2)-1 do
let MovingValue=DictionaryOldOut.Item(array.[i+csvTable2.Rows.Count/2])
let Shock=MovingValue/OldOutturnoverArray.[i]
let V= {Name=string(array.[i+csvTable2.Rows.Count/2]); Shock=Shock}
OldOut.Add(V)
let OldOutShock=OldOut.ToArray()
let DoIn=NewInShock |> Array.filter (fun t -> t.Shock >= shreshold)
let DoOut=OldOutShock |> Array.filter (fun t -> t.Shock >= shreshold)
let DoInTicker= Array.map (fun e -> e.Name) DoIn
let DoOutTicker= Array.map (fun e -> e.Name) DoOut
let DoInWeight : float array = Array.zeroCreate DoInTicker.Length
for i in 0..DoInTicker.Length-1 do
DoInWeight.[i] <- DictionaryNewInWeight.Item(DoInTicker.[i])
let TotalDoInWeight= Array.fold (+) 0. DoInWeight
let DoInRatioX : float array = Array.zeroCreate DoInTicker.Length
for i in 0..(DoInTicker.Length)-1 do
DoInRatioX.[i] <- DoInWeight.[i]/TotalDoInWeight
let Beta=csvTable2.AsEnumerable().Select(fun (x:DataRow) -> x.Field<string>("Beta")).ToArray()
//let NewInBeta : float array = Array.zeroCreate (csvTable2.Rows.Count/2)
let DictionaryNewInBeta = Dictionary<string,float>()
for i in 0..(csvTable2.Rows.Count/2)-1 do
// NewInBeta.[i] <- float(Beta.[i])
DictionaryNewInBeta.[csvTable3.Rows.[i+300].Field<string>("Stock")]<-float(Beta.[i])
let DoInBeta : float array = Array.zeroCreate DoInTicker.Length
for i in 0..DoInTicker.Length-1 do
DoInBeta.[i] <- DictionaryNewInBeta.Item(DoInTicker.[i])
let mutable PortfolioBeta=0.
for i in 0..(DoInTicker.Length)-1 do
PortfolioBeta <- PortfolioBeta + DoInRatioX.[i] * DoInBeta.[i]
let mutable PortfolioReturn= 0.
for i in 0..DoInTicker.Length-1 do
let PriceIn= float(csvTable4.AsEnumerable().Where(fun (x:DataRow) -> x.Field<string>(0) = DoInTicker.[i]).First().Field<string>(DateInString))
let PriceOut= float(csvTable4.AsEnumerable().Where(fun (x:DataRow) -> x.Field<string>(0) = DoInTicker.[i]).First().Field<string>(DateOutString))
PortfolioReturn <- PortfolioReturn + (1./float(DoInTicker.Length))*(PriceOut - PriceIn)/PriceIn
let IndexIn= float(csvTable4.AsEnumerable().Where(fun (x:DataRow) -> x.Field<string>(0) = "000300.SH").First().Field<string>(DateInString))
let IndexOut= float(csvTable4.AsEnumerable().Where(fun (x:DataRow) -> x.Field<string>(0) = "000300.SH").First().Field<string>(DateOutString))
let MarketReturn= (IndexOut-IndexIn)/IndexIn
let Alpha= PortfolioReturn-Rf-PortfolioBeta*(MarketReturn-Rf)
let shreshold=2.0
let ReportDate=“2008/12/15”
让ExeDate=“2009/01/05”
让WeekSBReport=1
让DaysBfExecution=3
设Rf=0.01
让DateIn=ReportDate.ToDateTimeExact(“yyyy/MM/dd”).AddWeeks(-WeeksBfReport)
let DateOut=ExeDate.ToDateTimeExact(“yyyy/MM/dd”).AddWorkDays(-DaysBfExecution)
让DateInString=DateIn.ToString(“yyyy/MM/dd”)
let DateOutString=DateOut.ToString(“yyyy/MM/dd”)
设可变FundMV=0。
让FundTicker=csvTable.AsEnumerable().Select(fun(x:DataRow)->x.Field(“Ticker”).ToArray()
对于0中的i..csvTable.Rows.Count-1 do
让FundUnitPrice=float(csvTable.AsEnumerable().Where(fun(x:DataRow)->x.Field(0)=FundTicker[i]).First().Field(DateInString))
让FundShares=float(csvTable1.AsEnumerable().Where(fun(x:DataRow)->x.Field(0)=FundTicker[i]).First().Field(DateInString))
FundMV elem=最后一天假)营业额假
其他的
让lastdayfake=lastday
让营业额假=营业额
Array.findIndex(fun elem->elem=lastdayfake)turnoverfake
printfn“%A”lastdayindex
让TurnoverNeed:float array=array.zeroCreate 21
对于0..20中的t
营业额需要[t]x>0。))
NewInturnoverArray.[i]Seq.map(fun(x:obj)->System.Double.Parse(x.ToString())
设零:float数组=array.zeroCreate(营业额|>Seq.toArray).长度
如果营业额|>Seq.toArray=零,则
假设平均每日营业额=0。
OldOutturnoverArray.[i]序列过滤器(趣味x->x>0.))
OldOutturnoverArray.[i]Array.filter(乐趣t->t.Shock>=shreshold)
让DoOut=OldOutShock |>Array.filter(乐趣t->t.Shock>=shreshold)
让DoInTicker=Array.map(fune e->e.Name)DoIn
让DoOutTicker=Array.map(fune e->e.Name)DoOut
让DoInWeight:float数组=array.zeroCreate DoInTicker.Length
对于0..doinicker.Length-1 do中的i
DoInWeight。[i]我也不完全确定您需要什么(其他约束和动机是什么),但如果您有一些交互式代码可以进行单个计算,请说:
let x = 10
let y = x * x
您可以将其转换为对多个输入执行相同计算的代码,例如,使用列表:
let xs = [1; 10; 100]
let ys = [ for x in xs -> x * x ]
但如前所述,这取决于您实际想要实现的目标——如果您可以添加一个实际的示例,说明您正在尝试做什么,这将非常有用。查看您的代码,您希望做类似的事情
let run shreshold ReportDate ExeDate WeeksBfReport DaysBfExecution Rf =
//The entire rest of the code indented - you may want to return alpha etc
然后,您可以像John所说的那样插入参数值,将其全部放入一个函数中,接受不断变化的值作为参数。可以使用记录将参数组合存储在列表中,如下所示
type ReportParameters = {
shreshold: float;
ReportDate: string;
ExeDate: string;
WeeksBfReport: int;
DaysBfExecution: int;
Rf: float;
}
type Report = {
NewInShock: totalinfo;
IndexIn: float;
// etc
}
let createReport (reportParams:ReportParameters) : Report =
let shreshold = reportParams.shreshold
let ReportDate = reportParams.ReportDate
let ExeDate = reportParams.ExeDate
let WeeksBfReport = reportParams.WeeksBfReport
let DaysBfExecution = reportParams.DaysBfExecution
let Rf = reportParams.Rf
// Your function code HERE
// Remember to move all type definitions out of this scope.
{ // Report data to return.
NewInShock = NewInShock;
IndexIn = IndexIn;
// etc
}
使用代码非常简单,如下所示:
let reportsToBeGenerated = [
{ shreshold = 2.0; ReportDate = "2008/12/15"; ExeDate = "2009/01/05"; WeeksBfReport = 1; DaysBfExecution = 3; Rf = 0.01 };
{ shreshold = 1.5; ReportDate = "2009/12/15"; ExeDate = "2010/01/05"; WeeksBfReport = 2; DaysBfExecution = 2; Rf = 0.01 };
]
let reports = reportsToBeGenerated |> List.map createReport
没有完全理解你希望程序在这里做什么。你能给出一个你不想写的代码的缩小的例子吗?你的代码看起来并没有缩小到足够小的程度,在仅仅将一个函数应用于一组30个值方面,你的代码没有得到足够的帮助。只需将整个过程封装到一个函数中,使用这三个参数(而不是现在的硬编码常量)并返回应该返回的内容。然后使用Tomas的答案将不同的参数应用到新创建的函数中。-1这是一个巨大的代码量,希望这里的人们通读,而非惯用代码。请看,重点放在短文上。.-]很抱歉没有缩减我的代码,但我不希望人们通读所有代码。我只是想告诉大家我的参数是什么以及我返回的是什么。谢谢你的评论,我已经添加了我的代码,我希望我现在清楚我需要什么。如果我使用这个,我必须在最后一行包含所有参数吗?谢谢你耐心地查看我的代码,这正是我想要的。