如何在f#中有效地构造数据

时间:2018-09-10 11:11:42

标签: f#

我对F#相当陌生,仍在尝试确定财务(回测)程序的最佳结构。 由于数据是不可变的,我认为“繁重” /多合一的结构可能不是理想的选择。

这是我想要达到的目标:

  1. 一个回测引擎,每个工作日都会创建一个策略。 该策略包括一些带有交易顺序/清单的工具 (交易日期/数量/价格)
  2. 然后,我每天针对每个投资组合的所有头寸进行计算(价值,风险等)。调整头寸时,我每天还会向每种工具添加交易。

我是如何构造的:

  • 日期列表或后缀:[D1 .. Dn]
  • 投资组合Pi [P1 .. Pn]的列表或后续列表(使用几种工具)。每个投资组合都将在不同的Di
  • 处开始其生活
  • 对于每个投资组合,我将在工具上进行一些日常交易 当我计算价值,损益,风险...

我现在使用的内容(非常简化):

type Instrument1 = {
  some specifications
}

type Instrument2 = {
  some specifications
}

type Instrument = 
  | Inst1 of Instrument1
  | Inst2 of Instrument2


type Trade = {
  Dt ; DateTime
  Qty : float
  Price : float }

type Portfolio = {
   InitDate : DateTime // one of the Di above
   Inst : Instruments
   Trades : Trade seq }

type BackTesting =
   Dates : DateTime seq
   Port : Portfolio seq }

然后我创建了seq(工具)的seq(投资组合)的seq(日期),显示了损益表。

但是,对于每个投资组合Pi,我都会在所有日期进行迭代,以检查是否需要调整投资组合,然后将交易添加到交易清单中,这意味着每一天,每个投资组合,每种工具创建一个新的BackTesting(不可更改)。我相信这种推理方式比FP更具面向性,但是我对使用的正确模式有些迷茫(我使用的F#书籍对于最适合FP的数据结构并不清楚,或者我不是很了解他们)。

我可能不太清楚,但是如果有人对我有指导的意见(或有关此问题的任何有用的文档/支持),请不要犹豫。非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

由于您是从F#开始的,所以我对您的建议是不要过于担心以纯粹的功能方式进行编程。如果您来自命令式编程风格,那可能是太多的更改,并且您可能会灰心。从命令式风格到功能性风格的转变需要时间,而且是逐渐的。

好消息是F#也使您势在必行! 因此,像使用其他语言一样编程:

  • 在最适合您时使用全局mutable变量。
  • 使用forwhile
  • 您知道数组元素是可变的吗?

随着您的进步,您将学习功能方式,某些事情确实很容易使用 立即:

  • 绝对使用option,从不使用null
  • 尝试在mapfilterchoose上使用listarrayseq

随着时间的流逝,您自然会更偏向于功能性风格,但是您不必一次全部跳下去。 https://fsharpforfunandprofit.com/是最好的入门资源之一,其中包含以清晰的方式传达的非常好的文章,幻灯片和视频。

祝你好运!