DataTables, DataSets, Entity Framework, LINQ & Lambda Expression для финансового технического анализа C # - PullRequest
2 голосов
/ 01 июня 2011

это скорее архитектурный вопрос, а не конкретная проблема с кодом, так как я затронул основной блок в том, как я буду продолжать этот проект.

Например, я создаю программное обеспечение для финансового сканирования, которое фильтрует складские запасы по определенным критериям. Например, если из 8000 акций его цена закрытия сегодня выше SMA 100, а 10 дней назад цена закрытия ниже SMA 100, верните мне этот символ акции.

Однако обратите внимание, что SMA (Простое скользящее среднее) рассчитывается с использованием данных за последние 100 дней в приведенном выше примере, но может случиться так, что мы можем изменить эти 100 дней, скажем, на другое значение, 105 или 56, будь что угодно.

В моей базе данных у меня есть определение таблицы EODData с несколькими столбцами, вот определение ниже;

EODData
sSymbol nvarchar(6)
mOpen money
mClose money
mHigh money
mLow money
Date datetime

В таблице будут храниться данные за конец года для Американской фондовой биржи за 3 года, что составляет приблизительно 6 264 000 строк, без проблем для MS SQL 2008 R2.

Теперь я в настоящее время использую Entity Framework для извлечения данных из моей базы данных, однако, каков будет лучший способ запустить или создать мой фильтр, поскольку SMA должен рассчитываться для каждого символа или базового тикера при каждом сканировании? выполнено, потому что переменная 100 дней может измениться.

Должен ли я преобразовывать объекты сущностей в набор данных для фильтрации в памяти и т. Д.

Я не очень много работал с DataSets или DataTables, поэтому я ищу указатели.

Обратите внимание, что SMA является лишь одним из фильтров, у меня есть другой алгоритм, который вычисляет EMA (экспоненциальное скользящее среднее, которое является гораздо более сложной формулой) и MACD (дивергенция схождения скользящего среднего).

Есть мнения?

1 Ответ

0 голосов
/ 01 июня 2011

Как насчет размещения расчетов в базе данных? У вас есть таблица EODData, и это здорово. Создайте другую таблицу, которая является вашими SummaryData, что-то вроде:

SummaryData
stockSymbol varchar(6) -- don't need nvarchar, since AMSE doesn't have characters outside of normal English alphabet.
SMA decimal
MCDA decimal
EMA decimal

Затем вы можете написать некоторые хранимые процедуры, которые будут выполняться в конце дня, и обновить эту таблицу на основе данных в вашей таблице EODData. Или вы можете написать триггер, чтобы каждая вставка таблицы EODData обновляла сводные данные в вашей базе данных.

Одним из недостатков этого является то, что вы помещаете некоторую бизнес-логику в базу данных. Другим недостатком является то, что вы будете обновлять статистические данные по биржевому символу, которые вам могут не понадобиться. Например, если никто никогда не хочет увидеть, что сделал XYZZ, то вычисления на него бессмысленны.

Однако эта вторая проблема смягчается тем фактом, что: 1. вы запускаете SP на сервере, который MSSQL может оптимизировать, и 2. вы можете запускать их в нерабочее время, когда все дома, поэтому, если это займет немного времени вы не затронуты. (Если честно, я бы предположил, что если они будут такими вычислениями, как скользящие средние, мин / макс и т. Д., SQL не будет таким медленным.)

Одним из преимуществ является то, что ваши запросы должны быть быстрыми, потому что вы можете написать

select stockSymbol from SummaryData where SMA > 10 вы уже сделали расчет.

Другим преимуществом является то, что данные будут меняться только один раз в день (в конце рабочего дня), но вы можете запрашивать несколько раз в течение дня. Например, вы хотите выполнить несколько разных запросов сегодня для всех данных, включая вчера. Если вы выполнили 10 запросов, а ваш партнер выполнил те же 10 запросов, вы просто выполнили те же вычисления. (По сути, напишите один раз, прочитайте много.)

...