Оптимальная торговая позиция по распределению return
Черный ящик возвращает дискретное распределение следующего изменения цены:
r = price[t + 1] - price[t]
Перед следующим тиком можно выбрать позицию от -max_position до max_position. Прибыль одного шага равна:
profit = position * r
Верните позицию, которая максимизирует матожидание прибыли.
- если ожидаемый return положительный, верните
max_position; - если отрицательный, верните
-max_position; - если он ровно нулевой, верните
0.
Сигнатура
def optimal_position(return_distribution: list[list[float]], max_position: int) -> int:
return_distribution — список пар [return_value, probability].Решение прямо на странице
Напишите код, запустите проверки и только потом открывайте разбор.
Нажмите «Запустить проверки» или Ctrl+Enter.
Показать разбор
Подсказки
- Линейность матожидания
Позиция выбирается до тика, поэтому ее можно вынести из E[position * r].
- Не вероятность знака
Редкий большой минус может перевесить частые маленькие плюсы.
Идея решения
Матожидание прибыли при фиксированной позиции:
E[position * r] = position * E[r].
Это линейная функция по position на отрезке [-max_position, max_position]. Если наклон положительный, максимум на правой границе. Если отрицательный — на левой. При нулевом наклоне все позиции дают одинаковое матожидание, поэтому возвращаем 0.
Эталонный код
def optimal_position(return_distribution: list[list[float]], max_position: int) -> int:
expected_return = 0.0
for return_value, probability in return_distribution:
expected_return += return_value * probability
eps = 1e-12
if expected_return > eps:
return max_position
if expected_return < -eps:
return -max_position
return 0