self.detailDf = single_trade_details(self.df, poChgCol=poChgCol, originSignal=originSignal, at_once=at_once, mode=mode) self.evalSer = overall_eval(self.df, self.detailDf) self.yearDf = year_month_analysis(self.detailDf) self.plot_equity_curve(period=period, contrast=contrast, labels=labels) #################### Single_Proportion用于日线策略的回测例子 ############################################################# # 这个是single_proportion_backtest的使用例子,以及在图上显示回测结果,参数是at_once=True,mode='longshort' if __name__ == '__main__': import talib as ta from tools.data import fetch df = fetch.index_one('000001.SH', endTime='2010-12-31') # 短一点,避免卡 # 计算DEA指标 df['DIFF'], df['DEA'], df['MACD'] = ta.MACD(df['CLOSE']) df.dropna(axis=0, inplace=True) df['MACD'] = df['MACD'] * 2 from tools.backtest import signal # 生成原始信号和买卖标记 signal.up_cross(df, fastline='DIFF', slowline='DEA') # 多了一列signal signal.signal2position_single(df, signalCol='signal', at_once=True, mode='longshort') # 仓位:即期,多空,止损,保证金 # 单个品种的回测 btest = Single_Proportion(df,
# 第一个划分牛熊的想法 if __name__ == '__main__': from tools.data import fetch import datetime as dt import pandas as pd from tools.tinytools import pandas_related, group_method df = fetch.index_one('000001.SH', startTime='2000-01-01') df['6_month_peak'] = df['HIGH'].rolling(130).max() df['1_month_peak'] = df['HIGH'].rolling(22).max() df['3_month_bottom'] = df['LOW'].rolling(65).min() df['12_month_bottom'] = df['LOW'].rolling(250).min() df['24_month_bottom'] = df['LOW'].rolling(510).min() df['3_month_std'] = df['CLOSE'].rolling(65).std() df['bb_tag'] = None pandas_related.cal_intraperiod_return(df) # 分牛熊 for index in df.index[1:]: preIndex = pandas_related.previous_index(df, index) # if index[0] == dt.datetime(2009, 4, 24): # pass if df.at[index, 'monthly_return'] > 0.1 \ and df.at[index, 'CLOSE'] / df.at[index, '3_month_bottom'] > 1.4 \ and df.at[preIndex, 'bb_tag'] is None: df.at[index, 'bb_tag'] = '牛市' _base = df.at[index, '3_month_bottom']
if __name__ == '__main__': import pandas as pd from tools.data import fetch from tools.backtest import timing, signal dfzz500 = fetch.index_one('000905.SH',startTime='2007-01-15') dfsz50 = fetch.index_one('000016.SH',startTime='2007-01-15') df = pd.DataFrame() df['target'] = dfsz50.reset_index(level=1)['PCTCHANGE'] - dfzz500.reset_index(level=1)['PCTCHANGE'] df['sz50'] = dfsz50.reset_index(level=1)['CLOSE'] df['zz500'] = dfzz500.reset_index(level=1)['CLOSE'] df['return_sz50'] = dfsz50.reset_index(level=1)['PCTCHANGE'] / 100 df['return_zz500'] = dfzz500.reset_index(level=1)['PCTCHANGE'] / 100 signal.up_cross(df, 'target') signal.signal2position_multi(df, signalCol='signal', mode='longshort', ) timing.multi_proportion_backtest(df,['sz50','zz500'],[1,-1],[0.5,0.5],tCost=0.0002,) detailDf = timing.multi_trade_details(df,originSignal='signal',pxColList=['sz50','zz500'],longshortList=[1,-1],proportionList=[0.5,0.5]) evalSer = timing.overall_eval(df,detailDf) yearDf = timing.year_month_analysis(detailDf)
f"self.window.{minIndex}.patches.remove(self.allDf.at['{minIndex}', 'musk'])" ) self.allDf.at[minIndex, 'musk'] = None self.window.fig.canvas.draw_idle() if __name__ == '__main__': # intradayWindow = Intraday_General() dfDay = fetch.stock_one('601318', startTime='2014-04-28', endTime='2018-08-10') df1min = fetch.n_min('601318', 1) intraday = Intraday_General(dfDay=dfDay, df1min=df1min) dftechMin = fetch.n_min('000001.SH', startTime='2014-04-28', endTime='2018-08-10') dftechDay = fetch.index_one('000001.SH', startTime='2014-04-28', endTime='2018-08-10') intraday.attach_min_data(dfminTech=dftechMin, axName='tech1', className='Intraday_Close', precloseSrcDf=dftechDay) intraday.attach_day_data(dfdayTech=dftechDay, axName='tech2', className='Candle') intraday.musk(if_day=False, if_min=False)
df['poChg'] = df['poChg_real'] if df.at[df.loc[df['poChg'] != 0.0].index[0], 'poChg'] \ * df.at[df.loc[df['poChg'] != 0.0].index[-1], 'poChg'] < 0: pass else: df.at[df.loc[df['poChg'] != 0.0].index[-1], 'poChg'] = 0 df.drop('poChg_real', axis=1, inplace=True) #################### 产生信号函数的使用范例 ############################################################################## if __name__ == '__main__': # 这个是up_cross的使用例子 import talib as ta from tools.data import fetch df = fetch.index_one('000001.SH', endTime='2010-12-31') # 短一点,避免卡 # 计算DEA指标 df['DIFF'], df['DEA'], df['MACD'] = ta.MACD(df['CLOSE']) df.dropna(axis=0, inplace=True) df['MACD'] = df['MACD'] * 2 # 生成买卖标记 up_cross(df, fastline='DIFF', slowline='DEA') # 多了一列signal del df if __name__ == '__main__': # 这个是long_short_signal的使用例子 import talib as ta from tools.data import fetch df = fetch.index_one('000001.SH', endTime='2010-12-31') # 短一点,避免卡
groupCopy.dropna(inplace=True) return groupCopy def groupFunc_find_updown_ratio(group): return pd.DataFrame([ len(group.loc[group['确认点'] == 1].index), len(group.loc[group['确认点'] == -1].index) ], index=['up', 'down']).T # 下面是日线级别的行业趋势度的计算 if __name__ == '__main__': from tools.data import fetch dfAllA = fetch.index_one('881001.WI') # 取中信二级行业来代替原报告中申万二级行业 dfCiticslvl2 = fetch.index_industry_list('all', citicslevel=2) dfCiticslvl2.dropna(inplace=True) dfCiticslvl2.drop(['S_INFO_NAME', 'S_INFO_INDUSTRYCODE', 'level'], axis=1, inplace=True) # 对中信2级行业中每个行业计算DEA分段新逻辑的买卖确认点 dfCiticslvl2 = dfCiticslvl2.groupby( level=1).apply(groupfunc_find_subindustry_buysell) dfCiticslvl2.reset_index(level=0, inplace=True, drop=True) dfCiticslvl2.sort_index(level=[0, 1], inplace=True) # 由于数据原因,前面的日期处于状态内的行业数只有少数几个,后面有些行业处于状态数也比较小,一个简单的标准是取大于40的日期。 _groupCountTemp = dfCiticslvl2.groupby(level=0)['CLOSE'].count()