#python
#python
Вопрос:
Я написал приложение на python, которое позволяет мне покупать и продавать акции, используя платформу zerodha. Теперь, когда я покупаю акции, я хочу их продать, если значения close_price <exit_price . exit_price вычисляется как exit_price = (close_price*0.91)
Вот мой код:
from kiteconnect import KiteConnect
import os
import pandas as pd
import openpyxl
cwd = os.chdir("C:/Users/Administrator/Desktop/Zerodha")
#generate trading session
access_token = open("access_token.txt",'r').read()
key_secret = open("credentials.txt",'r').read().split()
kite = KiteConnect(api_key=key_secret[0])
kite.set_access_token(access_token)
# Fetch quote details
#quote = kite.quote("INFY")
# Fetch last trading price of an instrument
#ltp = kite.ltp("NSE:INFY")
# Fetch order details
orders = kite.orders()
# Fetch position details
positions = kite.positions()
# Fetch holding details
holdings = kite.holdings()
data = pd.DataFrame(holdings)
hold = data[['tradingsymbol','average_price','last_price','close_price']]
df =hold['close_price']
x = df*0.91
exit_price=pd.DataFrame(x)
exit_price.rename(columns = {'close_price':'exit_price'}, inplace=True)
hold =hold.join(exit_price)
hold.to_csv('holdings.csv')
hold['date'] = pd.date_range(start='23/11/2020', periods=len(hold), freq='B')
hold['exit_signal'] = hold['close_price'] < hold['exit_price'] #generate exit signal
def placeMarketOrder(symbol,buy_sell,quantity):
# Place an intraday market order on NSE
if buy_sell == "buy":
t_type=kite.TRANSACTION_TYPE_BUY
elif buy_sell == "sell":
t_type=kite.TRANSACTION_TYPE_SELL
kite.place_order(tradingsymbol=symbol,
exchange=kite.EXCHANGE_NSE,
transaction_type=t_type,
quantity=quantity,
order_type=kite.ORDER_TYPE_MARKET,
product=kite.PRODUCT_MIS,
variety=kite.VARIETY_REGULAR)
Это полученный фрейм данных для хранения:
Теперь, основываясь на этом фрейме данных, если сигнал выхода истинный, я хочу продать этот частичный запас:
Код для этого таков, как описано:
if (hold.loc[hold['exit_signal'] == True]):
#write code to sell stock
Теперь при оценке оператора if, как описано выше, я получаю сообщение об ошибке:
ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
Акции могут быть проданы следующим образом в соответствии с определением placeMarketOrder(символ,buy_sell,количество): :
placeMarketOrder("HDFC","buy",1,30,2200)
Следовательно, символ «HDFC» будет заменен символом tradingsymbol, для которого условие выхода имеет значение true.
Как мне выполнить мой оператор if без получения ошибки?
Комментарии:
1. Вам нужны все строки из вашего фрейма данных, которые имеют
'exit_signal' == True
?2. Да, это правильно. В настоящее время рассматриваю две строки в моем фрейме данных. Если exit_signal —True генерируется для любого одного символа, продайте этот stok. Если это для всех, продайте все акции. Это зависит от того, сколько раз условие выполняется для exit_signal
Ответ №1:
if (hold.loc[hold['exit_signal'] == True]):
Вышеописанное вызывает ошибку, поскольку hold.loc[hold['exit_signal']==True]
все еще является фреймом данных. Вам нужно указать, какую конкретно запись вашего фрейма данных вы оцениваете. Например,
if hold.loc[i, 'exit_signal']:
symbol, date = hold.loc[i, 'tradingsymbol'], hold.loc[i, 'date']
placeMarketOrder(symbol, date.month, date.day, date.year)
Теперь вы можете i
заменить индекс (т.Е. Номер строки) и выполнить итерацию по всему фрейму данных. Взгляните на различные способы перебора фрейма данных, которые все более эффективны, чем цикл с простой loc
индексацией:
- https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas .DataFrame.iterrows.html
- https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas .DataFrame.itertuples.html
Имейте в виду, что лучше избегать перебора фрейма данных, когда это возможно (и это часто бывает), поскольку эквивалентные векторизованные операции (если они существуют и правильно настроены) часто выполняются на порядки быстрее.
Тем не менее, в случаях, когда цикл неизбежен, а производительность важна, вы можете взглянуть на:
Комментарии:
1. Большое вам спасибо. Itertuples — это то, что я искал: