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 (193 KB) - ściągnięć: 150