Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Алгоритм тестирования на исторических данных.


Автор: compaq 21.8.2010, 11:50
Есть класс
Код

  class Strategy
    {
        private List<double> value;
 
        public Strategy(IList<double> value)
        {
            this.value = value;
        }
 
        private IList<double> GetExternalData(string name, int number)
        {
            
        }
        
        public int Execute()
        {
             List<double> value1 = GetExternalData(name1, 1);
             List<double> value2 = GetExternalData(name2, 2);
             return value.Last() + (value1.Last() * value2.Last());
        }
    }

в нём есть два метода, метод Execute() который вызывается когда в value добавлено новое значение и метод GetExternalData() который запрашивает у репозитория другие данные, если они понадобятся в расчётах. При работе в "боевом режиме" (то есть в “реальном времени”) все просто, добавил в value новое значение и вызвал Execute(). А как быть если нужно предварительно эту стратегию оттестировать на исторических данных, то есть значения value уже известны к примеру за 2009 год. И я хочу посмотреть как поведет себя стратегия на этих данных.

Автор: ДобренькийПапаша 21.8.2010, 13:43
Поправьте меня, если я не прав, но по-моему, то, что формальный аргумент у вас в конструктуре имеет тип интерфейса IList, не гарантирует того, что вы не получите исключение времени выполнения, так как реализация типом интерфейса IList не гарантирует его приведения к типу List<T>.

А насчёт стратегий я вообще ничего не понял:
Код

return value.Last() + (value1.Last() * value2.Last());

Этот код для меня просто сакраментальный...

Ваш класс получает List<T> каких-то значений? Если дальше вам с ними надо что-то делать, делайте в каком-нибудь методе... Не совсем понятно, что вы имели ввиду!

Автор: compaq 23.8.2010, 10:11
Цитата(ДобренькийПапаша @  21.8.2010,  13:43 Найти цитируемый пост)
1:
    
return value.Last() + (value1.Last() * value2.Last());


Да это я просто для примера привёл. 

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

 class Strategy
    {
        private List<double> mainValue = new List<double>();
        
        private IList<double> GetExternalData(string name, int number)
        {
            
        }
        
        public void Execute()
        {
             List<double> optionalValue1= GetExternalData(name1, 1);
             List<double> optionalValue2= GetExternalData(name2, 2);
             double result = mainValue.Last() + (optionalValue1.Last() * optionalValue2.Last());
        }
 
 
        public List<double> MainValue
        {
            get { return this.mainValue; }
            set { this.mainValue = value; }
        }
    }


а код для его тестирование что то типа этого  smile 
Код

    class BackTest
    {
        public void Execute(List<double> value, Strategy strategy)
        {
            foreach (double tempValue in value)
            {
                strategy.MainValue.Add(tempValue);
                strategy.Execute();
            }
        }
    }

К примеру в BackTest мы передали стратегию и заполненный value скажем от 1 до 10. 
Код

var value = new List<double>(){1,2,3,4,5,6,7,8,9,10};

При каждой итерации BackTest берет значение из value и добавляет в strategy.MainValue а потом делает расчёт strategy.Execute(); вопрос вот в чём, если на этой итерации тестирования mainValue равно 5 то как сделать так, что значения optionalValue1 и optionalValue2 получаемые из GetExternalData тоже были бы равны 5.
P.S. в репозитории который здесь не представлен данные для всех значений имеются (то есть mainValue, optionalValue1, optionalValue2 заполнены значениями от 1 до 10).

А если проще.  smile 
Нужно синхронизировать значение mainValue и optionalValue что бы к примеру не получилось так что mainValue.Last() равен 5 а optionalValue.Last() равен 6 или 3.



Автор: ДобренькийПапаша 23.8.2010, 16:53
Цитата(compaq @  23.8.2010,  10:11 Найти цитируемый пост)
как сделать так, что значения optionalValue1 и optionalValue2 получаемые из GetExternalData тоже были бы равны 5.


На каждой же итерации пробегайте в цикле по массиву чисел из репозитория, находите нужное значение через сравнение и обменивайте его местами с числом, стоящим на i-том месте (на i-той итерации).


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)