import pandas as pd
import numpy as np
import datetime as dt
import requests
import math
import matplotlib.pyplot as plt 
from termcolor import colored as cl 
 

     
plt.style.use('fivethirtyeight')
plt.rcParams['figure.figsize'] = (20, 10)

def get_historic_data(symbol):
    ticker = symbol
    iex_api_key = 'Tpk_9e3166e4053b4d99addc43ba300c2d42' 
    api_url = f'https://sandbox.iexapis.com/stable/stock/{ticker}/chart/max?token={iex_api_key}'
    df = requests.get(api_url).json()
    
    date = []
    open = []
    high = []
    low = []
    close = []
    
    for i in range(len(df)):
        date.append(df[i]['date'])
        open.append(df[i]['open'])
        high.append(df[i]['high'])
        low.append(df[i]['low'])
        close.append(df[i]['close'])
    
    date_df = pd.DataFrame(date).rename(columns = {0:'date'})
    open_df = pd.DataFrame(open).rename(columns = {0:'open'})
    high_df = pd.DataFrame(high).rename(columns = {0:'high'})
    low_df = pd.DataFrame(low).rename(columns = {0:'low'})
    close_df = pd.DataFrame(close).rename(columns = {0:'close'})
    frames = [date_df, open_df, high_df, low_df, close_df]
    df = pd.concat(frames, axis = 1, join = 'inner')
    return df
stock = input ( "Please enter stock symbol: " )
#stock = 'stock'

data = get_historic_data(stock)
data .to_csv(r'Desktop\stocks.csv')
stocks= pd.read_csv(r'Desktop\stocks.csv').set_index('date')


#startyear=int(input("Enter a Start Year #### : "))
#startmonth=int(input("Enter a Start Month # : "))
#startday=int(input("Enter a Start Day # : "))

startyear=2019
startmonth=1
startday=1
start=dt.datetime(startyear,startmonth,startday)
now=dt.datetime.now()

date = dt.datetime(startyear,startmonth,startday)
stocks.index = pd.to_datetime(stocks.index)
stocks = stocks[stocks.index >= str(date)]
plt.plot(stocks.index, stocks['close'])
plt.xlabel('Date')
plt.ylabel('Closing Prices')
plt.title('stocks Stock Prices'+str(date)+'-2019')
#plt.show()

import yfinance as yf
   
start1 = '2018-01-01'
end1='2021-03-01'
# looping over tickers and creating a dataframe with close prices
stocks = yf.download('msft',start1,end1,interval='1d')
stocks['close'] = stocks['Close']

def sma(data, window):
    sma = data.rolling(window = window).mean()
    return sma

stocks['sma_X'] = sma(stocks['close'], 3)
print(stocks.tail())

#stocks['close'].plot(label = 'CLOSE', alpha = 0.6)
#stocks['sma_X'].plot(label = 'SMA X', linewidth = 2)
#plt.xlabel('Date')
#plt.ylabel('Closing Prices')
#plt.legend(loc = 'upper left')
#plt.show()

def bb(data, sma, window):
    std = data.rolling(window = window).std()
    upper_bb = sma + std * 2
    mid_bb = sma
    lower_bb = sma - std * 2
    return upper_bb, mid_bb, lower_bb

stocks['upper_bb'], stocks['lower_bb'], stocks['mid_bb'] = bb(stocks['close'], stocks['sma_X'], 3)
stocks['bb_w'] = (stocks['upper_bb'] -  stocks['lower_bb'])/stocks['close']
print(stocks.tail())

def ema(data, window):
    ema= data.rolling(window = window).mean()
    return ema
#$def ema(data, window):
 # $  ema = round(data.ewm(span= window, adjust=False).mean(),2)  
   # return ema
stocks['ema_1'] = ema(stocks['close'], 1)
stocks['ema_3'] = ema(stocks['close'], 3)
stocks['ema_5'] = ema(stocks['close'], 5)
stocks['ema_8'] = ema(stocks['close'], 8)
#stocks['ema_13'] = ema(stocks['close'], 13)
#stocks['ema_14'] = ema(stocks['close'], 14)
stocks['ema_21'] = ema(stocks['close'], 21)
stocks['ema_34'] = ema(stocks['close'], 34)
stocks['ema_55'] = ema(stocks['close'], 55)
#stocks['ema_144'] = ema(stocks['close'], 144)
#stocks['ema_233'] = ema(stocks['close'], 233)
######Calculating ATR


def ATR(DF,n):
    "function to calculate True Range and Average True Range"
    df = DF.copy()
    df['H-L']=abs(df['High']-df['Low'])
    df['H-PC']=abs(df['High']-df['Adj Close'].shift(1))
    df['L-PC']=abs(df['Low']-df['Adj Close'].shift(1))
    df['TR']=df[['H-L','H-PC','L-PC']].max(axis=1,skipna=False)
    df['ATR'] = df['TR'].rolling(n).mean()
    #df['ATR'] = df['TR'].ewm(span=n,adjust=False,min_periods=n).mean()
    df2 = df.drop(['H-L','H-PC','L-PC'],axis=1)
    return df2


stocks1 = ATR(stocks, 14)

data = stocks.copy()
h_l = data["High"] - data["Low"]
h_cp = abs(data["High"] - data["Close"].shift(1))
l_cp = abs(data["Low"] - data["Close"].shift(1))
true_range2 = (h_l, h_cp, l_cp)
true_range2
true_range3 = pd.DataFrame(true_range2)
true_range4 = true_range3.T
true_range4.columns = ["h_l", "h_cp", "l_cp"]
data["maximum_value"] = true_range4.max(axis = 1)
length = 21
data['ATR'] = data["maximum_value"].rolling(length).mean()


data['atr_ts1'] = ''
data['atr_ts2'] = ''
df = data
df['crossover'] = ''
mul =3.5
long_short = input("Are you long or short?")
if long_short == 'long':
    df['atr_ts1'] = df['Close'] - (mul * df['ATR'])
    df['atr_ts2'] = df['atr_ts1'].cummax()
    df['crossover'] = df['atr_ts2'] > df['Close']
elif long_short == 'short':
    df['atr_ts1'] = df['Close'] + (mul * df['ATR'])
    df['atr_ts2'] = df['atr_ts1'].cummin()
    df['crossover'] = df['atr_ts2'] < df['Close']
    



fig, ax = plt.subplots(figsize=(20,10), sharex = False, sharey = False)
df.loc[df.index, 'Adj Close'].plot(ax=ax)
df.loc[df.index, 'atr_ts2'].plot(ax=ax)
ax.set_title('Trailing Stop Loss Against Close Price')



def implement_sma_strategy(data1, ema_1, ema_3,ema_5,ema_8,ema_34,  ema_55, ema_21 ):
    buy_price = []
    sell_price = []
    sma_signal = []
    tickers_ret =[]
    mul= 3.5
    signal = 0
    data1 = df.copy()
    for i in range(len(df)):
          if signal !=1:
                if(ema_1[i] < ema_3[i]) or (ema_21[i] < ema_55[i]):
                   buy_price.append(data1['Close'][i])
                   sell_price.append(np.nan)
                   signal = 1
                   sma_signal.append(signal)
                elif (ema_3[i] < ema_8[i]) or (ema_1[i] > ema_55[i]) or (ema_3[i] > ema_5[i]):
                   buy_price.append(np.nan)
                   sell_price.append(data1['Close'][i])
                   signal = -1
                   sma_signal.append(-1)
          elif signal == 1:
               if data1['Close'][i] < data1['atr_ts1'][i]:
                   sell_price.append(data1['atr_ts2'][i])
                   buy_price.append(np.nan)
                   signal = -1
                   sma_signal.append(signal)
    
               # else:
                  #   buy_price.append(np.nan)
                  #   sell_price.append(np.nan)
                  #   sma_signal.append(0)  
                              
        
    return buy_price, sell_price, sma_signal

               
              

# identifying signals and calculating daily return (stop loss factored in)

ema_1 = stocks['ema_1']
ema_8 = stocks['ema_8']
ema_21= stocks['ema_21']
ema_5 = stocks['ema_5']
ema_34 = stocks['ema_34']
ema_55 = stocks['ema_55']
ema_3 = stocks['ema_3']
buy_price, sell_price, signal = implement_sma_strategy(df, ema_1,  ema_3,ema_5,ema_8,ema_34,  ema_55, ema_21) 
position = []
for i in range(len(signal)):
    if signal[i] > 1:
        position.append(0)
    else:
        position.append(1)
        
for i in range(len(stocks['close'])):
    if signal[i] == 1:
        position[i] = 1
    elif signal[i] == -1:
        position[i] = 0
    else:
        position[i] = position[i-1]
        
data1 =stocks.index
ema_1 = pd.DataFrame(ema_1).rename(columns = {0:'ema_1'})
ema_8 = pd.DataFrame(ema_8 ).rename(columns = {0:'ema_8'})
ema_21= pd.DataFrame(ema_21).rename(columns = {0:'ema_21'})
ema_5 = pd.DataFrame(ema_5).rename(columns = {0:'ema_5'})
ema_34 = pd.DataFrame(ema_34).rename(columns = {0:'ema_34'})
ema_55 = pd.DataFrame(ema_55).rename(columns = {0:'ema_55'})
ema_3 = pd.DataFrame(ema_3).rename(columns = {0:'ema_3'})
signal = pd.DataFrame(signal).rename(columns = {0:'ema_signal'}).set_index(data1)
position = pd.DataFrame(position).rename(columns = {0:'ema_position'}).set_index(data1)
frames = [ema_1, ema_8,ema_21,ema_5,ema_34 , ema_55,ema_3, signal, position]
strategy = pd.concat(frames, join = 'inner', axis = 1)
#strategy = strategy.reset_index().drop('date', axis = 1)


##绾垮浘 
stocks_ret= pd.DataFrame(df['Close'].pct_change()[1:])
stocks_ret.columns = ['returns']

ema_strategy_ret = []

for i in range(len(stocks_ret)):
    try:
        returns = stocks_ret['returns'][i]*strategy['ema_position'][i]
        ema_strategy_ret.append(returns)
    except:
        pass
    
ema_strategy_ret_df = pd.DataFrame(ema_strategy_ret).rename(columns = {0:'ema_returns'}).set_index(stocks_ret.index)

fig, ax = plt.subplots()
plt.plot(((1+ema_strategy_ret_df['ema_returns']).cumprod())*10000000, color = 'blue')


##with total amount money 
stocks_ret1= pd.DataFrame(np.diff(stocks['close'])).rename(columns = {0:'returns'})
ema_strategy_ret1= []

for i in range(len(stocks_ret1)):
    try:
        returns =stocks_ret1['returns'][i]*strategy['ema_position'][i]
        ema_strategy_ret1.append(returns)
    except:
        pass
    
ema_strategy_ret_df1= pd.DataFrame(ema_strategy_ret1).rename(columns = {0:'ema_returns'})

investment_value = 10000000
number_of_stocks = math.floor(investment_value/stocks['close'][1])
ema_investment_ret = []
for i in range(len(ema_strategy_ret_df1['ema_returns'])):
    returns = number_of_stocks*ema_strategy_ret_df1['ema_returns'][i]
    ema_investment_ret.append(returns)
    
ema_investment_ret_df = pd.DataFrame(ema_investment_ret).rename(columns = {0:'investment_returns'}).set_index(stocks_ret.index)
total_investment_ret = round(sum(ema_investment_ret_df['investment_returns']), 2)
GainedinP=round((total_investment_ret/investment_value)*100,2)

#print(str(stocks))
print(cl('\n\n------------------------------------------\n\nStart from '+str(date)+'锛?\nProfit (cumulative returns) gained '+str(GainedinP)+'% by using SFIM-2-03 strategy \nBy investing $'+str(investment_value)+' in '+str(stock)+', the profit will be : ${}'.format(total_investment_ret), attrs = ['bold']))

df['Close'].plot(label = 'CLOSE PRICES', color = 'skyblue')
df['ema_1'].plot(label = 'KeyLine', linestyle = '--', linewidth = 1)
df['ema_3'].plot(label = 'Fast', linestyle = '--', linewidth = 1.2)
df['ema_5'] .plot(label = 'Fast2', linestyle = '--', linewidth = 1.2)
df['ema_8'].plot(label = 'Mid0', linestyle = '--', linewidth = 1.2)
#stocks['ema_13'].plot(label = 'ema_13', linestyle = '--', linewidth = 1.2)
#stocks['ema_14'].plot(label = 'ema_14', linestyle = '--', linewidth = 1.2)
df['ema_21'].plot(label = 'LifeLine', linestyle = '--', linewidth = 1.2) 
df['ema_34'].plot(label = 'Neck', linestyle = '--', linewidth = 1.2)
df['ema_55'].plot(label = 'BloodLine', linestyle = '--', linewidth = 1.2)

df['upper_bb'].plot(label = 'UPPER SD', linestyle = '--', linewidth = 1, color = 'black')
df['mid_bb'].plot(label = 'MIDDLE SD', linestyle = '--', linewidth = 1.2, color = 'grey')
df['lower_bb'].plot(label = 'LOWER SD', linestyle = '--', linewidth = 1, color = 'black')
#stocks['ema_144'].plot(label = 'ema_144', linestyle = '--', linewidth = 1.2) 
#stocks['ema_233'].plot(label = 'ema_233', linestyle = '--', linewidth = 1.2)
plt.scatter(df.index, buy_price, marker = '^', s = 200, color = 'darkblue', label = 'BUY SIGNAL')
plt.scatter(df.index, sell_price, marker = 'v', s = 200, color = 'crimson', label = 'SELL SIGNAL')
plt.legend(loc = 'upper left')
plt.title('Seabridge Fintech SFIM+ Buy Low Sell High \nStock ticker: Cumulative Returns Since 2019-01-01:  '+str(GainedinP)+'%')
plt.show()


stockabc=str(stock)
###without money invested
#print('\n\n------------------------------------------\n\nSeabridge Fintech SFIM+ Strategy Compared With Benchmark stock')
def get_benchmark(stock_prices, start_date, investment_value):
    stock = get_historic_data(stockabc)
    stock = stock.set_index('date')
    stock.index = pd.to_datetime(stock.index)
    stock = stock[stock.index >= start_date]
    benchmark= pd.DataFrame(stock['close'].pct_change()[1:])
    benchmark.columns = ['benchmark_returns']
    
    investment_value = investment_value
    number_of_stocks = math.floor(investment_value/stock_prices[-1])
    benchmark_investment_ret = []
    
    for i in range(len(benchmark['benchmark_returns'])):
       #returns = number_of_stocks*benchmark['benchmark_returns'][i]
        returns =benchmark['benchmark_returns'][i]
        benchmark_investment_ret.append(returns)

    benchmark_investment_ret_df = pd.DataFrame(benchmark_investment_ret).rename(columns = {0:'investment_returns'})
    return benchmark_investment_ret_df

benchmark = get_benchmark(stocks['close'], '2019-1-1', 10000000)
benchmark = benchmark.set_index(stocks_ret.index)

fig, ax = plt.subplots()
plt.plot(((1+ema_strategy_ret_df['ema_returns']).cumprod())*10000000, color = 'blue')
plt.plot(((1+benchmark['investment_returns']).cumprod())*10000000, color = 'red')
plt.title("Ticker: "+str(stock)+ "'s Return vs Seabridge Fintech Scalping Swing Return")
plt.ylabel("Profit")
plt.xlabel("Year")
ax.legend(["Seabridge Fintech Scalping Swing Return", str(stock)+"'s Return"],loc ="upper left")
#lt.yticks(np.arange(10000, 70000, step=5000))
plt.xticks(rotation = 45)





##with 10000000 invested
def get_benchmark1(stock_prices, start_date, investment_value):
    stock = get_historic_data(stockabc)
    stock = stock.set_index('date')
    stock.index = pd.to_datetime(stock.index)
    stock = stock[stock.index >= start_date]
    benchmark=pd.DataFrame(np.diff(stock['close'])).rename(columns = {0:'returns'})
    benchmark.columns = ['benchmark_returns']
    
    investment_value = investment_value
    number_of_stocks = math.floor(investment_value/stock_prices[-1])
    benchmark_investment_ret1= []
    
    for i in range(len(benchmark['benchmark_returns'])):
        returns1= number_of_stocks*benchmark['benchmark_returns'][i]
        benchmark_investment_ret1.append(returns1)

    benchmark_investment_ret_df1= pd.DataFrame(benchmark_investment_ret1).rename(columns = {0:'investment_returns'})
    return benchmark_investment_ret_df1
investment_value = 10000000
total_benchmark_investment_ret = round(sum(benchmark['investment_returns']), 2)
benchmark_profit_percentage = math.floor((total_benchmark_investment_ret/investment_value)*100)
print(cl('Benchmark profit by investing $100k : {}'.format(total_benchmark_investment_ret), attrs = ['bold']))
print(cl('Benchmark Profit percentage : {}%'.format(benchmark_profit_percentage), attrs = ['bold']))
print(cl('Seabridge Fintech Scalping Swing Strategy profit is {}% higher than the Benchmark Profit'.format(GainedinP- benchmark_profit_percentage), attrs = ['bold']))
    

benchmark_total = get_benchmark1(stocks['close'], '2019-1-1', 10000000)
benchmark_total = benchmark_total.set_index(stocks_ret.index)
fig, ax = plt.subplots()
plt.plot(ema_investment_ret_df['investment_returns'],linewidth = 2, color = 'red')
plt.plot(benchmark_total['investment_returns'],  linestyle = '--', linewidth = 1, color = 'blue')
plt.title(str(stock)+"'s Return vs Seabridge Fintech Scalping Swing Return")
plt.ylabel("Profit")
plt.xlabel("Year")
ax.legend(["Seabridge Fintech Scalping Swing Return",str(stock)+"'s Return"],loc ="upper left")
#lt.yticks(np.arange(10000, 70000, step=5000))
plt.xticks(rotation = 45)




