For pętla zwraca nieodpowiednie wartości

Odpowiedz Nowy wątek
2018-11-29 11:17
0

Witam. Mam tu program, który mi pracuje, ale nie tak, jak bym chciała. A właściwie ta ostatnia for pętla. Chcę, aby do dataframe był dodany słupek data_pd['Profit'], który by był wypełniony sumami total_profit, tzn. 1 odpowiedź dla nowego słupka = total_profit[0], 2 odpowiedź dla nowego słupka = total_profit[0]+total_profit[1], 3 odpowiedź dla nowego słupka = total_profit[0]+total_profit[1], ...., tzn. coś w rodzaju cumsum. ALE, gdy jakaś odpowiedź staje się >15 (zabieram ten profit), w następnym kroku wszystko zaczyna się od zera od nowa (TEGO MI NIE WYKONUJE PROGRAM). Dane załączam.

import pandas as pd
import numpy as np

def oscil_k(data1, data2, data3, N):
    oscil_k = np.zeros(data1.shape[0])
    for i in range(N, data1.shape[0]):
        oscil_k[i] = 100 * ((data3[i]-data1[i-N+1:i+1].min())/(data2[i-N+1:i+1].max()-data1[i-N+1:i+1].min()))
    return oscil_k
#data=low, data2 = high, data3 = close

def oscil_d(data, N=3):
    cs = np.cumsum(np.insert(data, 0, 0))
    ma = (cs[N:] - cs[:-N]) / N
    return np.insert(ma, 0, np.repeat(0, N - 1))

#%K = (Current Close - Lowest Low)/(Highest High - Lowest Low) * 100
#%D = SMA of %K

data_pd = pd.read_csv('GS.csv')
format = '%m/%d/%Y'
data_pd['Date'] = pd.to_datetime(data_pd['Date'], format=format)
data_pd = data_pd.set_index(data_pd['Date'])  # indeksas taps datetime
data_pd = data_pd.drop(columns=['Date'])

p1 = 14
data_pd['oscil_k'] = oscil_k(data_pd['Low'].values, data_pd['High'].values, data_pd['Close'].values, p1)
data_pd['oscil_d'] = oscil_d(data_pd['oscil_k'].values, 3) #oscil_d visada nuo 3

data_pd['Buy'] = ((data_pd['oscil_k'] >= data_pd['oscil_d']) & (data_pd['oscil_k'].shift(1) < data_pd['oscil_d'].shift(1)) & (data_pd['oscil_k'] < 20))
#data_pd['BE'] = (data_pd['oscil_k'].shift(1) < data_pd['oscil_d'].shift(1))
data_pd['Sell'] = ((data_pd['oscil_k'] < data_pd['oscil_d']) & (data_pd['oscil_k'].shift(1) >= data_pd['oscil_d'].shift(1)) & (data_pd['oscil_k'] > 80))
#data_pd['SE'] = (data_pd['oscil_k'].shift(1) > data_pd['oscil_d'].shift(1))

#Create empty "Position" column
data_pd['Position'] = np.nan
#Set position to 1 for buy signals
data_pd.loc[data_pd['Buy'],'Position'] = 1
#Set position to -1 for sell signals
data_pd.loc[data_pd['Sell'],'Position'] = -1
#Set starting position to flat (i.e. 0).
#data_pd['Position'].iloc[0] = 0
data_pd.loc[0:np.max([p1, 3])-1, ['Position']] = 0
# Forward fill the position column to show holding of positions through time
data_pd['Position'] = data_pd['Position'].fillna(method='ffill')
idx1 = data_pd['Sell']
idx2 = data_pd['Buy']

taxes = -0.03
data_pd['taxes'] = data_pd['Sell'] * taxes + data_pd['Buy'] * taxes #nes ir perkam, ir parduodam
data_pd['price_change'] = data_pd['Close'].diff(1)
data_pd.iloc[0, data_pd.columns.get_loc('price_change')] = 0 #pirmai dienai 0
data_pd['profit_of_position'] = data_pd['Position'] * data_pd['price_change']
data_pd['total_profit'] = data_pd['taxes'] + data_pd['profit_of_position']
cs1 = np.cumsum(data_pd['total_profit'])

#take_profit system
profit = [] 
one_position_profit = 0
for index in range(len(data_pd)):
    #one_position_profit = 0
    take_profit = 15
    make_zero = False
    row = data_pd.iloc[index]
    if make_zero == True:
        row ['Position'] = 0
        #one_position_profit = 0
    if row ['Position'] != 0:
        one_position_profit = one_position_profit + row ['total_profit']
    if (row ['Sell'] == True) or (row['Buy'] == True):
        one_position_profit = 0
        make_zero = False
    if one_position_profit > take_profit:
        make_zero == True
        #profit.append(one_position_profit)
    profit.append(one_position_profit)

#print(profit)
data_pd['Profit'] = profit
data_pd['Profit_bigger'] = data_pd['Profit'] > take_profit
  • GS.csv (0,19 MB) - ściągnięć: 52
edytowany 1x, ostatnio: Beata Griškevič, 2018-11-29 11:22

Pozostało 580 znaków

2018-11-29 13:17
0

Może po prostu zapamiętuj ostatni punkt dla którego przekroczyłaś take_profit i licz cumsum od tego punktu? Np.
[1,2,3,4,10,3,4,5] =
[1,3, 6, 10, 20] - zabieramy profit po 5 elementach czyli nasz take_profit_index = 4.

jeżeli zależy Ci by cumsum była wyliczona dla całego zakresu na początku programu (a więc uzyskujemy [1,3, 6, 10, 20, 23, 27, 32] dla mojego przykladu) to zapamiętaj sumę dla której przekroczono profit i odejmuj ją.

(...)
take_profit_sum = 0
(one_position_profit-take_profit)> take_profit:
take_profit_sum = current_sum 

profit.append(one_position_profit-take_profit_sum)

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0