def sample_814(show=True): """ 8.1.4 对多支股票进行择时 :return: """ sell_factor1 = {'xd': 120, 'class': AbuFactorSellBreak} sell_factor2 = {'stop_loss_n': 0.5, 'stop_win_n': 3.0, 'class': AbuFactorAtrNStop} sell_factor3 = {'class': AbuFactorPreAtrNStop, 'pre_atr_n': 1.0} sell_factor4 = {'class': AbuFactorCloseAtrNStop, 'close_atr_n': 1.5} sell_factors = [sell_factor1, sell_factor2, sell_factor3, sell_factor4] benchmark = AbuBenchmark() buy_factors = [{'xd': 60, 'class': AbuFactorBuyBreak}, {'xd': 42, 'class': AbuFactorBuyBreak}] choice_symbols = ['usTSLA', 'usNOAH', 'usSFUN', 'usBIDU', 'usAAPL', 'usGOOG', 'usWUBA', 'usVIPS'] capital = AbuCapital(1000000, benchmark) orders_pd, action_pd, all_fit_symbols_cnt = ABuPickTimeExecute.do_symbols_with_same_factors(choice_symbols, benchmark, buy_factors, sell_factors, capital, show=False) metrics = AbuMetricsBase(orders_pd, action_pd, capital, benchmark) metrics.fit_metrics() if show: print('orders_pd[:10]:\n', orders_pd[:10].filter( ['symbol', 'buy_price', 'buy_cnt', 'buy_factor', 'buy_pos', 'sell_date', 'sell_type_extra', 'sell_type', 'profit'])) print('action_pd[:10]:\n', action_pd[:10]) metrics.plot_returns_cmp(only_show_returns=True) return metrics
def sample_91(show=True): """ 9.1 度量的基本使用方法 :return: """ # 设置初始资金数 read_cash = 1000000 # 择时股票池 choice_symbols = [ 'usNOAH', 'usSFUN', 'usBIDU', 'usAAPL', 'usGOOG', 'usTSLA', 'usWUBA', 'usVIPS' ] # 使用run_loop_back运行策略 abu_result_tuple, kl_pd_manager = abu.run_loop_back( read_cash, buy_factors, sell_factors, stock_pickers, choice_symbols=choice_symbols, n_folds=2) metrics = AbuMetricsBase(*abu_result_tuple) metrics.fit_metrics() if show: metrics.plot_returns_cmp() return metrics
def sample_a21(): # 设置初始资金数 read_cash = 50000 ########################################################################################### # 回测生成买入时刻特征 abupy.env.g_enable_ml_feature = True # 回测将symbols切割分为训练集数据和测试集数据 abupy.env.g_enable_train_test_split = True # 下面设置回测时切割训练集,测试集使用的切割比例参数,默认为10,即切割为10份,9份做为训练,1份做为测试, # 由于美股股票数量多,所以切割分为4份,3份做为训练集,1份做为测试集 abupy.env.g_split_tt_n_folds = 4 ########################################################################################### # 择时股票池 # choice_symbols = ['603993', '601998', '601992', '601991', '601989', '601988', '601985', '601939', '601933', '601919', '601901', '601899', '601898', '601881', '601877', '601857', '601828', '601818', '601808', '601800', '601788', '601766', '601727', '601688', '601669', '601668', '601633', '601628', '601618', '601607', '601601', '601600', '601398', '601390', '601360', '601328', '601288', '601238', '601229', '601225', '601211', '601186', '601169', '601166', '601155', '601111', '601108', '601088', '601018', '601012', '601009', '601006', '600999', '600958', '600919', '600900', '600893', '600887', '600837', '600816', '600795', '600703', '600690', '600688', '600663', '600660', '600606', '600600', '600588', '600585', '600518', '600487', '600406', '600398', '600383', '600362', '600346', '600340', '600309', '600297', '600221', '600196', '600188', '600176', '600115', '600111', '600104', '600061', '600050', '600048', '600036', '600031', '600030', '600029', '600028', '600025', '600023', '600019', '600018', '600016', '600015', '600011', '600010', '600000', '300498', '300433', '300124', '300072', '300070', '300059', '300015', '300003', '002739', '002736', '002714', '002600', '002558', '002493', '002475', '002456', '002450', '002415', '002310', '002252', '002241', '002236', '002202', '002142', '002120', '002044', '002027', '002024', '002010', '001979', '001965', '000895', '000776', '000725', '000617', '000166', '000069', '000063', '000039', '000002', '000001'] # choice_symbols = ['601398'] choice_symbols = [ '601398', '601988', '601939', '601328', '601288', '600887', '600029', '000002' ] abu_result_tuple, _ = abu.run_loop_back(read_cash, buy_factors, sell_factors, stock_pickers, choice_symbols=choice_symbols, n_folds=4, commission_dict=commission_dict) # 把运行的结果保存在本地,以便之后分析回测使用,保存回测结果数据代码如下所示 abu.store_abu_result_tuple(abu_result_tuple, n_folds=4, store_type=abupy.EStoreAbu.E_STORE_CUSTOM_NAME, custom_name='tt_train_cn') abu.store_abu_result_tuple(abu_result_tuple, n_folds=4, store_type=abupy.EStoreAbu.E_STORE_CUSTOM_NAME, custom_name='tt_test_cn') # AbuMetricsBase.show_general(*abu_result_tuple, only_show_returns=True) metrics = AbuMetricsBase(*abu_result_tuple) metrics.fit_metrics() # 筛出有交易结果的 orders_pd_atr = abu_result_tuple.orders_pd[ abu_result_tuple.orders_pd.result != 0] orders_pd_atr.filter( ['buy_cnt', 'buy_pos', 'buy_price', 'profit', 'result']) metrics.plot_returns_cmp(only_info=True) # metrics.plot_buy_factors() # metrics.plot_sell_factors() metrics.plot_effect_mean_day() # plt.show() metrics.plot_keep_days() # plt.show() metrics.plot_max_draw_down()
def sample_a21(): """ A.2.1 数据模式的切换 :return: """ # 表A-1所示 print(ABuSymbolPd.make_kl_df('601398').tail()) # 局部使用enable_example_env_ipython,示例 abupy.env.enable_example_env_ipython() # 如果本地有相应股票的缓存,可以使用如下代码强制使用本地缓存数据 # abupy.env.g_data_fetch_mode = EMarketDataFetchMode.E_DATA_FETCH_FORCE_LOCAL # 设置初始资金数 read_cash = 1000000 # 择时股票池 choice_symbols = [ 'usNOAH', 'usSFUN', 'usBIDU', 'usAAPL', 'usGOOG', 'usTSLA', 'usWUBA', 'usVIPS' ] # 使用run_loop_back运行策略 abu_result_tuple, _ = abu.run_loop_back(read_cash, buy_factors, sell_factors, stock_pickers, choice_symbols=choice_symbols, n_folds=2) metrics = AbuMetricsBase(*abu_result_tuple) metrics.fit_metrics() metrics.plot_returns_cmp() # ***************************************************************************************************************** # 切换数据源 abupy.env.g_market_source = EMarketSourceType.E_MARKET_SOURCE_tx # 强制走网络数据源 abupy.env.g_data_fetch_mode = EMarketDataFetchMode.E_DATA_FETCH_FORCE_NET # 择时股票池 choice_symbols = [ '601398', '600028', '601857', '601318', '600036', '000002', '600050', '600030' ] # 使用run_loop_back运行策略 abu_result_tuple, _ = abu.run_loop_back(read_cash, buy_factors, sell_factors, stock_pickers, choice_symbols=choice_symbols, n_folds=2) metrics = AbuMetricsBase(*abu_result_tuple) metrics.fit_metrics() metrics.plot_returns_cmp()
def sample_94_2(from_cache=False): """ 9.4_2 使用切割训练集测试集模式,且生成交易特征,回测训练集交易数据, mac pro顶配大概下面跑了4个小时 :return: """ # 关闭沙盒数据环境 abupy.env.disable_example_env_ipython() from abupy import EMarketDataFetchMode # 因为sample_94_1下载了预先数据,使用缓存,设置E_DATA_FETCH_FORCE_LOCAL abupy.env.g_data_fetch_mode = EMarketDataFetchMode.E_DATA_FETCH_FORCE_LOCAL # 回测生成买入时刻特征 abupy.env.g_enable_ml_feature = True # 回测将symbols切割分为训练集数据和测试集数据 abupy.env.g_enable_train_test_split = True # 下面设置回测时切割训练集,测试集使用的切割比例参数,默认为10,即切割为10份,9份做为训练,1份做为测试, # 由于美股股票数量多,所以切割分为4份,3份做为训练集,1份做为测试集 abupy.env.g_split_tt_n_folds = 4 from abupy import EStoreAbu if from_cache: abu_result_tuple = \ abu.load_abu_result_tuple(n_folds=5, store_type=EStoreAbu.E_STORE_CUSTOM_NAME, custom_name='train_us') else: # 初始化资金200万,资金管理依然使用默认atr read_cash = 5000000 # 每笔交易的买入基数资金设置为万分之15 abupy.beta.atr.g_atr_pos_base = 0.0015 # 使用run_loop_back运行策略,因子使用和之前一样, # choice_symbols=None为全市场回测,5年历史数据回测 # 不同电脑运行速度差异大,mac pro顶配大概下面跑了4小时 # choice_symbols=None为全市场回测,5年历史数据回测 abu_result_tuple, _ = abu.run_loop_back(read_cash, buy_factors, sell_factors, stock_pickers, choice_symbols=None, start='2012-08-08', end='2017-08-08') # 把运行的结果保存在本地,以便之后分析回测使用,保存回测结果数据代码如下所示 abu.store_abu_result_tuple(abu_result_tuple, n_folds=5, store_type=EStoreAbu.E_STORE_CUSTOM_NAME, custom_name='train_us') print('abu_result_tuple.action_pd.deal.value_counts():\n', abu_result_tuple.action_pd.deal.value_counts()) metrics = AbuMetricsBase(*abu_result_tuple) metrics.fit_metrics() metrics.plot_returns_cmp(only_show_returns=True)
def sample_94_4(from_cache=False): """ 满仓乘数 9.4_4 《量化交易之路》中通过把初始资金扩大到非常大,但是每笔交易的买入基数却不增高,来使交易全部都成交, 再使用满仓乘数的示例,由于需要再次进行全市场回测,比较耗时。 下面直接示例通过AbuMetricsBase中的transform_to_full_rate_factor接口将之前的回测结果转换为使用大初始资金回测的结果 :return: """ metrics_test = sample_94_3(from_cache=True, show=False) from abupy import EStoreAbu if from_cache: test_us_fr = abu.load_abu_result_tuple( n_folds=5, store_type=EStoreAbu.E_STORE_CUSTOM_NAME, custom_name='test_us_full_rate') # 本地读取后使用AbuMetricsBase构造度量对象,参数enable_stocks_full_rate_factor=True, 即使用满仓乘数 test_frm = AbuMetricsBase(test_us_fr.orders_pd, test_us_fr.action_pd, test_us_fr.capital, test_us_fr.benchmark, enable_stocks_full_rate_factor=True) test_frm.fit_metrics() else: test_frm = metrics_test.transform_to_full_rate_factor(n_process_kl=4, show=False) # 转换后保存起来,下次直接读取,不用再转换了 from abupy import AbuResultTuple test_us_fr = AbuResultTuple(test_frm.orders_pd, test_frm.action_pd, test_frm.capital, test_frm.benchmark) abu.store_abu_result_tuple(test_us_fr, n_folds=5, store_type=EStoreAbu.E_STORE_CUSTOM_NAME, custom_name='test_us_full_rate') """ 使用test_frm进行度量结果可以看到所有交易都顺利成交了,策略买入成交比例:100.0000%,但资金利用率显然过低, 它导致基准收益曲线和策略收益曲线不在一个量级上,无法有效的进行对比 """ AbuMetricsBase.show_general(test_frm.orders_pd, test_frm.action_pd, test_frm.capital, test_frm.benchmark, only_show_returns=True) """转换出来的test_frm即是一个使用满仓乘数的度量对象,下面使用test_frm直接进行满仓度量即可""" print(type(test_frm)) test_frm.plot_returns_cmp(only_show_returns=True) # 如果不需要与基准进行对比,最简单的方式是使用plot_order_returns_cmp metrics_test.plot_order_returns_cmp()
def sample_a22(): # 设置初始资金数 read_cash = 5000000 abupy.env.g_enable_ump_main_deg_block = True abupy.env.g_enable_ump_main_jump_block = True abupy.env.g_enable_ump_main_price_block = True abupy.env.g_enable_ump_main_wave_block = True # 择时股票池 # choice_symbols = ['603993', '601998', '601992', '601991', '601989', '601988', '601985', '601939', '601933', '601919', '601901', '601899', '601898', '601881', '601877', '601857', '601828', '601818', '601808', '601800', '601788', '601766', '601727', '601688', '601669', '601668', '601633', '601628', '601618', '601607', '601601', '601600', '601398', '601390', '601360', '601328', '601288', '601238', '601229', '601225', '601211', '601186', '601169', '601166', '601155', '601111', '601108', '601088', '601018', '601012', '601009', '601006', '600999', '600958', '600919', '600900', '600893', '600887', '600837', '600816', '600795', '600703', '600690', '600688', '600663', '600660', '600606', '600600', '600588', '600585', '600518', '600487', '600406', '600398', '600383', '600362', '600346', '600340', '600309', '600297', '600221', '600196', '600188', '600176', '600115', '600111', '600104', '600061', '600050', '600048', '600036', '600031', '600030', '600029', '600028', '600025', '600023', '600019', '600018', '600016', '600015', '600011', '600010', '600000', '300498', '300433', '300124', '300072', '300070', '300059', '300015', '300003', '002739', '002736', '002714', '002600', '002558', '002493', '002475', '002456', '002450', '002415', '002310', '002252', '002241', '002236', '002202', '002142', '002120', '002044', '002027', '002024', '002010', '001979', '001965', '000895', '000776', '000725', '000617', '000166', '000069', '000063', '000039', '000002', '000001'] # choice_symbols = ['601398'] # choice_symbols = ['600036'] # choice_symbols = ['601398', '601988', '601939', '601328', '601288', '600887', '600029', '000002'] # choice_symbols = ['601398', '601988', '601939', '603993', '600999', '300059', '600900', '601328', '601288', # '600887', '600029', '000002', '600196', '002024', '002241', '600050', '601989', '601992', '601901'] # choice_symbols = ['601398', '601988', '601939', '603993', '600196', '600660', '600703', '600887', '600999', '300059', '600900', '601328', '601288', '600887', '600029', '000002'] choice_symbols = load_today_stock_list() print(choice_symbols) abu_result_tuple, _ = abu.run_loop_back(read_cash, buy_factors, sell_factors, stock_pickers, choice_symbols=choice_symbols, n_folds=1, commission_dict=commission_dict) # AbuMetricsBase.show_general(*abu_result_tuple, only_show_returns=True) metrics = AbuMetricsBase(*abu_result_tuple) metrics.fit_metrics() # 筛出有交易结果的 orders_pd_atr = abu_result_tuple.orders_pd[ abu_result_tuple.orders_pd.result != 0] orders_pd_atr.filter( ['buy_cnt', 'buy_pos', 'buy_price', 'profit', 'result']) # 保存交易结果 store_abu_result_out_put(abu_result_tuple) metrics.plot_returns_cmp(only_info=True) # metrics.plot_buy_factors() # metrics.plot_sell_factors() metrics.plot_effect_mean_day() # plt.show() metrics.plot_keep_days() # plt.show() metrics.plot_max_draw_down()
def sample_817(): """ 8.1.7 使用并行来提升择时运行效率 :return: """ # 要关闭沙盒数据环境,因为沙盒里就那几个股票的历史数据, 下面要随机做50个股票 from abupy import EMarketSourceType abupy.env.g_market_source = EMarketSourceType.E_MARKET_SOURCE_tx abupy.env.disable_example_env_ipython() # 关闭沙盒后,首先基准要从非沙盒环境换取,否则数据对不齐,无法正常运行 benchmark = AbuBenchmark() # 当传入choice_symbols为None时代表对整个市场的所有股票进行回测 # noinspection PyUnusedLocal choice_symbols = None # 顺序获取市场后300支股票 # noinspection PyUnusedLocal choice_symbols = ABuMarket.all_symbol()[-50:] # 随机获取300支股票 choice_symbols = ABuMarket.choice_symbols(50) capital = AbuCapital(1000000, benchmark) sell_factor1 = {'xd': 120, 'class': AbuFactorSellBreak} sell_factor2 = { 'stop_loss_n': 0.5, 'stop_win_n': 3.0, 'class': AbuFactorAtrNStop } sell_factor3 = {'class': AbuFactorPreAtrNStop, 'pre_atr_n': 1.0} sell_factor4 = {'class': AbuFactorCloseAtrNStop, 'close_atr_n': 1.5} sell_factors = [sell_factor1, sell_factor2, sell_factor3, sell_factor4] buy_factors = [{ 'xd': 60, 'class': AbuFactorBuyBreak }, { 'xd': 42, 'class': AbuFactorBuyBreak }] orders_pd, action_pd, _ = AbuPickTimeMaster.do_symbols_with_same_factors_process( choice_symbols, benchmark, buy_factors, sell_factors, capital) metrics = AbuMetricsBase(orders_pd, action_pd, capital, benchmark) metrics.fit_metrics() metrics.plot_returns_cmp(only_show_returns=True) abupy.env.enable_example_env_ipython()
def sample_94_3(from_cache=False, show=True): """ 9.4_3 使用切割好的测试数据集快,mac pro顶配大概下面跑了半个小时 :return: """ # 关闭沙盒数据环境 abupy.env.disable_example_env_ipython() from abupy import EMarketDataFetchMode # 因为sample_94_1下载了预先数据,使用缓存,设置E_DATA_FETCH_FORCE_LOCAL abupy.env.g_data_fetch_mode = EMarketDataFetchMode.E_DATA_FETCH_FORCE_LOCAL abupy.env.g_enable_train_test_split = False # 使用切割好的测试数据 abupy.env.g_enable_last_split_test = True # 回测生成买入时刻特征 abupy.env.g_enable_ml_feature = True from abupy import EStoreAbu if from_cache: abu_result_tuple_test = \ abu.load_abu_result_tuple(n_folds=5, store_type=EStoreAbu.E_STORE_CUSTOM_NAME, custom_name='test_us') else: read_cash = 5000000 abupy.beta.atr.g_atr_pos_base = 0.007 choice_symbols = None abu_result_tuple_test, kl_pd_manager_test = abu.run_loop_back( read_cash, buy_factors, sell_factors, stock_pickers, choice_symbols=choice_symbols, start='2012-08-08', end='2017-08-08') abu.store_abu_result_tuple(abu_result_tuple_test, n_folds=5, store_type=EStoreAbu.E_STORE_CUSTOM_NAME, custom_name='test_us') print('abu_result_tuple_test.action_pd.deal.value_counts():\n', abu_result_tuple_test.action_pd.deal.value_counts()) metrics = AbuMetricsBase(*abu_result_tuple_test) metrics.fit_metrics() if show: metrics.plot_returns_cmp(only_show_returns=True) return metrics
def sample_a21(): # 设置初始资金数 read_cash = 500000000 # 择时股票池 # choice_symbols = ['603993', '601998', '601992', '601991', '601989', '601988', '601985', '601939', '601933', '601919', '601901', '601899', '601898', '601881', '601877', '601857', '601828', '601818', '601808', '601800', '601788', '601766', '601727', '601688', '601669', '601668', '601633', '601628', '601618', '601607', '601601', '601600', '601398', '601390', '601360', '601328', '601288', '601238', '601229', '601225', '601211', '601186', '601169', '601166', '601155', '601111', '601108', '601088', '601018', '601012', '601009', '601006', '600999', '600958', '600919', '600900', '600893', '600887', '600837', '600816', '600795', '600703', '600690', '600688', '600663', '600660', '600606', '600600', '600588', '600585', '600518', '600487', '600406', '600398', '600383', '600362', '600346', '600340', '600309', '600297', '600221', '600196', '600188', '600176', '600115', '600111', '600104', '600061', '600050', '600048', '600036', '600031', '600030', '600029', '600028', '600025', '600023', '600019', '600018', '600016', '600015', '600011', '600010', '600000', '300498', '300433', '300124', '300072', '300070', '300059', '300015', '300003', '002739', '002736', '002714', '002600', '002558', '002493', '002475', '002456', '002450', '002415', '002310', '002252', '002241', '002236', '002202', '002142', '002120', '002044', '002027', '002024', '002010', '001979', '001965', '000895', '000776', '000725', '000617', '000166', '000069', '000063', '000039', '000002', '000001'] choice_symbols = ['601398'] # choice_symbols = ['600999'] choice_symbols = ['601398', '601988', '601939', '603993', '600999', '300059', '600900', '601328', '601288', '600887', '600029', '000002'] # choice_symbols = ['002285', '600109'] choice_symbols = None abu_result_tuple, _ = abu.run_loop_back(read_cash, buy_factors, sell_factors, stock_pickers, choice_symbols=choice_symbols, n_folds=15, commission_dict=commission_dict) print(abu_result_tuple.orders_pd) # AbuMetricsBase.show_general(*abu_result_tuple, only_show_returns=False) metrics = AbuMetricsBase(*abu_result_tuple) metrics.fit_metrics() # plot_simple = abu_result_tuple.orders_pd[abu_result_tuple.orders_pd.profit_cg < 0] # save=True保存在本地,耗时操作,需要运行几分钟 # ABuMarketDrawing.plot_candle_from_order(abu_result_tuple.orders_pd, save=False) # 筛出有交易结果的 orders_pd_atr = abu_result_tuple.orders_pd[abu_result_tuple.orders_pd.result != 0] orders_pd_atr.filter(['buy_cnt', 'buy_pos', 'buy_price', 'profit', 'result']) metrics.plot_returns_cmp() # kl_pd = ABuSymbolPd.make_kl_df('601398', n_folds=15) # plot_his_trade(abu_result_tuple.orders_pd, kl_pd) # 保存交易结果 store_abu_result_out_put(abu_result_tuple) metrics.plot_order_returns_cmp() # metrics.plot_buy_factors() metrics.plot_sell_factors() # metrics.show_general(*abu_result_tuple, only_show_returns=True) # metrics.plot_effect_mean_day() # plt.show() # metrics.plot_keep_days() # plt.show() metrics.plot_max_draw_down()
def sample_91(show=True): """ 9.1 度量的基本使用方法 :return: """ # 设置初始资金数 read_cash = 1000000 # 择时股票池 choice_symbols = ['usNOAH', 'usSFUN', 'usBIDU', 'usAAPL', 'usGOOG', 'usTSLA', 'usWUBA', 'usVIPS'] # 使用run_loop_back运行策略 abu_result_tuple, kl_pd_manager = abu.run_loop_back(read_cash, buy_factors, sell_factors, stock_pickers, choice_symbols=choice_symbols, n_folds=2) metrics = AbuMetricsBase(*abu_result_tuple) metrics.fit_metrics() if show: metrics.plot_returns_cmp() return metrics
def sample_817(): """ 8.1.7 使用并行来提升择时运行效率 :return: """ # 要关闭沙盒数据环境,因为沙盒里就那几个股票的历史数据, 下面要随机做50个股票 from abupy import EMarketSourceType abupy.env.g_market_source = EMarketSourceType.E_MARKET_SOURCE_tx abupy.env.disable_example_env_ipython() # 关闭沙盒后,首先基准要从非沙盒环境换取,否则数据对不齐,无法正常运行 benchmark = AbuBenchmark() # 当传入choice_symbols为None时代表对整个市场的所有股票进行回测 # noinspection PyUnusedLocal choice_symbols = None # 顺序获取市场后300支股票 # noinspection PyUnusedLocal choice_symbols = ABuMarket.all_symbol()[-50:] # 随机获取300支股票 choice_symbols = ABuMarket.choice_symbols(50) capital = AbuCapital(1000000, benchmark) sell_factor1 = {'xd': 120, 'class': AbuFactorSellBreak} sell_factor2 = {'stop_loss_n': 0.5, 'stop_win_n': 3.0, 'class': AbuFactorAtrNStop} sell_factor3 = {'class': AbuFactorPreAtrNStop, 'pre_atr_n': 1.0} sell_factor4 = {'class': AbuFactorCloseAtrNStop, 'close_atr_n': 1.5} sell_factors = [sell_factor1, sell_factor2, sell_factor3, sell_factor4] buy_factors = [{'xd': 60, 'class': AbuFactorBuyBreak}, {'xd': 42, 'class': AbuFactorBuyBreak}] orders_pd, action_pd, _ = AbuPickTimeMaster.do_symbols_with_same_factors_process( choice_symbols, benchmark, buy_factors, sell_factors, capital) metrics = AbuMetricsBase(orders_pd, action_pd, capital, benchmark) metrics.fit_metrics() metrics.plot_returns_cmp(only_show_returns=True) abupy.env.enable_example_env_ipython()
def sample_94_3(from_cache=False, show=True): """ 9.4_3 使用切割好的测试数据集快,mac pro顶配大概下面跑了半个小时 :return: """ # 关闭沙盒数据环境 abupy.env.disable_example_env_ipython() from abupy import EMarketDataFetchMode # 因为sample_94_1下载了预先数据,使用缓存,设置E_DATA_FETCH_FORCE_LOCAL abupy.env.g_data_fetch_mode = EMarketDataFetchMode.E_DATA_FETCH_FORCE_LOCAL abupy.env.g_enable_train_test_split = False # 使用切割好的测试数据 abupy.env.g_enable_last_split_test = True # 回测生成买入时刻特征 abupy.env.g_enable_ml_feature = True from abupy import EStoreAbu if from_cache: abu_result_tuple_test = \ abu.load_abu_result_tuple(n_folds=5, store_type=EStoreAbu.E_STORE_CUSTOM_NAME, custom_name='test_us') else: read_cash = 5000000 abupy.beta.atr.g_atr_pos_base = 0.007 choice_symbols = None abu_result_tuple_test, kl_pd_manager_test = abu.run_loop_back(read_cash, buy_factors, sell_factors, stock_pickers, choice_symbols=choice_symbols, start='2012-08-08', end='2017-08-08') abu.store_abu_result_tuple(abu_result_tuple_test, n_folds=5, store_type=EStoreAbu.E_STORE_CUSTOM_NAME, custom_name='test_us') print('abu_result_tuple_test.action_pd.deal.value_counts():\n', abu_result_tuple_test.action_pd.deal.value_counts()) metrics = AbuMetricsBase(*abu_result_tuple_test) metrics.fit_metrics() if show: metrics.plot_returns_cmp(only_show_returns=True) return metrics
def sample_94_4(from_cache=False): """ 满仓乘数 9.4_4 《量化交易之路》中通过把初始资金扩大到非常大,但是每笔交易的买入基数却不增高,来使交易全部都成交, 再使用满仓乘数的示例,由于需要再次进行全市场回测,比较耗时。 下面直接示例通过AbuMetricsBase中的transform_to_full_rate_factor接口将之前的回测结果转换为使用大初始资金回测的结果 :return: """ metrics_test = sample_94_3(from_cache=True, show=False) from abupy import EStoreAbu if from_cache: test_us_fr = abu.load_abu_result_tuple(n_folds=5, store_type=EStoreAbu.E_STORE_CUSTOM_NAME, custom_name='test_us_full_rate') # 本地读取后使用AbuMetricsBase构造度量对象,参数enable_stocks_full_rate_factor=True, 即使用满仓乘数 test_frm = AbuMetricsBase(test_us_fr.orders_pd, test_us_fr.action_pd, test_us_fr.capital, test_us_fr.benchmark, enable_stocks_full_rate_factor=True) test_frm.fit_metrics() else: test_frm = metrics_test.transform_to_full_rate_factor(n_process_kl=4, show=False) # 转换后保存起来,下次直接读取,不用再转换了 from abupy import AbuResultTuple test_us_fr = AbuResultTuple(test_frm.orders_pd, test_frm.action_pd, test_frm.capital, test_frm.benchmark) abu.store_abu_result_tuple(test_us_fr, n_folds=5, store_type=EStoreAbu.E_STORE_CUSTOM_NAME, custom_name='test_us_full_rate') """ 使用test_frm进行度量结果可以看到所有交易都顺利成交了,策略买入成交比例:100.0000%,但资金利用率显然过低, 它导致基准收益曲线和策略收益曲线不在一个量级上,无法有效的进行对比 """ AbuMetricsBase.show_general(test_frm.orders_pd, test_frm.action_pd, test_frm.capital, test_frm.benchmark, only_show_returns=True) """转换出来的test_frm即是一个使用满仓乘数的度量对象,下面使用test_frm直接进行满仓度量即可""" print(type(test_frm)) test_frm.plot_returns_cmp(only_show_returns=True) # 如果不需要与基准进行对比,最简单的方式是使用plot_order_returns_cmp metrics_test.plot_order_returns_cmp()
] # 使用run_loop_back运行策略 abu_result_tuple, kl_pd_manger = abu.run_loop_back( read_cash, buy_factors, sell_factors, stock_pickers, choice_symbols=choice_symbols, n_folds=2) ABuProgress.clear_output() help(abu.run_loop_back) from abupy import AbuMetricsBase metrics = AbuMetricsBase(*abu_result_tuple) metrics.fit_metrics() metrics.plot_returns_cmp() metrics.plot_sharp_volatility_cmp() metrics.plot_effect_mean_day() metrics.plot_keep_days() metrics.plot_sell_factors() metrics.plot_max_draw_down() from abupy import ABuScalerUtil class MetricsDemo(AbuMetricsBase): """扩展自定义度量类示例""" def _metrics_extend_stats(self): """ 子类可扩展的metrics方法,子类在此方法中可定义自己需要度量的值: 本demo示例交易手续费和策略收益之间的度量对比 """
orders_pd, action_pd, _ = ABuPickTimeExecute.do_symbols_with_same_factors( [ 'usTSLA', 'usNOAH', 'usSFUN', 'usBIDU', 'usAAPL', 'usGOOG', 'usWUBA', 'usVIPS' ], benchmark, buy_factors, sell_factors, capital, show=False) print(orders_pd[:10]) # 3) metric the profit from abupy import AbuMetricsBase metrics = AbuMetricsBase(orders_pd, action_pd, capital, benchmark) metrics.fit_metrics() metrics.plot_returns_cmp(only_show_returns=True) # 4) evaluate win_rate(为了计算胜率) win_rate = metrics.win_rate gains_mean = metrics.gains_mean losses_mean = -metrics.losses_mean # 5) add position control # n天向上突破买入策略(加入买入价格策略,加入仓位控制策略) buy_factors = [{ 'xd': 60, 'class': AbuFactorBuyBreak, 'slippage': AbuSlippageBuyMean, 'win_rate': win_rate, 'gains_mean': gains_mean, 'losses_mean': losses_mean, 'position': AbuKellyPosition }, {
def main(): ## 读股票 symbols = read_symbols() print("一共有多少个股票? %d" % len(symbols)) # 设置初始资金数 read_cash = 1000000 # 设置选股因子,None为不使用选股因子 stock_pickers = None # 买入因子依然延用向上突破因子 buy_factors = [{ 'xd': 60, 'class': AbuFactorBuyBreak }, { 'xd': 42, 'class': AbuFactorBuyBreak }] buy_factors = [{ 'xd': 42, 'class': AbuFactorBuyBreak, 'position': { 'class': AbuABinPosition } }] # 卖出因子继续使用上一节使用的因子 sell_factors = [{ 'stop_loss_n': 1.0, 'stop_win_n': 3.0, 'class': AbuFactorAtrNStop }, { 'class': AbuFactorPreAtrNStop, 'pre_atr_n': 1.5 }, { 'class': AbuFactorCloseAtrNStop, 'close_atr_n': 1.5 }] sell_factors = [{ 'stop_loss_n': 1.0, 'stop_win_n': 20.0, 'class': AbuFactorAtrNStop }] #sell_factors = [ ] # 择时股票池 # 使用run_loop_back运行策略 # 买入因子依然延用向上突破因子 buy_factors = [{ 'xd': 60, 'class': AbuSDBreak }, { 'xd': 42, 'class': AbuSDBreak }] buy_factors = [{ 'xd': 60, 'class': AbuFactorBuyBreak }, { 'xd': 42, 'class': AbuFactorBuyBreak }] # 卖出因子继续使用上一节使用的因子 sell_factors = [{ 'stop_loss_n': 1.0, 'stop_win_n': 3.0, 'class': AbuFactorAtrNStop }, { 'class': AbuFactorPreAtrNStop, 'pre_atr_n': 1.5 }, { 'class': AbuFactorCloseAtrNStop, 'close_atr_n': 1.5 }] choice_symbols = [ 'hk03333', 'hk00700', 'hk02333', 'hk01359', 'hk00656', 'hk03888', 'hk02318' ] choice_symbols = [ 'usNOAH', 'usSFUN', 'usBIDU', 'usAAPL', 'usGOOG', 'usTSLA', 'usWUBA', 'usVIPS' ] abupy.env.g_market_target = abupy.EMarketTargetType.E_MARKET_TARGET_HK abupy.env.g_market_target = abupy.EMarketTargetType.E_MARKET_TARGET_US abu_result_tuple, kl_pd_manger = abu.run_loop_back( read_cash, buy_factors, sell_factors, stock_pickers, choice_symbols=choice_symbols, n_folds=6) ABuProgress.clear_output() metrics = AbuMetricsBase(*abu_result_tuple) metrics.fit_metrics() metrics.plot_returns_cmp() pd.set_option('display.expand_frame_repr', False) pd.options.display.max_rows = 999