airens / interactive_brokers_tax Goto Github PK
View Code? Open in Web Editor NEWФормирование 3-НДФЛ на основе отчета Interactive Brokers
License: GNU General Public License v3.0
Формирование 3-НДФЛ на основе отчета Interactive Brokers
License: GNU General Public License v3.0
Привет! Добавь, пожалуйста, лицензию, по которой распространяется твой код, спасибо!
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.
Выглядит. что удалять все записи без комиссии не совсем верно. У меня в отчете есть сделки со значением 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:
Выдает нулевую декларацию, хоте сделки продажи были.
Пришлите, пжл, Ваш email, могу отправить свой отчет csv для примера.
Приветствую!
В шаблоне указано, что расчёт производится методом FIFO.
Хотелось бы уточнить почему выбран FIFO?
FIFO помогает уменьшить налогооблагаемую базу?
Насколько я понимаю, выбор порядка реализации свободный.
За LIFO у меня следующие аргументы:
То есть вроде бы LIFO выглядит более логично.
Не могли бы Вы пояснить этот вопрос, пожалуйста?
Спасибо за полезную программу!
То что в шаблоне называется как "доход от продажи ценных бумаг ({{income_rub_sum}} руб.)" на самом деле доходом не является, а является налоговой базой (без учёта комиссий брокера).
Так делать нельзя, в 3-НДФЛ доход это полный доход, нельзя указывать в 2-НДФЛ в качестве дохода уже посчитанную налоговую базу. Это ошибка.
Как это правильно считать:
@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 шт. осталось на конец года, которое можно использовать для дальнейшего расчета налоговой базы.
При выгрузке произвольного отчета на год в него попадают также сделки по обмену валюты.
Кроме того, что они корректно не отобразаться - они ломают генерацию, потому что заголовок таблицы не fee/comm а comm in usd
Пока лечится локально через переименование и этого заголовка:
trades = trades.rename(columns={"comm/fee": "fee", "date/time": "date", "t. price": "price", "comm in usd":"fee"})
Требует pandas версии 1.0.3, а она нормально не ставится.
Если убрать strict versioning, то скрипт все равно работает.
Сейчас
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'
Если использовать 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-х акций.
В отчете виден излишний НДФЛ, которого на самом деле нет (табл. 2.2.). Поскольку количество штук указывается, как до сплита (много), цена покупки изначальная до сплита (низкая), а цена продажи как после сплита (высокая). В итоге имеем большую прибыль, которой на самом деле нет.
Отличное начинание!
Есть предложение:
В 2020 году IB добавил возможность торговать дробными акциями. Для позиций где участвовали дробные акции выдается ошибка:
"Актив продан в большем количестве, чем покупался. Операции SHORT не поддерживаются."
Дело способе обработки сделок по одной акции....
for _ in range(int(abs(quantity))):
Думаю многие пользуются программой и вносят свои изменения и страдают от того, что шаблон является бинарником (template.docx).
Такой формат шаблона не даёт возможности увидеть в коммитах какие правки в него были внесены и не даёт добавить / убрать свои правки при необходимости. git mergetool конечно не работает. Это ведёт к тому что люди не хотят (и не могут) пулить свои патчи.
С этой проблемой столкнулся и я при последнем обновлении, пришлось шаблон копировать и пределывать всё с нуля, у меня соответственно тоже бинарник.
Можно ли как-то сделать шаблон в виде текста ? К примеру создавать его из html или генерировать docx с помощью кода на питоне?
на 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)
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 версия того отчета, на основе которого генерируется пояснительная записка?
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
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.