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

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

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

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 09:56 pm
Powered by Dreamwidth Studios