Python 金融交易实用指南(四)(2)https://developer.aliyun.com/article/1523803
三重指数平均线策略
三重指数平均线(TRIX)指标是围绕零线振荡的振荡器。正值表示市场超买,而负值表明市场超卖:
%matplotlib inline from zipline import run_algorithm from zipline.api import order_target_percent, symbol, set_commission from zipline.finance.commission import PerTrade import pandas as pd import pyfolio as pf from stockstats import StockDataFrame as sdf import warnings warnings.filterwarnings('ignore') def initialize(context): context.stock = symbol('MSFT') context.rolling_window = 20 set_commission(PerTrade(cost=5)) def handle_data(context, data): price_hist = data.history(context.stock, ["open","high", "low","close"], context.rolling_window, "1d") stock=sdf.retype(price_hist) trix = stock.get('trix') if trix[-1] > 0 and trix[-2] < 0: order_target_percent(context.stock, 0.0) elif trix[-1] < 0 and trix[-2] > 0: order_target_percent(context.stock, 1.0) def analyze(context, perf): returns, positions, transactions = \ pf.utils.extract_rets_pos_txn_from_zipline(perf) pf.create_returns_tear_sheet(returns, benchmark_rets = None) start_date = pd.to_datetime('2015-1-1', utc=True) end_date = pd.to_datetime('2018-1-1', utc=True) results = run_algorithm(start = start_date, end = end_date, initialize = initialize, analyze = analyze, handle_data = handle_data, capital_base = 10000, data_frequency = 'daily', bundle ='quandl')
输出如下:
图 9.49 – TRIX 策略;摘要收益和风险统计
高尾部比率和高于平均水平的稳定性表明,总体上是一种盈利策略。
以下是最差的五个回撤期图表:
图 9.50 – TRIX 策略;前五个最差回撤期
第二最差的回撤期长达一年。最差净回撤为 -15.57%。
以下是累积收益率图表:
图 9.51 – TRIX 策略;投资周期内的累积回报率
累积回报率图表表明我们在许多月份没有进行交易(水平线),并且存在长期正向趋势,高稳定性值证实了这一点。
以下是回报图表:
图 9.52 – TRIX 策略;投资周期内的回报
此图表表明我们进行交易时更可能获得正回报。
以下是滚动波动率图表:
图 9.53 – TRIX 策略;投资周期内的 6 个月滚动波动率
滚动波动率图表显示,随着时间的推移,滚动波动率逐渐减小,尽管最大波动率相当高。
以下是滚动夏普比率图表:
图 9.54 – TRIX 策略;投资周期内的 6 个月滚动夏普比率
滚动夏普比率更可能为正值而不是负值,其最大值在 3 左右,最小值略低于 -1。
以下是前五个回撤期图表:
图 9.55 – TRIX 策略;投资周期内前五个回撤期
前五个回撤期证实了最糟糕的回撤期很长。
以下是月度回报,年度回报和月度回报分布图表:
图 9.56 – TRIX 策略;月度回报、年度回报和月度回报分布
月度回报表格证实我们在许多月份没有进行交易。年度回报图表显示,最大回报发生在 2015 年。月度回报分布图表显示略微正偏态和较大的峰度。
对于某些股票,如苹果,TRIX 策略在给定的时间范围内表现非常糟糕。对于其他股票,如在前述报告中包括的微软,某些年份的表现非常出色。
威廉斯 R% 策略
此策略由 Larry Williams 开发,William R% 在 0 到 -100 之间波动。stockstats
库已实现了从 0 到 +100 的值。
-20 以上的值表示证券被超买,而-80 以下的值表示证券被超卖。
对于微软的股票来说,这个策略非常成功,但对苹果的股票来说不太成功:
%matplotlib inline from zipline import run_algorithm from zipline.api import order_target_percent, symbol, set_commission from zipline.finance.commission import PerTrade import pandas as pd import pyfolio as pf from stockstats import StockDataFrame as sdf import warnings warnings.filterwarnings('ignore') def initialize(context): context.stock = symbol('MSFT') context.rolling_window = 20 set_commission(PerTrade(cost=5)) def handle_data(context, data): price_hist = data.history(context.stock, ["open", "high", "low","close"], context.rolling_window, "1d") stock=sdf.retype(price_hist) wr = stock.get('wr_6') if wr[-1] < 10: order_target_percent(context.stock, 0.0) elif wr[-1] > 90: order_target_percent(context.stock, 1.0) def analyze(context, perf): returns, positions, transactions = \ pf.utils.extract_rets_pos_txn_from_zipline(perf) pf.create_returns_tear_sheet(returns, benchmark_rets = None) start_date = pd.to_datetime('2015-1-1', utc=True) end_date = pd.to_datetime('2018-1-1', utc=True) results = run_algorithm(start = start_date, end = end_date, initialize = initialize, analyze = analyze, handle_data = handle_data, capital_base = 10000, data_frequency = 'daily', bundle ='quandl')
输出如下:
图 9.57 – 威廉斯 R% 策略;摘要回报和风险统计
摘要统计显示出一个出色的策略 – 高稳定性证实了回报的一致性,具有很大的尾部比率,非常低的最大回撤和坚实的夏普比率。
以下是最差的五个回撤期的图表:
图 9.58 – 威廉斯 R% 策略;最差的五个回撤期
除了持续约 3 个月且净回撤为-10%的最糟糕的回撤期外,其他期间在持续时间和幅度上都不重要。
以下是累计回报图表:
图 9.59 – 威廉斯 R% 策略;投资期限内的累计回报率
该图表确认了策略的高稳定性价值 – 累计回报率以稳定的速度增长。
以下是回报图表:
图 9.60 – 威廉斯 R% 策略;投资期限内的回报率
回报图表表明,无论何时进行交易,盈利都比亏损多。
以下是滚动波动率图表:
图 9.61 – 威廉斯 R% 策略;投资期限内的 6 个月滚动波动率
滚动波动率图表显示,随着时间的推移,滚动波动率的值在减小。
以下是滚动夏普比率图表:
图 9.62 – 威廉斯 R% 策略;投资期限内的 6 个月滚动夏普比率
滚动夏普比率图表确认,夏普比率在交易期间始终为正值,最大值为 3.0。
以下是前五个回撤期的图表:
图 9.63 – 威廉斯 R% 策略;投资期限内的前五个回撤期
前 5 个回撤期图表显示,除了一个期间外,其他最糟糕的回撤期都不重要。
以下是月度回报、年度回报和月度回报分布图表:
图 9.64 – 威廉姆斯 R%策略;月回报、年回报以及投资期内月回报的分布
月回报表格表明,虽然我们并没有在每个月都交易,但每次交易时基本上都是盈利的。年回报图表证实了这一点。月回报的分布图表证实了一个具有大峰度的正偏斜。
威廉姆斯 R%策略是一种高性能策略,适用于微软股票,在给定的时间范围内夏普比率为 1.53,最大回撤仅为-10%。
学习均值回归策略
均值回归策略基于某些统计数据会回归到其长期均值的假设。
布林带策略
布林带策略基于识别短期波动期。
它依赖于三条线:
- 中间带线是简单移动平均线,通常是 20-50 天。
- 上轨是中间基准线的两个标准差以上。
- 下轨是中间基准线的两个标准差以下。
从布林带中创建交易信号的一种方法是定义超买和超卖的市场状态:
- 当金融资产的价格升破上轨时,市场处于超买状态,因此应该回调。
- 当金融资产的价格跌破下轨时,市场处于超卖状态,因此应该反弹。
这是一种均值回归策略,意味着长期来看,价格应该保持在下轨和上轨之间。对于低波动性股票来说,效果最佳。
%matplotlib inline from zipline import run_algorithm from zipline.api import order_target_percent, symbol, set_commission from zipline.finance.commission import PerTrade import pandas as pd import pyfolio as pf import warnings warnings.filterwarnings('ignore') def initialize(context): context.stock = symbol('DG') context.rolling_window = 20 set_commission(PerTrade(cost=5)) def handle_data(context, data): price_hist = data.history(context.stock, "close", context.rolling_window, "1d") middle_base_line = price_hist.mean() std_line = price_hist.std() lower_band = middle_base_line - 2 * std_line upper_band = middle_base_line + 2 * std_line if price_hist[-1] < lower_band: order_target_percent(context.stock, 1.0) elif price_hist[-1] > upper_band: order_target_percent(context.stock, 0.0) def analyze(context, perf): returns, positions, transactions = \ pf.utils.extract_rets_pos_txn_from_zipline(perf) pf.create_returns_tear_sheet(returns, benchmark_rets = None) start_date = pd.to_datetime('2000-1-1', utc=True) end_date = pd.to_datetime('2018-1-1', utc=True) results = run_algorithm(start = start_date, end = end_date, initialize = initialize, analyze = analyze, handle_data = handle_data, capital_base = 10000, data_frequency = 'daily', bundle ='quandl')
输出如下:
图 9.65 – 布林带策略;摘要回报和风险统计
摘要统计数据确实显示稳定性很好,尾部比率也很有利。然而,最大回撤是相当大的,为-27.3%。
以下是最差的五个回撤期图表:
图 9.66 – 布林带策略;最差的五个回撤期
最糟糕的回撤期持续时间相当长。也许我们应该调整入市/出市规则,以避免在这些时期进入交易。
以下是累积回报图表:
图 9.67 – 布林带策略;投资期内累积回报
累积回报图表显示我们已经有 10 年没有交易,然后我们经历了累积回报持续向上的一致趋势。
以下是回报图表:
图 9.68 – 布林带策略;投资视角下回报率
回报 图表显示正回报超过了负回报。
以下是 滚动波动率 图表:
图 9.69 – 布林带策略;投资视角下 6 个月滚动波动率
滚动波动率 图表表明该策略具有相当大的波动性。
以下是 滚动夏普比率 图表:
图 9.70 – 布林带策略;投资视角下 6 个月滚动夏普比率
滚动夏普比率 图表显示,滚动夏普比率波动范围很大,最大值接近 4,最小值低于 -2,但平均值为正。
以下是 前五次最大回撤期间 图表:
图 9.71 – 布林带策略;投资视角下前五次最大回撤期间
前五次最大回撤期间 图表证实回撤期间的持续时间相当长。
以下是 月度回报、年度回报 和 月度回报分布 图表:
图 9.72 – 布林带策略;投资视角下月度回报、年度回报和月度回报分布
月度回报 表明,由于我们的进出规则,从 2000 年到 2010 年没有进行任何交易。然而,年度回报 图表显示,每次交易发生时都是盈利的。月度回报分布 图表显示轻微的负偏态和巨大的峰态。
布林带策略是适用于波动较大的股票的策略。在这里,我们将其应用于Dollar General(DG)公司的股票。
对冲交易策略
这种策略在一段时间前变得非常流行,从那时起,就被过度使用,因此现在几乎没有盈利。
该策略涉及找到移动密切的股票对,或者高度协整的股票对。然后,同时为一只股票下达买入
订单,为另一只股票下达卖出
订单,假设它们之间的关系将恢复。在算法的实施方面,有各种各样的调整方法 - 价格是否是对数价格?只有关系非常紧密时我们才交易吗?
为了简单起见,我们选择了百事可乐(PEP)和可口可乐(KO)股票。另一个选择可以是花旗银行(C)和高盛(GS)。我们有两个条件:首先,协整的 p 值必须非常强大,然后 z 得分必须非常强大:
%matplotlib inline from zipline import run_algorithm from zipline.api import order_target_percent, symbol, set_commission from zipline.finance.commission import PerTrade import pandas as pd import pyfolio as pf import numpy as np import statsmodels.api as sm from statsmodels.tsa.stattools import coint import warnings warnings.filterwarnings('ignore') def initialize(context): context.stock_x = symbol('PEP') context.stock_y = symbol('KO') context.rolling_window = 500 set_commission(PerTrade(cost=5)) context.i = 0 def handle_data(context, data): context.i += 1 if context.i < context.rolling_window: return try: x_price = data.history(context.stock_x, "close", context.rolling_window,"1d") x = np.log(x_price) y_price = data.history(context.stock_y, "close", context.rolling_window,"1d") y = np.log(y_price) _, p_value, _ = coint(x, y) if p_value < .9: return slope, intercept = sm.OLS(y, sm.add_constant(x, prepend=True)).fit().params spread = y - (slope * x + intercept) zscore = (\ spread[-1] - spread.mean()) / spread.std() if -1 < zscore < 1: return side = np.copysign(0.5, zscore) order_target_percent(context.stock_y, -side * 100 / y_price[-1]) order_target_percent(context.stock_x, side * slope*100/x_price[-1]) except: pass def analyze(context, perf): returns, positions, transactions = \ pf.utils.extract_rets_pos_txn_from_zipline(perf) pf.create_returns_tear_sheet(returns, benchmark_rets = None) start_date = pd.to_datetime('2015-1-1', utc=True) end_date = pd.to_datetime('2018-01-01', utc=True) results = run_algorithm(start = start_date, end = end_date, initialize = initialize, analyze = analyze, handle_data = handle_data, capital_base = 10000, data_frequency = 'daily', bundle ='quandl')
输出如下:
图 9.73 – 对冲交易策略;摘要回报和风险统计
虽然夏普比率非常低,但最大回撤也非常低。稳定性为中等。
以下是最差的五个回撤期图:
图 9.74 – 对冲交易策略;最差的五个回撤期
最差的五个回撤期表格显示,最大回撤微不足道且非常短暂。
以下是累积回报图:
图 9.75 – 对冲交易策略;投资期间内的累积回报
累积回报图表明,我们已经没有交易了两年,然后在最后一个期间获利颇丰。
以下是回报图:
图 9.76 – 对冲交易策略;投资期间内的回报
回报图显示,除了最后一个期间外,交易期间的回报都是正的。
以下是滚动波动率图:
图 9.77 – 对冲交易策略;投资期间内 6 个月滚动波动率
滚动波动率图显示,虽然波动率的幅度不显著,但波动率仍在不断增加。
以下是滚动夏普比率图:
图 9.78 – 对冲交易策略;投资期间内 6 个月滚动夏普比率
滚动夏普比率图显示,如果我们改进我们的退出规则并提前退出,我们的夏普比率将高于 1。
以下是前 5 个回撤期图:
图 9.79 – 对冲交易策略;投资期间内前五个回撤期
前 5 个回撤期图告诉我们同样的故事 – 最后一个期间是为什么这次回测结果并不像它本来可能那样成功的原因。
以下是月度回报,年度回报和月度回报分布图:
图 9.80 – 成对交易策略;月收益、年收益和投资周期内月收益分布
月收益 表格证实我们直到 2017 年才开始交易。年收益 图表显示了 2017 年的交易是成功的,而月收益分布 图表显示了一个略微负偏斜的图表,具有小的峰度。
在过去的十年中,成对交易策略已经被过度使用,因此利润较少。识别成对的一种简单方法是寻找竞争对手 —— 在这个例子中,是百事可乐公司和可口可乐公司。
Python 金融交易实用指南(四)(4)https://developer.aliyun.com/article/1523805