class Indicators(): def __init__(self): self.DC=DataCollect() #Clean up the format of indicator to every indicator def Indic_gen(self,histprice,histindic): histindic=pd.DataFrame(histindic) histindic['date']=histprice['date'] histindic.columns=(['indic','date']) histindic=histindic[['date','indic']] return(histindic) def Onedayback(self,histindic): histindic['date']=histindic['date'].shift(-1) histindic=histindic.loc[histindic['date'].isnull()==False,:].copy() return(histindic) #Calculate the RSI of each index def RSI(self,ticker): histprice=self.DC.Hist_price(ticker) histindic=TA.momentum.rsi(histprice['close'],window=14) histindic=self.Indic_gen(histprice,histindic,ticker) histindic['indic']=np.nan histindic.loc[histindic['indic']>=70,['indic']]=0 histindic.loc[histindic['indic']<=50,['indic']]=1 histindic=histindic.fillna(method='ffill') return(histindic) def ADX(self,histprice): ADX=TA.trend.adx(histprice['high'], histprice['low'], histprice['close'],window=14,fillna=False) ADX_NEG=TA.trend.adx_neg(histprice['high'], histprice['low'], histprice['close'],window=14,fillna=False) ADX_POS=TA.trend.adx_pos(histprice['high'], histprice['low'], histprice['close'],window=14,fillna=False) adx=pd.DataFrame([ADX,ADX_NEG,ADX_POS]) adx=adx.transpose() adx['date']=histprice['date'] adx['adx_status']='NA' adx.loc[adx['adx_pos']>adx['adx_neg'],'adx_status']='bull' adx.loc[adx['adx_pos']<adx['adx_neg'],'adx_status']='bear' return(adx) def MACD(self,histprice): mdff=TA.trend.macd_diff(histprice['close']) masig=TA.trend.macd_signal(histprice['close']) macd=pd.DataFrame([mdff,masig]) macd=macd.transpose() macd['date']=histprice['date'] macd['diff']=macd['mdff']-macd['masig'] return(macd) def Kama(self,histprice): histindic=TA.momentum.kama(histprice['close']) return(histindic) def Ppo(self,histprice): histindic=TA.momentum.ppo(histprice['close']) return(histindic) def ROC(self,histprice): histindic=TA.momentum.ppo(histprice['close']) return(histindic)
@author: wudi """ import pandas as pd import numpy as np from Toolbox import DataCollect from Toolbox import WeightScheme from MSSQL import MSSQL from Toolbox import ReturnCal from Toolbox import DataStructuring from Querybase import Query from scipy import stats from itertools import chain from Quant import Optimize from HotStock import SecR DC=DataCollect() RC=ReturnCal() DS=DataStructuring() Q=Query() WS=WeightScheme() Opt=Optimize() SR=SecR() #rebaldaylist=DC.Rebaldaylist(startdate,rebal_period) class Prep(): def __init__(self): pass #use the query in Querybase to download hitorical signal def Funda_download(self,startdate,signal): ms = MSSQL(host="GS-UATVDBSRV01\GSUATSQL",user="******",pwd="SASThom111",db="JYDBBAK") query=getattr(Q,signal)(startdate)
def __init__(self): self.DC = DataCollect()
class Indicators(): def __init__(self): self.DC = DataCollect() #Clean up the format of indicator to every indicator def Indic_gen(self, histprice, histindic): histindic = pd.DataFrame(histindic) histindic['date'] = histprice['date'] histindic.columns = (['indic', 'date']) histindic = histindic[['date', 'indic']] return (histindic) def Onedayback(self, histindic): histindic['date'] = histindic['date'].shift(-1) histindic = histindic.loc[histindic['date'].isnull() == False, :].copy() return (histindic) def MACD(self, ticker): histprice = self.DC.Hist_price(ticker) diff = TA.trend.macd_diff(histprice['close']) diff = self.Indic_gen(histprice, diff) diff['MACD_sig'] = np.nan diff.loc[diff['indic'] > 0, ['MACD_sig']] = 1 diff.loc[diff['indic'] <= 0, ['MACD_sig']] = 0 diff['MACD_sig'] = diff['MACD_sig'].fillna(method='ffill') diff = self.Onedayback(diff) return (diff) def SMA(self, ticker): histprice = self.DC.Hist_price(ticker) sma50 = TA.trend.sma_indicator(histprice['close'], window=50) sma50 = self.Indic_gen(histprice, sma50) sma50 = sma50.rename(columns={'indic': 'sma50'}) sma100 = TA.trend.sma_indicator(histprice['close'], window=100) sma100 = self.Indic_gen(histprice, sma100) sma100 = sma100.rename(columns={'indic': 'sma100'}) sma = pd.merge(sma50, sma100[['date', 'sma100']], on='date', how='left') sma = sma.loc[sma['sma100'].isnull() == False, :].copy() sma['diff'] = sma['sma50'] - sma['sma100'] sma['SMA_sig'] = np.nan sma.loc[sma['diff'] > 0, ['SMA_sig']] = 1 sma.loc[sma['diff'] <= 0, ['SMA_sig']] = 0 sma['diff'] = sma['diff'].fillna(method='ffill') sma = self.Onedayback(sma) return (sma) #Calculate the RSI of each index def RSI(self, ticker): histprice = self.DC.Hist_price(ticker) histindic = TA.momentum.rsi(histprice['close'], window=14) histindic = self.Indic_gen(histprice, histindic, ticker) histindic['indic'] = np.nan histindic.loc[histindic['indic'] >= 70, ['indic']] = 0 histindic.loc[histindic['indic'] <= 50, ['indic']] = 1 histindic = histindic.fillna(method='ffill') return (histindic) def ADX(self, histprice): histindic = TA.trend.adx(histprice['high'], histprice['low'], histprice['close'], window=14, fillna=False) return (histindic) def Kama(self, histprice): histindic = TA.momentum.kama(histprice['close']) return (histindic) def Ppo(self, histprice): histindic = TA.momentum.ppo(histprice['close']) return (histindic) def ROC(self, histprice): histindic = TA.momentum.ppo(histprice['close']) return (histindic)
def __init__(self): self.DC = DataCollect() self.I = Indicators()
class Analysis(): def __init__(self): self.DC = DataCollect() self.I = Indicators() #combine historical price and RSI of each sector #return each sector's RSI or ROC on rebalday #each sector's price (every tradingday) def Single_backtest(self, ticker, indicname): histindic = getattr(self.I, indicname)(ticker) histreturn = self.DC.Hist_return(ticker) histreturn = pd.merge(histreturn, histindic, on='date', how='left') histreturn = histreturn.sort_values(by=['date'], ascending=[True]) histreturn['return'] = histreturn['dailyreturn'] * histreturn[indicname + '_sig'] histreturn = histreturn.loc[histreturn['return'].isnull() == False, :].copy() PNL = histreturn[['date', 'return']].copy() PNL['stratReturn'] = np.exp(np.log1p(PNL['return']).cumsum()) return (histindic, PNL) def Combine(self): rebaldaylist = DC.Rebaldaylist('2008-12-31', 10) tickerlist = [ '000951', '000952', '000849', '000928', '000929', '000930', '000931', '000932', '000933', '000935', '000936', '000937' ] hist_market = self.I.Hist_price('000985')[['date']] hist_price = self.I.Hist_price('000985')[['date']] for ticker in tickerlist: histindic = RSI(ticker) hist_market = pd.merge(hist_market, histindic[['date', ticker]], on='date', how='left') hist_price = pd.merge(hist_price, histprice[['date', ticker]], on='date', how='left') hist_price = hist_price.sort_values(by=['date'], ascending=[True]) hist_market = hist_market.sort_values(by=['date'], ascending=[True]) hist_market_indic = pd.melt( hist_market, id_vars='date', value_vars=list(hist_market.columns[1:len(hist_market.columns) + 1]), var_name='ticker', value_name='indic') hist_market_indic = hist_market_indic.loc[ hist_market_indic['date'].isin(rebaldaylist), :] hist_market_indic['indic_rank'] = hist_market_indic.groupby( "date")["indic"].rank("dense", ascending=False) hist_market_indic = hist_market_indic.sort_values(by=['date'], ascending=[True]) return (hist_market_indic, hist_price) #Backtest the strategy of buying top3 highest value of the indicator (whatever indicator) def Top3_backtest(): indexdaily = Hist_return() hist_market_indic, hist_price = Combine() hist_market_indic = hist_market_indic.loc[ hist_market_indic['indic_rank'] <= 3, ].copy( ) #take the 3sectors with the highest RSI on each rebal day hist_market_indic = hist_market_indic.pivot_table(index='date', columns='ticker', values='indic_rank', aggfunc='first') hist_market_indic.reset_index(inplace=True) hist_market_indic = hist_market_indic.sort_values(by=['date'], ascending=[True]) hist_market_indic = hist_market_indic.fillna( 0) #Fill na with 0, these are the non top3 sectors on rebal day hist_market_indic = pd.merge(hist_price[['date']], hist_market_indic, on='date', how='left') hist_market_indic = hist_market_indic.fillna(method='ffill') hist_market_indic['date'] = hist_market_indic['date'].shift(-1) hist_market_indic = hist_market_indic.loc[ hist_market_indic['date'].isnull() == False, :].copy() hist_market_indic = pd.melt( hist_market_indic, id_vars='date', value_vars=list( hist_market_indic.columns[1:len(hist_market_indic.columns) + 1]), var_name='ticker', value_name='indic_rank') hist_market_indic = hist_market_indic.loc[ hist_market_indic['indic_rank'] > 0, :].copy() hist_market_indic = hist_market_indic.sort_values(by=['date'], ascending=[True]) hist_market_indic[ 'index'] = hist_market_indic['date'] + hist_market_indic['ticker'] indexdaily['index'] = indexdaily['date'] + indexdaily['ticker'] dailyreturn_select = indexdaily.loc[ indexdaily['index'].isin(hist_market_indic['index']), :].copy( ) #select the dailyreturn of each period's top3 RSI sectors dailyreturn_select['dailyreturn'] = dailyreturn_select[ 'dailyreturn'].astype(float) dailyreturn_select['return'] = dailyreturn_select.groupby( 'date')['dailyreturn'].transform('mean') dailyreturn_select = dailyreturn_select.drop_duplicates( subset=['date'], keep='last') dailyreturn_select = dailyreturn_select.sort_values(by=['date'], ascending=[True]) PNL = dailyreturn_select[['date', 'return']].copy() PNL['stratReturn'] = np.exp(np.log1p(PNL['return']).cumsum()) return (PNL)
# -*- coding: utf-8 -*- """ Created on Thu May 28 11:22:16 2020 @author: wudi """ import pandas as pd import numpy as np from MSSQL import MSSQL from Toolbox import DataCollect from Toolbox import ReturnCal from Toolbox import WeightScheme DC = DataCollect() RC = ReturnCal() dailyreturn = DC.Dailyreturn_retrieve() WS = WeightScheme() class Prep(): def __init__(self): pass #use the query in Querybase to download hitorical signal def Bank_download(self): ms = MSSQL(host="GS-UATVDBSRV01\GSUATSQL", user="******", pwd="SASThom111", db="JYDBBAK") siglist = [ '23000', '22800', '55000', '26200', '26000', '30240', '21300'
from FundaStock import Funda as FundaStockFund from FundaStock import Prep as FundaStockPrep from Toolbox import DataCollect from Toolbox import WeightScheme from HotStock import Prep as HSPrep from HotStock import Review as HSReview from HotStock import SecR as SR from AnalystStock import Top_analyst as ASTA from AnalystStock import Niu2 as ASNiu2 from AnalystStock import Prep as APrep from BankFunda import Prep as BankFP from Toolbox import DataStructuring from scipy import stats from Quant import Otho DC = DataCollect() FP = FundaStockPrep() FF = FundaStockFund() HP = HSPrep() HR = HSReview() TA = ASTA() N = ASNiu2() AP = APrep() BFP = BankFP() WS = WeightScheme() DS = DataStructuring() OT = Otho() SRDaily = SR() N.Analyst_history() print("analyst_history_updated")