ny_quant: (Default)
[personal profile] ny_quant
Если совсем кратко, моя стратегия (как и многие другие, если не все) выбирает акции для покупки, и в итоге их продает. К моменту написания предыдущего поста на эту тему, закончился очередной цикл и работ и на меня смотрела с экрана вполне работающая версия, которую - как все легко догадались - мне немедленно захотелось улучшить. В связи с этим я написал следующий промпт:

Currently, we immediately replace sold stocks in the portfolio by the best stock per [existing selection criterion] that is still not in our current portfolio by investing in it all the cash received from the sale. Now I want to change it by requiring that the eligible replacements satisfy [an additional criterion].
If there are no eligible candidates, I want the sales proceeds to stay in cash. We will need a list of cash_flows, initialized to the empty list. If there are no eligible candidates to replace the sold stock then the dollar amount that we wanted to replace but couldn't is appended to the list "cash_flows".
The main loops in the function compute_daily_history()
        for day in days: 
will begin with with checking the state of the variable "cash_flows". If not empty, we attempt to find new eligible candidates. If they exist we buy them one by one, releasing the cash flows one by one. If they don't exist then nothing doing and we proceed to the next statement.

Мне кажется, не надо быть специалистом ни в чем, чтобы понять смысл происходящего, это довольно просто. Более того, не надо быть крутым программистом или даже что-то знать о питоне, чтобы оценить уровень продукта, предложенного мне в ответ ИИ. (Замечу в скобках, что код в данном случае получился едва ли не короче, чем промпт, что не характерно.) Ниже все 13 строк, не ленитесь, почитайте прежде чем продолжать.
            # --------------------------------------------------
            # Attempt reinvestment from cash_flows
            # --------------------------------------------------
            if cash_flows:
                new_cash_flows = []
                for cash_amt in cash_flows:
                    new_t, new_st, sorted_rets = find_replacement(day, holdings, strategy_parameters) 
                    if new_t is not None:
                        price = price_df.at[day, new_t]
                        sh = cash_amt / price
                        shares[new_t] = shares.get(new_t, 0.0) + sh    
                        holdings[new_t] = 1.0
                    else:
                        new_cash_flows.append(cash_amt)        
                cash_flows = new_cash_flows

Дуся, грю, ты что ж это малюешь? Ты мне предлагаешь каждый день вызывать нашу самую дорогую функцию, возможно десятки раз, с одними теми же аргументами? Так не пойдет! Надо отдать должное, чатгпт не стал спорить и код враз переписал.

Мораль, кмк, тут очень простая. Конечно, ИИ может во многом помочь уже сегодня. Но доверить ему пока что нельзя ничего. Все, кто думает иначе, будут сами себе злобные буратины.

Date: 2025-12-18 04:18 pm (UTC)

Date: 2025-12-18 04:19 pm (UTC)
From: [identity profile] spamsink.livejournal.com

"В вашем компиляторе ещё нет ИИ, и он не умеет выносить инварианты из цикла? Тогда мы идём к вам!"

Date: 2025-12-18 04:30 pm (UTC)
From: [identity profile] ny-quant.livejournal.com
Я конечно не знаю как там у питона внутре, но опыт-то не пропьешь и старые привычки умирают с трудом.

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

Date: 2025-12-18 04:34 pm (UTC)
From: [identity profile] spamsink.livejournal.com

Насколько я понимаю, питон всё ещё по большей части интерпретирующий, и таких глобальных оптимизаций не делает. Почему ИИ всегда по умолчанию пишут на питоне, даже если программа не нуждается в каких-то хитрых пакетах, и будучи написана на C/C++, была бы раз в 100 быстрее — неясно.

Date: 2025-12-18 08:17 pm (UTC)
From: [identity profile] ak-47.livejournal.com

Потому что если не важно, чтобы было в 100 раз быстрее или медленнее, то на питоне удобнее. Ничего не надо чтобы запустить программу, написал текстовой файл и вперёд. Сравните с тем, сколько возни потребуется прежде чем что-то на С++ запустится.

Date: 2025-12-20 03:16 am (UTC)
From: [identity profile] smirnfil.livejournal.com
Потому что даже если программа работает на си 2 секунды,а на питоне 3 минуты(что кстати в 2025 большая редкость) этот выигрыш по времени будет съеден более медленной разработкой и отладкой

Date: 2025-12-20 03:37 am (UTC)
From: [identity profile] spamsink.livejournal.com

В каком смысле более медленной разработкой? С точки зрения человека, что сделать copy-paste питоновского кода, что сишного кода из ответа ИИ — нет разницы.

Date: 2025-12-20 04:35 am (UTC)
From: [identity profile] smirnfil.livejournal.com
Есть большая разница в затратах времени если код не работает

Date: 2025-12-20 04:41 am (UTC)
From: [identity profile] spamsink.livejournal.com

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

Date: 2025-12-20 04:50 am (UTC)
From: [identity profile] smirnfil.livejournal.com
Строгость типизации языка у меня где-то на двадцать пятом месте в причинах сложностей отладки. Было бы интересно найти исследования где исследовали данный вопрос подробнее. В плюсах столько подводных камней что типизация не поможет. Особенно если код пишет ии и есть все шансы что он использует плохие части языка.

Date: 2025-12-20 04:57 am (UTC)
From: [identity profile] spamsink.livejournal.com

Интересно было бы увидеть первые 24 причины.

Date: 2025-12-21 04:49 am (UTC)
From: [identity profile] smirnfil.livejournal.com

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

Date: 2025-12-20 10:59 pm (UTC)
ext_646638: (Default)
From: [identity profile] rdia.livejournal.com
Питон не имеет права выносить это наверх, тк функция может быть с побочными эффектами (например печать что-то).

Date: 2025-12-18 08:13 pm (UTC)
From: [identity profile] ak-47.livejournal.com

Может быть наивный вопрос но зачем держать cash_flows в виде массива? Может ли получиться так, что суммы по отдельности маленькие и поэтому хороший replacement не сработает? А если бы была одна сумма, то покупка бы произошла?

Date: 2025-12-18 09:01 pm (UTC)
From: [identity profile] ny-quant.livejournal.com
Нормальный вопрос. Чтобы избежать усложнения алгоритма в будущем. Я задаю максимальный размер портфеля, допустим 30 акций. В начале я дал четкий алгоритм как распределять между ними капитал. Положим, 15 из них пришлось продать без замены, т.е. в нале у нас порядка половины денег. Вдруг появился новый кандидат. Сколько в него вкладывать? Чтобы принять это решение нужно добавлять новые фичи к алгоритму*. А так продали на $1000 и эту же 1000 когда-нибудь вложим во что-то еще.

Но в общем, это совершенно произвольное решение, мне хотелось как можно проще, чтобы силиконовая дурилка не запуталась. Но она, конечно, еще как запуталась. Это было самое простое.

*Задним числом: можно было просто вкладывать 1/15 нала. Было бы еще проще.

Date: 2025-12-19 05:52 am (UTC)
From: [identity profile] svyatogorodski.livejournal.com
Я тут, взяв больничный, от нечего делать поразвлекался с ии (наверное еще отпишусь) на тему IQ. "Оценив" себя, соседей (мурзилок), и несколько юзеров, спросил а во что гроша себя ценит, когда работает лайт (его в дерьмо не тыкнули и/или спец промптом не подогнали). Он прикинул на 115-125, но, будучи, пару раз тыкнутым согласился чуток понизить. Он же утверждал, что когда он перепроверяет себя и источники, то потянет аж на 130 плюс. И дал пару инструкций как его перевести в этот мод. Проверять мне лень было, стал ли он сильнее, херню все равно порол иногда, но в целом известно что есть промпты как его заставить меньше брака выдавать (ценой времени, конечно).

Date: 2025-12-19 10:21 am (UTC)
From: [identity profile] mi-b.livejournal.com
Интересный алгоритм. В нем позиция, заменяющая закрытую, не обязана подходить к закрытой ни по каким факторам, но должна быть ровно того же размера, что выручка ликвидации. Обычно делают ровно наоборот - стараются сохранить нейтральность старой позиции к ненужным факторам, но размер позиции не зависит пропорционально 1:1 от выручки по предыдущей.

И непонятно, почему cash_flows надо как список держать, а не аггрегировать все поступившие средства в один карман, откуда уже разложить по новым возможностям. Получается, если у нас первая ликвидированная позиция была от маленькой позиции или позиции, потерявшей деньги, то в первого кандидата на реинвестирование мы положим мало. А если пятая по порядку ликвидации позиция была большая (от исходного размера или доходности), то 5ый по порядку кандидат на реинвестирование получит тоже большую позицию?

Date: 2025-12-19 03:30 pm (UTC)
From: [identity profile] ny-quant.livejournal.com
У меня пока что нет никаких факторов. Возможно и не будет.

Да, это было совершенно произвольное решение. Я уже выше ответил. Это я наверное переделаю.

Date: 2025-12-19 10:27 am (UTC)
From: [identity profile] mi-b.livejournal.com
и кстати, вызов find_replacement внутри цикла совершенно оправдано, если n+1-ая новая позиция зависит не только от старых позиций, но и от n-ой новой позиции. Как оно обычно и бывает. Так что AI тут просто не понял, насколько уникальный у вас алгоритм. Если поставить вызов снаружи, holdings будет использоваться все время старая, и вы вообще будете одну и ту же позицию выбирать для замены каждой выбывшей.

Date: 2025-12-19 03:35 pm (UTC)
From: [identity profile] ny-quant.livejournal.com
У меня от новой позиции не зависит и ИИ об этом знал, т.к. find_replacement писал тоже он. Функция возвращает векторы, так что поставив ее вне цикла можно считать результаты по очереди, о чем я вроде бы совершенно ясно и написал: If they exist we buy them one by one, releasing the cash flows one by one. If they don't exist then nothing doing and we proceed to the next statement.

Date: 2025-12-19 04:54 pm (UTC)
From: [identity profile] mi-b.livejournal.com
А если не зависит зачем тогда ему holdings как аргумент? И как тогда обеспечивать контроль концентрации? Что помешает всем новым позициям быть в одной и той же акции?

Date: 2025-12-19 05:17 pm (UTC)
From: [identity profile] ny-quant.livejournal.com
> А если не зависит зачем тогда ему holdings как аргумент?

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

Это и мешает.

Date: 2025-12-19 05:47 pm (UTC)
From: [identity profile] mi-b.livejournal.com
Я, наверное, чего-то не понимаю, но вы же ее упрекаете, что она пытается "вызывать нашу самую дорогую функцию, возможно десятки раз, с одними теми же аргументами". При этом значения аргументов разные, потому что аргумент holdings меняется в этом же цикле.

Date: 2025-12-19 08:46 pm (UTC)
From: [identity profile] ny-quant.livejournal.com
Вы, правы, я плохо сформулировал. Смысл в том, что если в первый раз невод не принес золотую рыбку, то holdings не изменились и каждый следующий вызов будет с теми же аргументами, без изменений.

Date: 2025-12-19 04:03 pm (UTC)

Date: 2025-12-20 11:00 pm (UTC)
ext_646638: (Default)
From: [identity profile] rdia.livejournal.com
Ну откуда же он знает, что эта функция дорогая?

Date: 2025-12-21 04:31 am (UTC)
From: [identity profile] ny-quant.livejournal.com
Он же её сам и написал.

Profile

ny_quant: (Default)
ny_quant

December 2025

S M T W T F S
 12 34 56
7 89 10 111213
14 151617 181920
21 2223 24252627
28 29 3031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 31st, 2025 04:13 pm
Powered by Dreamwidth Studios