#python #pandas #dataframe
#python #pandas #фрейм данных
Вопрос:
Я извлекаю данные из quandl и загружаю их в объект pandas DF.
После этого я вычисляю значения SMA (SMA21, SMA55) на основе «Последней цены». Добавление этих значений SMA в виде столбца создает мой объект DF.
Я выполняю итерацию через DF, чтобы поймать сигнал на покупку.
Я знаю, что условие покупки выполняется для некоторых дат, но мой код ничего не выводит. Я ожидаю напечатать условие покупки как минимум.
как показано ниже, вы можете видеть следующее условие:
kitem['SMA21'] >= kitem['Last']
Мой код:
import requests
import pandas as pd
import json
class URL_Params:
def __init__ (self, endPoint, symboll, startDate, endDate, apiKey):
self.endPoint = endPoint
self.symboll = symboll
self.startDate = startDate
self.endDate = endDate
self.apiKey = apiKey
def createURL (self):
return self.endPoint self.symboll '?start_date=' self.startDate 'amp;end_date=' self.endDate 'amp;api_key=' self.apiKey
def add_url(self, _url):
self.url_list
my_portfolio = {'BTC':1.0, 'XRP':0, 'DSH':0, 'XMR':0, 'TotalBTCValue':1.0}
_endPoint = 'https://www.quandl.com/api/v3/datasets/BITFINEX/'
_symbolls = ['BTCEUR','XRPBTC','DSHBTC','IOTBTC','XMRBTC']
_startDate = '2017-01-01'
_endDate = '2019-03-01'
_apiKey = '' #needs to be set for quandl
my_data = {}
my_conns = {}
my_col_names = ['Date', 'High', 'Low', 'Mid', 'Last', 'Bid', 'Ask', 'Volume']
orderbook = []
#create connection and load data for each pair/market.
#load them in a dict for later use
for idx_symbol in _symbolls:
my_url_params = URL_Params(_endPoint,idx_symbol,_startDate,_endDate,_apiKey)
response = requests.get(my_url_params.createURL())
my_data[idx_symbol] = json.loads(response.text)
#Prepare Data
my_raw_data_df_xrpbtc = pd.DataFrame(my_data['XRPBTC']['dataset']['data'], columns= my_data['XRPBTC']['dataset']['column_names'])
#Set Index to Date Column and Sort
my_raw_data_df_xrpbtc['Date'] = pd.to_datetime(my_raw_data_df_xrpbtc['Date'])
my_raw_data_df_xrpbtc.index = my_raw_data_df_xrpbtc['Date']
my_raw_data_df_xrpbtc = my_raw_data_df_xrpbtc.sort_index()
#Drop unrelated columns
my_raw_data_df_xrpbtc.drop(['Date'], axis=1, inplace=True)
my_raw_data_df_xrpbtc.drop(['Ask'], axis=1, inplace=True)
my_raw_data_df_xrpbtc.drop(['Bid'], axis=1, inplace=True)
my_raw_data_df_xrpbtc.drop(['Low'], axis=1, inplace=True)
my_raw_data_df_xrpbtc.drop(['High'], axis=1, inplace=True)
my_raw_data_df_xrpbtc.drop(['Mid'], axis=1, inplace=True)
#Calculate SMA values to create buy-sell signal
my_raw_data_df_xrpbtc['SMA21'] = my_raw_data_df_xrpbtc['Last'].rolling(21).mean()
my_raw_data_df_xrpbtc['SMA55'] = my_raw_data_df_xrpbtc['Last'].rolling(55).mean()
my_raw_data_df_xrpbtc['SMA200'] = my_raw_data_df_xrpbtc['Last'].rolling(200).mean()
#Check for each day if buy signal holds BUY if sell signal holds SELL
for idx,kitem in my_raw_data_df_xrpbtc.iterrows():
if (kitem['SMA21'] >= kitem['Last']) is True: #buy signal
print("buy0")
if my_portfolio['BTC'] > 0 is True:
print("buy1")
if (kitem['Last'] * my_portfolio['XRP']) >= (my_portfolio['BTC'] * 1.05) is True: #sell signal
print("sell0")
if my_portfolio['XRP'] > 0 is True:
print("sell1")
Я знаю, что есть много строк, которые имеют значение true, но мой код никогда не вводит этот путь кода, поэтому он не выводит то, что я ожидаю.
Кто-нибудь может, пожалуйста, помочь / прокомментировать, что может быть не так?
Комментарии:
1. Попробуйте использовать этот формат для генерации столбца сигналов: df.loc[df[‘SMA21’] > df[‘Last’],’signal’] = ‘buy0’ С более короткими именами фреймов данных также проще работать.
Ответ №1:
Причина в том, что ваше сравнение неверно. Результатом kitem['SMA21'] >= kitem['Last']
будет numpy.bool_
. При использовании is
для сравнения с True
это приведет к сбою, поскольку это не тот же объект.
Если вы измените сравнение на ==
, оно будет работать так, как ожидалось:
if (kitem['SMA21'] >= kitem['Last']) == True: