Witam. Mam tu program na temat inwestycji. Wczytuje dane oraz znajduję daty, kiedy odbył się "stop loss" i "take profit".
Otrzymuję:
Entered on 11/16/2007 at: 225.25, exited on 12/18/2007 at 201.51 for -10.54%
Entered on 12/16/2007 at: 208.63, exited on 01/18/2008 at 187.21 for -10.27%
Entered on 01/16/2008 at: 197.50, exited on 02/14/2008 at 176.56 for -10.60%
Entered on 02/16/2008 at: 173.80, exited on 03/10/2008 at 155.58 for -10.48%
Entered on 03/16/2008 at: 151.02, exited on 03/18/2008 at 175.59 for 16.27%
...
Pytanie:
Jak zmodyfikować dany program (chyba te dwa ostatnie wersy), aby wydrukował mi takie dane dla każdego dnia z moich danych w GC.csv (lata 2007-2018).
Dane umieszczam w załączniku.
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta
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'])
data_pd = data_pd.drop(columns=['Date'])
#take profit, stop loss posistemes
prices = data_pd['Close']
def get_pnl(prices, start_date, holding_period=90, profit_goal=0.10, cut_loss=.10):
end_date = start_date + timedelta(days=holding_period)
data = prices[start_date: end_date]
start_price = data.iloc[0]
take_profit = start_price * (1 + profit_goal)
cut_loss = start_price * (1 - cut_loss)
exit_date = end_date
if (data > take_profit).any():
exit_date = data[data > take_profit].index[0]
if (data[:exit_date] < cut_loss).any():
exit_date = data[data < cut_loss].index[0]
exit_price = data.loc[exit_date]
print('Entered on {0} at: {1:.2f}, exited on {2} at {3:.2f} for {4:.2f}%'.format(start_date.strftime('%m/%d/%Y'), start_price, exit_date.strftime('%m/%d/%Y'), exit_price, (exit_price/start_price-1)*100))
for start_date in [datetime(2007, 11, 16) + relativedelta(months=i) for i in range(12)]:
get_pnl(prices, start_date)