Pull to refresh

Comments 13

Да, в любом случае мне пришлось бы писать алгоритм поиска ближайшего торгового дня и какой-то момент я подумал, что лучше управлять этим внутри проекта, но после вашего комментария еще раз взглянул на то, что предоставляет moex и кажется, что стоит брать информацию оттуда. Как минимум, я вижу свою ошибку, что я брал производственный календарь в качестве источника данных, но это не совсем верно, так как не рабочий день != не торговый день. Например, 2024-01-03 был таким днем - не рабочий, но торговый (и еще несколько подобных ему).

Кажется, что я могу уйти от констант и ориентироваться на то, что вы указали. Спасибо!

В велосипеде ещё надо учесть закрытые торги на самой бирже.

def get_last_trade_day(cls, start_dt: datetime = datetime.now()) -> dict[str, str | bool]:


Это не очень удачно написанная функция.

Про то, что она не нужна, уже выше разобрали.

dict[str, str | bool] Не сразу узнал в этой анотации день.
Используйте объекты вместо примитивов. Получите автодополнение и простоту понимания.

class TraidingDay(NamedTuple):
    trade_date: date
    is_trading_now: bool

is_trading_now я бы в функцию превратил, чтобы не хранить быстро протухающие данные.

Функция делает две вещи, определяет последний день и проверяют послений ли день сегодня. Стоит разбить на 3 функции чтобы получилось что-то типа.

Вместо одно большой получился несколько маленьких.

def get_last_trade_day(...)
   last_trading_date = _get_last_trading_date(...)
   is_trading =  _is_trading(...)
   ...

Спасибо за комментарии! Постараюсь вернуться к ним, как будет время на переработку.

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

for days_before in range(cnst.MAX_DAYS_WEEKENDS):
    ... = _is_this_day_last(start=start_dt, days_before=days_before)

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

В тоже время, я действительно могу отказаться от констант в виде кортежа из значений WORKDAYS и WEEKDAYS. К слову, я уже это внедрил в проект.

Не совсем понял, что именно не так с данным тайп хинтом?
dict[str, str | bool]
Функция возвращает словарь, ключи которого - это строка, а значения строка или булево значение - это так и есть в реальности.

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

Идея сделать is_trading_now() функцией звучит весьма верно, только не совсем уверен, действительно ли полезна для проекта такая высокая актуальность данных, хотя, конечно, замечание верное.

Не совсем понял, что именно не так с данным тайп хинтом? dict[str, str | bool]


Для человека он бесполезен. Чтобы работать с возвращаемым значением, мне нужно будет смотреть в функцию. Какие там ключи? Какого типа у каждого ключа значение?

Для статического анализатора тоже. Он постоянно будет спотыкаться на том, что у него либо один тип, либо другой. Тип Union (str | bool) подходит только для аргументов, как возвращаемое значение он вреден.

Да, я согласен, что подобный хинт - не лучшее решение. В ближайшее время постараюсь переработать на TypedDict или NamedTuple. Спасибо за комментарий.

Sign up to leave a comment.

Articles