Как эффективно структурировать данные в f # - PullRequest
0 голосов
/ 10 сентября 2018

Я довольно новичок в F # и все еще пытаюсь решить, какой должна быть лучшая структура для моей финансовой программы (бэк-тестирование). Поскольку данные неизменны, я думаю, что «тяжелые» / все-в-одном структуры не могут быть идеальными.

Вот что я пытаюсь достичь:

  1. Механизм тестирования на истории, который создает стратегию каждые рабочие дни. Стратегия состоит из нескольких инструментов с последовательностью / списком сделок (торговая дата / количество / цена)
  2. Затем я ежедневно запускаю расчет (стоимость, риски и т. Д.) По всем этим позициям для каждого портфеля. Я также добавляю сделки к каждому инструменту каждый день, когда корректирую позицию.

Как я его построил:

  • Список или последовательность дат: [D1 .. Dn]
  • Список или последовательность портфолио Pi ​​[P1 .. Pn] (с несколькими инструментами). Каждый portoflio начнет свою жизнь в разных 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 (Инструмент), показывающий, скажем, P & L.

Однако для каждого портфеля Pi я перебираю все даты, чтобы проверить, нужно ли мне корректировать портфель, а затем добавить сделку в список сделок, это означает, что каждый день, для каждого портфеля, для каждого инструмента я создание нового BackTesting (не изменяемого). Я полагаю, что такой способ рассуждений намного больше ООП, чем FP, но я немного растерялся из-за правильных шаблонов использования (используемые мной книги F # не очень ясны в отношении структуры данных, которая лучше всего работает для FP - или я не совсем понял их).

Возможно, я не совсем уверен, но если у кого-то есть направление, на которое я должен смотреть (или какая-либо полезная документация / поддержка по этому вопросу), пожалуйста, не стесняйтесь. Большое спасибо за вашу помощь.

1 Ответ

0 голосов
/ 05 октября 2018

Поскольку вы начинаете с F #, я предлагаю вам не слишком беспокоиться о программировании чисто функциональным способом. Если вы пришли из императивного стиля программирования, это может быть слишком много изменений, и вы можете быть обескуражены. Переход от императивного стиля к функциональному стилю требует времени и постепенно.

Хорошо, что F # позволяет вам быть обязательным! Так что программируйте как на других языках:

  • Используйте глобальные mutable переменные, когда вам это подходит.
  • Используйте for и while
  • Знаете ли вы, что элементы массива являются изменяемыми?

По мере продвижения вы узнаете, как функционировать, некоторые вещи действительно просты в использовании. сразу:

  • Определенно используйте option, никогда null
  • Попробуйте использовать map, filter, choose сверх list, array или seq.

Со временем вы, естественно, будете больше стремиться к функциональному стилю, но вам не придется прыгать сразу. Один из лучших ресурсов для начала - это https://fsharpforfunandprofit.com/, в котором полно очень хороших статей, слайдов, видео, переданных в понятной форме.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...