Changellenge >> Cup Technical 2013
Реализация алгоритма межбиржевого арбитража с использованием лент Боллинджера Григорий Михеев Николай Терновой Анастасия Булина Ксения Корнева
35
35
Наш подход
Модификация программытестера
Нахождение максимально возможной прибыли из тестовых данных
Введение функции f(t)=Pa-Pb
Визуальное изучение графика f(t)
Построение доверительных интервалов для экстремумов f(t)
Вывод в файл показателя прибыли после каждой операции – позволяет изучать, как изменяется прибыль, находить тренды
Changellenge Cup Technical 2013 >> 35 team
2
35
Алгоритм
Алгоритм использует тот принцип, что линия f(t) в большинстве случаев осциллирует между линиями поддержки и сопротивления. Таким образом, с большой вероятностью края ленты Боллинджера являются локальными экстремумами функции f(t), т.е. касание (приближение) линии поддержки/сопротивления является сигналом для реализации возможности арбитража
Исключаем из рассмотрения абсолютные значения цен т.к. важна только прибыль, полученная непосредственно на арбитраже
Вводим функцию спреда f(t)=Pa-Pb (спредом будем называть разницу в цене между двумя биржами)
Для работы с получившимся временным рядом используем индикатор Ленты Боллинджера (Bollinger Bands).
Создаем Average)
скользящее
среднее
(Moving
Создаем линию сопротивления и линию поддержки, расстояние между линиями и скользящим средним равно 2σ, где σ – среднеквадратическое отклонение величины f(t)
Changellenge Cup Technical 2013 >> 35 team
3
35
Диаграмма классов Arb35 -MathContext: MathContext = new MathContext(16, RoundingMode.HALF_EVEN) -balances: Balance[*] = new Balance[2] -sln: BigDecimal = new BigDecimal(0.0000001, MathContext) -convertorPrice: DecimalFormat = new DecimalFormat("0.###") -convertorAmount: DecimalFormat = new DecimalFormat("0.########") -Fee: BigDecimal = new BigDecimal(0.0025, MathContext) -FeeMult: BigDecimal = new BigDecimal(1).subtract(Fee, MathContext) -frameWidth: int = 30 -multiplier: BigDecimal = new BigDecimal(10) -profitTreshold: BigDecimal = new BigDecimal(0.00005, MathContext) -minAmount: BigDecimal = new BigDecimal(0.01, MathContext) -maverage: MovingAverage = new MovingAverage(frameWidth)
Balance +XXX: BigDecimal +YYY: BigDecimal
<<create>>-Arb35() +main(args: String) -run() -parseAndTrade(input: String) -trade(priceXXX: BigDecimal, amountXXX: BigDecimal, priceYYY: BigDecimal, amountYYY: BigDecimal) -parseAndUpdateBalance(input: String)
Series -N: int = 5 -MathContext: MathContext = new MathContext(16, RoundingMode.HALF_EVEN) -rawSeries: Linked List <BigDecimal> = new LinkedList <BigDecimal>(); <<create>>+Series() <<create>>+Series(N: int) +addObservation(value: BigDecimal) +getAverage(): BigDecimal +size(): int +getSeries(): LinkedList <BigDecimal> +getDeviation(): BigDecimal
Changellenge Cup Technical 2013 >> 35 team
MovingAverage -N: int = 20 -rawSeries: Series -averages: Series <<create>>+MovingAverage() <<create>>+MovingAverage(N: int) -initSeries() +addObservation(value: BigDecimal) +getDeviation(): BigDecimal +getLastAverage(): BigDecimal
4