Giter Site home page Giter Site logo

interactive_brokers_tax's People

Contributors

agiltrue avatar airens avatar alexnik42 avatar dependabot[bot] avatar dryaz avatar hh-h avatar niknozhenko avatar php-coder avatar qengine avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

interactive_brokers_tax's Issues

License?

Привет! Добавь, пожалуйста, лицензию, по которой распространяется твой код, спасибо!

You're under no obligation to choose a license. However, without a license, the default copyright laws apply, meaning that you retain all rights to your source code and no one may reproduce, distribute, or create derivative works from your work. If you're creating an open source project, we strongly encourage you to include an open source license. The Open Source Guide provides additional guidance on choosing the correct license for your project.

https://docs.github.com/en/github/creating-cloning-and-archiving-repositories/licensing-a-repository#choosing-the-right-license

Сделки без комиссии

Выглядит. что удалять все записи без комиссии не совсем верно. У меня в отчете есть сделки со значением 0 в позиции Comm/Fee в результате чего они выкидываются. Может быть есть более удачный способ фильтровать записи о сделках?

    if "Trades" in data:
        trades = data["Trades"]
        trades.columns = [col.lower() for col in trades]
        trades = trades.rename(columns={"comm/fee": "fee", "date/time": "date", "t. price": "price", "comm in usd":"fee"})
        trades = trades[trades.header == "Data"]
        trades = trades[trades.fee < 0]                          #  <- здесь
        trades.date = pd.to_datetime(trades.date)
    else:

Вопрос по tbl_cashflow

Привет, допиливаю твой скрипт, возник вопрос по tbl_cashflow. Переменная передается в рендер шаблона, но никак не используется, какой был в этом смысл? Вот место

'tbl_cashflow': cashflow_res.to_dict(orient='records') if cashflow_res is not None else {},

И еще один вопрос, зачем вот этот блок?
def cashflow_calc():
print(f"Расчет таблицы переводов...")
res = cashflow[["date", "currency", "amount"]].copy()
res["type"] = ["Перевод на счет" if amount > 0 else "Снятие со счета" for amount in cashflow.amount]
cashflow_rub_sum = res[res.currency == "RUB"].amount.sum().round(2)
cashflow_usd_sum = res[res.currency == "USD"].amount.sum().round(2)
cashflow_eur_sum = res[res.currency == "EUR"].amount.sum().round(2)
return res, cashflow_rub_sum, cashflow_usd_sum, cashflow_eur_sum
if cashflow is not None:
cashflow_res, cashflow_rub_sum, cashflow_usd_sum, cashflow_eur_sum = cashflow_calc()
print("\ncashflow_res:")
print(cashflow_res.head(2))
print(cashflow_rub_sum, cashflow_usd_sum, cashflow_eur_sum)
print("\n")
else:
print("Нет данных по переводам")

Спасибо!

FIFO/LIFO

Приветствую!
В шаблоне указано, что расчёт производится методом FIFO.
Хотелось бы уточнить почему выбран FIFO?
FIFO помогает уменьшить налогооблагаемую базу?
Насколько я понимаю, выбор порядка реализации свободный.
За LIFO у меня следующие аргументы:

  • однодневный трейд (купили и продали тем же днём) происходит без валютной разницы;
  • возможны бонусы за удержание актива (например налоговые льготы при удержании акций РФ);

То есть вроде бы LIFO выглядит более логично.

Не могли бы Вы пояснить этот вопрос, пожалуйста?

Некорректно считается доход от акций

Спасибо за полезную программу!

То что в шаблоне называется как "доход от продажи ценных бумаг ({{income_rub_sum}} руб.)" на самом деле доходом не является, а является налоговой базой (без учёта комиссий брокера).
Так делать нельзя, в 3-НДФЛ доход это полный доход, нельзя указывать в 2-НДФЛ в качестве дохода уже посчитанную налоговую базу. Это ошибка.
Как это правильно считать:

  1. Доход от акций это полная выручка от продажи акций (1530)
  2. Вычетом является стоимость покупки этих акций плюс комиссии брокера (201)
    В шаблоне нужно нарисовать эти две цифры которые будут потом добавлены в 3-НДФЛ.

@airens можете это исправить ? Я пробовал сделать сам, но питон сильнее меня.

Поддержка шортов

Валерий, здравствуйте!

Озадачился заполнением декларации для налоговой
Нашел ваш чудесный скрипт, все красиво делает, благодарю за проделанную работу!
Не хватает поддержки шортов, хочу внести изменения чтобы такие операции тоже поддерживались
Подскажите, как это лучше сделать, на что обратить внимание?

Использование стратегий приводит к другой схеме

Сначала показалось, что стратегии именно ломают отчет и создают доп. таблицу именно для стратегии - это не так.

Пропуск таблицы просто не увидит купленные позиции позже, т.е. IBKR разобьет трейды на две таблицы, одна из которых крешнет скрипт.

@airens попробую пофиксить у себя и создать ПР, но вот это

if section == "Trades" and column =="Account":
                line = file.readline()
                continue

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

Открытая позиция не переходит "через год"

Есть тикер XXX.
В 2019 купил 7 лотов.
В 2019 продал 2 лота.

Итого на конце 2019 года осталось 5 лотов.

В 2020 продал оставшиеся 5 лотов.

Скрипт говорит, что Short не поддерживается.

В сгенеренной папке Trades от 2019 ясно показывает, что было куплено 7 и продано 2, т.е. есть знание о том, что 5 шт. осталось на конец года, которое можно использовать для дальнейшего расчета налоговой базы.

Trades при обмене валют имеет другую схему

CleanShot 2020-12-30 at 16 26 05@2x

При выгрузке произвольного отчета на год в него попадают также сделки по обмену валюты.
Кроме того, что они корректно не отобразаться - они ломают генерацию, потому что заголовок таблицы не fee/comm а comm in usd

Пока лечится локально через переименование и этого заголовка:

trades = trades.rename(columns={"comm/fee": "fee", "date/time": "date", "t. price": "price", "comm in usd":"fee"})

Не пропускать все уплаченные налоги, если размер таблиц не совпадает

Сейчас

if div.shape[0] != div_tax.shape[0]:
            print("Размеры таблиц дивидендов и налогов по ним не совпадают. Налог на дивиденды будет 13%")

У меня в отчете от IBKR почему-то некоторые дивы указаны как уплаченные, дальше возвращенные и снова уплаченные, например для HHR.

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

Ошибка

File "D:\pythonProject\test3.py", line 90, in get_crs_tables
df = pd.read_excel(response.content).rename(columns={"data": "date", "curs": "val"})

for elem in self.tree.iter() if Element_has_iter else self.tree.getiterator():
AttributeError: 'ElementTree' object has no attribute 'getiterator'

Использование "стратегий" от IBKR ломает генерацию отчета

Если использовать strategy в ibkr, то при генерации найдется еще одна графа Trades, таблица которой имеет другую схему.

Пока локально решилось пропуском таблицы, если третий столбец имеет определенное название:

split_report:

if section == "Trades" and column =="Account":
                line = file.readline()
                continue

Неверный расчет комиссии при продаже не всех акций (перенос позиции через год)

Кажется, комиссия при продаже не всех акций неверно учитывается.

Допустим, было куплено 10 акций XYZ, а затем продано 8. Все сделки с комиссией $1.0. В отчете это будет выглядеть как:

Тикер Тип операции Количество, шт. Комиссия
XYZ Покупка 8 1.0
Продажа 8 1.0

Думаю, что комиссия за покупку должна быть 1.0*8/10 = 0.8, а оставшаяся комиссия за покупку должна быть учтена при продаже оставшихся 2-х акций.

Некорректная работа с акциями у которых был reverse split

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

Предложение

Отличное начинание!
Есть предложение:

  1. Дополнить инструкцию: «Отчеты должны быть только на англ. языке (русский не работает при создании файлов в директории получается не корректное имя файла).
  2. Доработать макет пояснительной записки (убрать ошибки и включить опись документов предоставляемых в налоговую документов).
  3. Доработать программу для других секций (например, налоги с процентов от пользования деньгами и акциями).
  4. Готов оказать содействие проекту (могу программировать на Питоне).
    Как связаться с Вами оставьте координаты.
    Напишите мне в ответ [email protected]
    Большое спасибо!

Дробные акции

В 2020 году IB добавил возможность торговать дробными акциями. Для позиций где участвовали дробные акции выдается ошибка:
"Актив продан в большем количестве, чем покупался. Операции SHORT не поддерживаются."
Дело способе обработки сделок по одной акции....
for _ in range(int(abs(quantity))):

Бинарный шаблон непрактичен

Думаю многие пользуются программой и вносят свои изменения и страдают от того, что шаблон является бинарником (template.docx).
Такой формат шаблона не даёт возможности увидеть в коммитах какие правки в него были внесены и не даёт добавить / убрать свои правки при необходимости. git mergetool конечно не работает. Это ведёт к тому что люди не хотят (и не могут) пулить свои патчи.
С этой проблемой столкнулся и я при последнем обновлении, пришлось шаблон копировать и пределывать всё с нуля, у меня соответственно тоже бинарник.
Можно ли как-то сделать шаблон в виде текста ? К примеру создавать его из html или генерировать docx с помощью кода на питоне?

Не срабатывает скрипт из-за round()

на 428 строке

# In[12]:


div_final_tax_rest_sum = (div_tax_rest_sum + div_accurals_tax_rest_sum).round(2)
div_final_sum = (div_sum + div_accurals_sum).round(2)
div_tax_paid_final_sum = (div_tax_paid_rub_sum + div_accurals_tax_paid_rub_sum).round(2)
div_tax_need_pay_final_sum = (div_tax_rest_sum + div_accurals_tax_rest_sum).round(2)

вот так сработало:

div_final_tax_rest_sum = round((div_tax_rest_sum + div_accurals_tax_rest_sum), 2)
div_final_sum = round((div_sum + div_accurals_sum), 2)
div_tax_paid_final_sum = round((div_tax_paid_rub_sum + div_accurals_tax_paid_rub_sum), 2)
div_tax_need_pay_final_sum = round((div_tax_rest_sum + div_accurals_tax_rest_sum), 2)

Конфликт в зависимостях для urllib3==1.26.5

macOS Monterey: 12.3.1 (21E258)
python 3.9.12 через brew

ERROR: Cannot install -r requirements.txt (line 14) and urllib3==1.26.5 because these package versions have conflicting dependencies.

The conflict is caused by:
The user requested urllib3==1.26.5
requests 2.23.0 depends on urllib3!=1.25.0, !=1.25.1, <1.26 and >=1.21.1

Крешится исправление таблицы дивов

Размеры таблиц дивидендов и налогов по ним не совпадают. Попробуем исправить...
Traceback (most recent call last):
  File "/Users/dmitryryazantsyev/workspace/ibkrTaxFork/ib.py", line 255, in <module>
    cashflow, trades, comissions, div, div_tax, div_accurals, interests = load_data()
  File "/Users/dmitryryazantsyev/workspace/ibkrTaxFork/ib.py", line 231, in load_data
    df.loc[index] = tax_row.T.squeeze()
  File "/usr/local/lib/python3.9/site-packages/pandas/core/indexing.py", line 691, in __setitem__
    iloc._setitem_with_indexer(indexer, value, self.name)
  File "/usr/local/lib/python3.9/site-packages/pandas/core/indexing.py", line 1628, in _setitem_with_indexer
    self._setitem_with_indexer_missing(indexer, value)
  File "/usr/local/lib/python3.9/site-packages/pandas/core/indexing.py", line 1919, in _setitem_with_indexer_missing
    value = Series(value, index=self.obj.columns, name=indexer)
  File "/usr/local/lib/python3.9/site-packages/pandas/core/series.py", line 239, in __init__
    if is_empty_data(data) and dtype is None:
  File "/usr/local/lib/python3.9/site-packages/pandas/core/construction.py", line 628, in is_empty_data
    is_simple_empty = is_list_like_without_dtype and not data
  File "/usr/local/lib/python3.9/site-packages/pandas/core/generic.py", line 1439, in __nonzero__
    raise ValueError(
ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Код последнего мастера AS IS.

CSV для воспроизведения:
https://drive.google.com/file/d/1U4grcEppUS1T7OmHdA9ZtuqDr7XQs8wt/view?usp=sharing

Отчеты

Спасибо за скрипт! Я, правда, еще не отправил отчёт, но, надеюсь, он мне сильно облегчит задачу.
В сформированном документе в конце есть список прилагаемых к отчету документов.
А можете, пожалуйста, вписать в README, какому из отчетов в IB соответсвует каждый пункт?
Со справкой и договором примерно понятно (хотя у меня в отчетах они идут либо в одном документе, либо только справка, отдельно договора нет), а вот платежные поручения – это pdf версия того отчета, на основе которого генерируется пояснительная записка?

TypeError: loop of ufunc does not support argument 0 of type float which has no callable rint method

res["tax_paid"] = -div_tax["amount"].values.round(2) if div_tax is not None else 0

Падает на этой строчке и начинает работать только если поменять на  res["tax_paid"] = 0

Я пока плохо разбираюсь в Python и не знаю как поправить

Ругается следующим образом:

Расчет таблицы дивидендов...
AttributeError: 'float' object has no attribute 'rint'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "C:\Broker\1\ib.py", line 385, in
div_res = div_calc()
File "C:\Broker\1\ib.py", line 375, in div_calc
res["tax_paid"] = -div_tax["amount"].values.round(2) if div_tax is not None else 0
TypeError: loop of ufunc does not support argument 0 of type float which has no callable rint method

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.