Как установить логический флаг True после входа и обратно в False после выхода с использованием Pandas (Vectorized)?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как установить логический флаг True после входа и обратно в False после выхода с использованием Pandas (Vectorized)?

Сообщение Anonymous »

Я работаю с DataFrame Pandas, где мне нужно отслеживать логический флаг (in_position)

, который становится True после intry_signal и сбрасывается в false только после exit_signal .
Это должно быть сделано только векторизовано. Поведение: < /h3>

[*]in_position должен повернуть true только при входе в новое состояние (после чистой записи)
[*] Это должно оставаться истинной , даже если дополнительный entry_signal s появляется внутри этой позиции
[*] он должен вернуться к false только после ablet_signal после ablet_signal после. /> < /ul>
Другими словами, entry_signal< /code> Значения во время открытой позиции должны быть проигнорированы < /strong>. < /p>

❌ Проблема: < /h3>
Проблема, по-видимому, исходит от того, как совокупный сравнение: < /p>
df['in_position'] = df['final_entry'].cumsum() > df['final_exit'].cumsum()
< /code>
Даже когда оба кумулятивных значения достигают 1, это сравнение по -прежнему оценивается в True в строке после final_exit,
, потому что оба значения равны, и> больше не удовлетворяется только в одной и той же строке, но не до того, как он не появляется. побочный эффект от того, как .cumsum () < /code> и> < /code> ведут себя в векторизованную логику.

Что я борюсь с:

➡ Как заменить эту логику векторизованной альтернативой, которая действительно переключает положение при входе и решает ее на выходе? Оценка!# Step 1: Create minimal dataset with relevant values
data = {
'Close': [110, 111, 112, 113, 114, 115, 116],
'RSI_10': [None, 20, None, 41, 20, None, 61],
'SMA_200': [100]*7,
}
index = pd.to_datetime([
'2025-04-21', '2025-04-22', '2025-04-23',
'2025-04-24', '2025-04-25', '2025-04-27', '2025-04-28'
])
df = pd.DataFrame(data, index=index)

# Step 2: Signals
df['entry_signal'] = (df['RSI_10'] < 30) & (df['Close'] > df['SMA_200'])
df['partial_exit_signal'] = df['RSI_10'] > 40
df['exit_signal'] = df['RSI_10'] > 60

# Step 3: Cumulative logic - the main problem
entry_cumsum = df['entry_signal'].cumsum()
exit_cumsum = df['exit_signal'].cumsum()

in_position = entry_cumsum > exit_cumsum
in_position_prev = in_position.shift(1).fillna(False).astype(bool)

# Step 4: Final signals
df['final_entry'] = df['entry_signal'] & ~in_position_prev
df['partial_exit'] = df['partial_exit_signal'] & in_position_prev
df['final_exit'] = df['exit_signal'] & in_position_prev
df['in_position'] = in_position
df['in_position_prev'] = in_position_prev

print(df[['RSI_10', 'Close', 'entry_signal', 'final_entry', 'final_exit', 'in_position']])


Подробнее здесь: https://stackoverflow.com/questions/796 ... t-using-pa
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»