Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Got a stock symbol with an unsupported format #64

Closed
ivazin opened this issue Apr 3, 2022 · 7 comments
Closed

Got a stock symbol with an unsupported format #64

ivazin opened this issue Apr 3, 2022 · 7 comments
Labels
feature Feature request

Comments

@ivazin
Copy link

ivazin commented Apr 3, 2022

Наблюдается при обработке отчета IB, содержащего тикеры:
"TKAd" — THYSSEN-KRUPP AG
"1086" — Goodbaby International Holdings Limited (1086.HK)
и подобные.

Подскажите, дело в этом коде?

pub fn parse_symbol(symbol: &str) -> GenericResult<String> {
    lazy_static! {
        static ref SYMBOL_REGEX: Regex = Regex::new(&format!(
            r"^{}$", STOCK_SYMBOL_REGEX)).unwrap();
    }

    if !SYMBOL_REGEX.is_match(symbol) || symbol.ends_with(OLD_SYMBOL_SUFFIX) {
        return Err!("Got a stock symbol with an unsupported format: {:?}", symbol);
    }

    Ok(symbol.replace(' ', "-"))
}

Нет ли идей, как исправить? ) На Rust еще не приходилось работать 👇🙈

@KonishchevDmitry
Copy link
Owner

Добрый день. Попробуйте для начала заменить

pub const STOCK_SYMBOL_REGEX: &str = "[A-Z][A-Z0-9]*(?:[ .][A-Z]+)??";

на

pub const STOCK_SYMBOL_REGEX: &str = "[a-zA-Z0-9]+(?:[ .][A-Z]+)??";

Будет ли так работать? Спрашиваю потому, что могут быть варианты: к примеру не удивлюсь, если где-нибудь в дивидендах у вас будет TKA вместо TKAd (см. #40 (comment)) - в данном случае может помочь опция symbol_remapping в конфиге.

А вы для каких целей собираетесь программу использовать? Если для формирования налоговой декларации, то ОК (хотя, видя суффикс .HK, могу предположить, что вы затем придете с ошибкой какой-нибудь неподдерживаемой валюты - я эти места вынужден тестировать руками каждый год (в декларации), т. к. у них названия могут меняться, поэтому добавляю новые по мере необходимости), но если для других целей (анализ, ребалансировка), то могу сразу расстроить - они работать не будут, т. к. на данный момент программа для получения котировок пользуется сервисами, которые отдают информацию только по американским биржам.

@ivazin
Copy link
Author

ivazin commented Apr 3, 2022

Кажется, этот issue можно закрывать, с новой регуляркой ошибка ушла ) Но вся история не окончена ))

Появилась следующая ошибка:

E: Error while reading "./exports/U***_20210203_20211231.csv" broker statement: Failed to parse ("Corporate Actions", "Data", "Stocks", "HKD", "2021-08-12", "2021-08-11, 20:25:00", "698(KYG8917X1218) Subscribable Rights Issue 1 for 2 (2965, TONGDA GROUP HOLDINGS LTD - RIGHTS, KYG8917X1RTS)", "25000", "0", "0", "0", "") (7332 line) record: Unsupported corporate action: "698(KYG8917X1218) Subscribable Rights Issue 1 for 2 (2965, TONGDA GROUP HOLDINGS LTD - RIGHTS, KYG8917X1RTS)".

Как я предположил, строчки ни на что не влияют, удалил их:

Corporate Actions,Data,Stocks,HKD,2021-08-12,"2021-08-11, 20:25:00","698(KYG8917X1218) Subscribable Rights Issue  1 for 2 (2965, TONGDA GROUP HOLDINGS LTD - RIGHTS, KYG8917X1RTS)",25000,0,0,0,
Corporate Actions,Data,Stocks,HKD,2021-09-17,"2021-09-15, 20:25:00","(KYG8917X1390) Delisted (2965, TONGDA GROUP HOLDINGS LTD - RIGHTS, KYG8917X1390)",-25000,0,0,0,
Corporate Actions,Data,Stocks,HKD,Closed Lot:,2021-08-11,Basis: 0,25000,,,0,ST
Corporate Actions,Data,Total,,,,,,0,0,0,

Очередная ошибка:
E: Error while reading "./exports/U***_20210203_20211231.csv" broker statement: Failed to parse ("Corporate Actions", "Data", "Stocks", "USD", "2021-10-01", "2021-09-30, 20:25:00", "DMYI(US2332781002) CUSIP/ISIN Change to (US46222L1089) (DMYI.OLD, DMY TECHNOLOGY GR III-CL A, US2332781002)", "-90", "0", "0", "0", "") (7334 line) record: Unsupported corporate action: "DMYI(US2332781002) CUSIP/ISIN Change to (US46222L1089) (DMYI.OLD, DMY TECHNOLOGY GR III-CL A, US2332781002)".

Вероятно, причина в строчках:

Corporate Actions,Data,Stocks,USD,2021-10-01,"2021-09-30, 20:25:00","DMYI(US2332781002) CUSIP/ISIN Change to (US46222L1089) (DMYI.OLD, DMY TECHNOLOGY GR III-CL A, US2332781002)",-90,0,0,0,
Corporate Actions,Data,Stocks,USD,2021-10-01,"2021-09-30, 20:25:00","DMYI(US2332781002) CUSIP/ISIN Change to (US46222L1089) (IONQ, IONQ INC, US46222L1089)",90,0,0,0,

Добавляю в конфиг:

    symbol_remapping:
      DMYI: IONQ

Удаляю эти Corporate Actions, получаю это:
E: Error while reading "./exports/U***_20210203_20211231.csv" broker statement: Failed to parse ("Financial Instrument Information", "Data", "Stocks", "DMYI, DMYI.OLD", "DMY TECHNOLOGY GR III-CL A", "462768343", "US2332781002", "NYSE", "1", "COMMON", "") (7834 line) record: Got a stock symbol with an unsupported format: "DMYI.OLD".

Нахожу строчку:
Financial Instrument Information,Data,Stocks,"DMYI, DMYI.OLD",DMY TECHNOLOGY GR III-CL A,462768343,US2332781002,NYSE,1,COMMON,

Меняю на:
Financial Instrument Information,Data,Stocks,DMYI,DMY TECHNOLOGY GR III-CL A,462768343,US2332781002,NYSE,1,COMMON,

Получаю это:
E: Failed to remap DMYI to IONQ: The portfolio already has IONQ symbol.

Проклинаю два дня:

  1. когда вообще решил спекульнуть с этой дрянью
  2. когда я ошибся и вместо закрытия позиции я открыл еще и короткую.

Отчаявшись, делаю морду тяпкой, удаляю добавленный к конфиг remapping и заменяю в исходных данных:

DMYI.OLD -> IONQ
DMYI -> IONQ
US2332781002 -> US46222L1089

Получаю это:
E: Calculated open positions don't match declared ones in the statement: IBKR: 0 vs 5.6114.

..задаюсь вопросом: а как вообще люди готовят эти *!#^ отчеты? (это мой первый)

Вспоминаю, что IBKR я не покупал, и это "любезно" подаренные брокером акции за реферально-приглашенных 🤦

Полагаю, подаренные акции можно считать чистым доходом в терминах налоговой на дату вестинга:

Open Positions,Data,Summary,Stocks,USD,IBKR,-,5.6114,1,71.837687565,403.11,79.42,445.66,42.549997,
Open Positions,Data,Lot,Stocks,USD,IBKR,2021-12-28 (Vesting: 2022-12-28),0.1676,,81.264916468,13.62,79.42,13.310870015,-0.30913,Un
Open Positions,Data,Lot,Stocks,USD,IBKR,2021-12-23 (Vesting: 2022-12-23),0.1724,,78.770301624,13.58,79.42,13.692088249,0.112088,Un
Open Positions,Data,Lot,Stocks,USD,IBKR,2021-12-09 (Vesting: 2022-12-09),0.1763,,77.141236529,13.6,79.42,14.001828064,0.401828,Un
Open Positions,Data,Lot,Stocks,USD,IBKR,2021-12-03 (Vesting: 2022-12-02),0.355,,76.507042254,27.16,79.42,28.194265246,1.034265,Un
Open Positions,Data,Lot,Stocks,USD,IBKR,2021-09-20 (Vesting: 2022-09-20),0.1115,,61.524663677,6.86,79.42,8.855381901,1.995382,Un
Open Positions,Data,Lot,Stocks,USD,IBKR,2021-09-06 (Vesting: 2022-09-06),0.2129,,64.490371066,13.73,79.42,16.908617101,3.178617,Un
Open Positions,Data,Lot,Stocks,USD,IBKR,2021-08-27 (Vesting: 2022-08-26),0.2112,,63.731060606,13.46,79.42,16.77360231,3.313602,Un
Open Positions,Data,Lot,Stocks,USD,IBKR,2021-08-10 (Vesting: 2022-08-10),0.319,,63.824451411,20.36,79.42,25.335128488,4.975128,Un
Open Positions,Data,Lot,Stocks,USD,IBKR,2021-08-09 (Vesting: 2022-08-09),0.4284,,63.515406162,27.21,79.42,34.023727412,6.813727,Un
Open Positions,Data,Lot,Stocks,USD,IBKR,2021-05-10 (Vesting: 2022-05-10),0.6818,,69.595189205,47.45,79.42,54.148873365,6.698873,Un
Open Positions,Data,Lot,Stocks,USD,IBKR,2021-05-07 (Vesting: 2022-05-06),0.677,,69.615952733,47.13,79.42,53.767655131,6.637655,Un
Open Positions,Data,Lot,Stocks,USD,IBKR,2021-04-28 (Vesting: 2022-04-28),0.3684,,72.394136808,26.67,79.42,29.258499483,2.588499,Un
Open Positions,Data,Lot,Stocks,USD,IBKR,2021-04-19 (Vesting: 2022-04-19),0.4306,,76.544356712,32.96,79.42,34.198452436,1.238452,Un
Open Positions,Data,Lot,Stocks,USD,IBKR,2021-04-06 (Vesting: 2022-04-06),0.7844,,75.114737379,58.92,79.42,62.297413123,3.377413,Un
Open Positions,Data,Lot,Stocks,USD,IBKR,2021-03-22 (Vesting: 2022-03-22),0.5131,,78.464236991,40.26,79.42,40.750640838,0.490641,Un
Open Positions,Data,Lot,Stocks,USD,IBKR,2021-03-18 (Vesting: 2022-03-18),0.0018,,77.777777778,0.14,79.42,0.142956838,0.002957,Un

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

Но вопрос в другом: как можно сейчас закрыть глаза на это не продолжить подсчет tax-отчета без IBKR? ))

@KonishchevDmitry
Copy link
Owner

Добавляю в конфиг:

    symbol_remapping:
      DMYI: IONQ

Тут у вас корпоративное действие по переименованию - строго говоря, его было бы правильнее оформить вот так - #29 (comment)

Удаляю эти Corporate Actions, получаю это:
E: Error while reading "./exports/U***_20210203_20211231.csv" broker statement: Failed to parse ("Financial Instrument Information", "Data", "Stocks", "DMYI, DMYI.OLD", "DMY TECHNOLOGY GR III-CL A", "462768343", "US2332781002", "NYSE", "1", "COMMON", "") (7834 line) record: Got a stock symbol with an unsupported format: "DMYI.OLD".

Вот это, честно говоря, не понял как так получилось. Вы случайно не какую-то древнюю версию запускаете? Вроде у меня этот *.OLD как раз вот тут выфильтровывается - https://github.com/KonishchevDmitry/investments/blob/master/src/broker_statement/ib/instruments.rs#L46-L47

..задаюсь вопросом: а как вообще люди готовят эти *!#^ отчеты? (это мой первый)

Тут зависит от вашей стратегии:

  • Если вы спекулянт, то предположу, что несут свои отчеты в популярные платные сервисы и надеются, что им там все сделают на совесть. Некоторые вообще ничего не декларируют (не рекомендовал бы :) ).
  • Если вы инвестор, который еще и предпочитает держать все под собственным контролем (вроде меня) - то пишут вот такие вот инструменты (у кого по-проще в Excel, у кого по-сложнее, как у меня). А дальше перед каждым шагом думают, чем им это аукнется. К примеру:
    • Одним из основных критериев по выбору российского брокера для меня было качество его отчетов.
    • Маржиналку я всегда отключал первым делом.
    • Были мысли купить европейские ETF - но сразу понимаешь, прежде чем это делать, надо найти сервис, через который я смогу получать котировки по ним - а это не так просто.
    • В данный момент для меня было бы разумным купить российские ОФЗ (на Московской бирже), но я этого не делаю, т. к. понимаю, что тогда мне придется делать во всех своих тулах полноценную поддержку бондов, а это довольно большая работа.
    • и т. п. :)

Т. е., если отвечать на ваш вопрос, то могу сказать, что со "скучными" портфелями, где только одни ETF особых проблем нет. А вот трейдерские... Там просто неисчерпаемый поток корпоративных действий и причуд брокера, на которые никакого времени не хватит писать логику обработки.

Вспоминаю, что IBKR я не покупал, и это "любезно" подаренные брокером акции за реферально-приглашенных 🤦
Но вопрос в другом: как можно сейчас закрыть глаза на это не продолжить подсчет tax-отчета без IBKR? ))

На мой взгляд, тут самое разумное - взять, и руками оформить эти подарки как покупки по нулевой цене - и тогда будет и с точки зрения налогов честно (не знаю уж на 100% или нет), и программа дальше сможет разобраться. Ну а если просто хочется пока посмотреть, где споткнетесь в следующий раз - то можно пока просто удалить все упоминания этих акций. :)

Если вам позволяет ваше privacy, можете кинуть мне свой отчет на email, и я обещаю на него посмотреть в меру своего свободного времени - возможно у меня получится быстрее его победить, чем вам. Но обещать, правда, ничего не могу - как из-за очень ограниченного свободного времени, так и из-за того, что у меня программа ориентирована все-таки на инвестиции, все вот эти сложные трейдерские случаи я не найду время поддерживать (у вас, надеюсь, там фьючерсов и опционов нет?).

В целом, на вид кажется, что вот этот вот "вестинг" поддержать совсем не сложно (как покупку по нулевой цене), и я бы вполне мог это сделать.

@titov-vv
Copy link

titov-vv commented Apr 5, 2022

и тогда будет и с точки зрения налогов честно (не знаю уж на 100% или нет)

Не не будет (хотя на своём счёте я так делаю ибо иначе будет вынос мозга и мне, и налоговой).
Если строго по НК РФ - то в момент получения акций их надо "зачислять" по рыночной цене (т.к. мы получаем доход в натуральной форме). Соответственно сразу возникает 13% налога с этой суммы, ну и далее эта цена просто идёт как цена покупки.

@ivazin
Copy link
Author

ivazin commented Apr 5, 2022

Про корпоративное действие сразу не заметил, спасибо за наводку, вписал в конфиг:

    corporate_actions:
      - date: 30.09.2021
        symbol: DMYI
        type: rename
        new_symbol: IONQ

Перевыгрузил данные по-новой — и вперед )

E: Error while reading "./exports/U***_20210203_20211231.csv" broker statement: Failed to parse ("Financial Instrument Information", "Data", "Stocks", "DMYI, DMYI.OLD", "DMY TECHNOLOGY GR III-CL A", "462768343", "US2332781002", "NYSE", "1", "COMMON", "") (7835 line) record: Got a stock symbol with an unsupported format: "DMYI.OLD".

Вы случайно не какую-то древнюю версию запускаете? Вроде у меня этот *.OLD как раз вот тут выфильтровывается

Не-не, форкнул вашу последнюю версию, поправил регулярку — и локально сбилдил для мака. Возможно, оно так потому что в отчете написано как "DMYI, DMYI.OLD".. Не очень пока научился rust читать :/

Поправил в выгрузке на DMYI, убрал из выгрузки вышеупомянутый vesting — и вуаля, таблички расчётов появились )
Их я еще попробую перепроверить в тонких моментах (когда в шорт случайно ушел, например), но это будет не сегодня )

Сразу пару моментов заметил:

  1. у меня была сделка, совершенная 30-го декабря, расчеты по которой смело можно отнести в декларацию следующего года (T+2), но почему-то она попала в табличку. Или оно все-таки в этом году должно фигурировать? Не хотелось бы ))
  2. и еще вылезал ворнинг, по австралийской акции MLX не подтянулись какие-то данные, хотя они вроде есть в дополнительной выгрузке:
W: The broker statement misses trade settle date information (see http://bit.ly/investments-ib-trade-settle-date). First occurred trade - MLX at 28.11.2021. All calculations for such trades will be performed in T+0 mode.

Если будет интересно, отправил вам свою выгрузку на почту (вроде обезличил, но если вдруг что — надеюсь на вашу аккуратность с данными ))

Кстати может вам как-то объединить свои усилия и инструменты с @titov-vv? ) Великое дело делаете, как мне кажется )

@KonishchevDmitry
Copy link
Owner

  1. у меня была сделка, совершенная 30-го декабря, расчеты по которой смело можно отнести в декларацию следующего года (T+2), но почему-то она попала в табличку. Или оно все-таки в этом году должно фигурировать? Не хотелось бы ))

Если я правильно понял, о чем вы, то это из-за того, что вы запустили investments tax-statement $name вместо investments tax-statement $name 2021 - и табличка нарисовалась не за конкретный год, а за все года.

  1. и еще вылезал ворнинг, по австралийской акции MLX не подтянулись какие-то данные, хотя они вроде есть в дополнительной выгрузке:

Хм. Какие-то новые приколы от брокера... Часть дат совпадает, а часть - нет. Могу предложить вот такой быстрофикс - потом уже гляну повнимательнее на остальных отчетах:

--- a/src/broker_statement/ib/confirmation.rs
+++ b/src/broker_statement/ib/confirmation.rs
@@ -54,7 +54,8 @@ fn parse_record(record: &Record, execution_dates: &mut TradeExecutionDates) -> E
     }

     let symbol = record.parse_symbol("Symbol")?;
-    let conclusion_date = record.parse_date("TradeDate")?;
+    let conclusion_date = super::common::parse_date(record.get_value("Date/Time")?.split(' ').next().unwrap())?;
     let execution_date = record.parse_date("SettleDate")?;

     match execution_dates.insert(OrderId {

Если будет интересно, отправил вам свою выгрузку на почту (вроде обезличил, но если вдруг что — надеюсь на вашу аккуратность с данными ))

Да, спасибо. Я обязательно это все посмотрю и покрою тестами. С данными я очень аккуратен. :)

Кстати может вам как-то объединить свои усилия и инструменты с @titov-vv? ) Великое дело делаете, как мне кажется )

Мы время от времени пересекаемся на уровне идей, а в целом - у каждого свой уютный проект, который он пилит в свободное от работы время. Не знаю как для Влада, но лично для меня это отдушина и отдых от командной работы на работе. Для меня тут, честно говоря, Rust с его пока что малой распространенностью даже преимущество: никто Pull Request'ы не шлет - мне их на работе за глаза хватает. :)

@KonishchevDmitry KonishchevDmitry added the feature Feature request label Apr 7, 2022
KonishchevDmitry added a commit that referenced this issue Apr 8, 2022
KonishchevDmitry added a commit that referenced this issue Apr 10, 2022
KonishchevDmitry added a commit that referenced this issue Apr 10, 2022
…h we have no available quotes if we have net asset value information from statement (#40, #64)
@KonishchevDmitry
Copy link
Owner

Добавил поддержку всего, что необходимо, включая гранты (как покупку по нулевой цене). Не поддержал только эти странные корпоративные действия, которые можно просто удалить руками.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feature Feature request
Projects
None yet
Development

No branches or pull requests

3 participants