作者: 阿布
阿布量化版权所有 未经允许 禁止转载
abu量化系统github地址 (欢迎+star)
量化交易的最大优势即为通过计算机强大的运算能力,在市场广度分析上占有绝对优势,通过历史规律的总结,在规律的基础上发现概率优势,形成良好投机优势,量化交易离不开技术分析,本节将主要示例一些常用的技术分析在abupy中的接口实现。
首先导入abupy本节使用模块:
In [1]:
# 基础库导入
from __future__ import print_function
from __future__ import division
import warnings
warnings.filterwarnings('ignore')
warnings.simplefilter('ignore')
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import os
import sys
# 使用insert 0即只使用github,避免交叉使用了pip安装的abupy,导致的版本不一致问题
sys.path.insert(0, os.path.abspath('../'))
import abupy
# 使用沙盒数据,目的是和书中一样的数据环境
abupy.env.enable_example_env_ipython()
In [2]:
from abupy import abu, ml, nd, tl, pd_resample, AbuML, AbuMLPd, AbuMetricsBase
from abupy import AbuFactorAtrNStop, AbuFactorPreAtrNStop, AbuFactorCloseAtrNStop, AbuFactorBuyBreak
from abupy import ABuSymbolPd, ABuScalerUtil, get_price, ABuMarketDrawing, ABuKLUtil
将abupy内置沙盒数据中美股,A股,港股市场中的symbol都列出来,稍后绘制这些symbol的阻力线,支持线:
In [3]:
us_choice_symbols = ['usTSLA', 'usNOAH', 'usSFUN', 'usBIDU', 'usAAPL', 'usGOOG', 'usWUBA', 'usVIPS']
cn_choice_symbols = ['002230', '300104', '300059', '601766', '600085', '600036', '600809', '000002', '002594', '002739']
hk_choice_symbols = ['hk03333', 'hk00700', 'hk02333', 'hk01359', 'hk00656', 'hk03888', 'hk02318']
In [4]:
def plot_trend(symbol='usTSLA', n_folds=1, only_last=False, how='both', show_step=False):
n_folds = int(n_folds)
# 获取symbol的n_folds年数据
kl = ABuSymbolPd.make_kl_df(symbol, n_folds=n_folds)
# 构造技术线对象
kl_tl = tl.AbuTLine(kl.close, 'kl')
if how == 'support':
# 只绘制支持线
kl_tl.show_support_trend(only_last=only_last, show=True, show_step=show_step)
elif how == 'resistance':
# 只绘制阻力线
kl_tl.show_resistance_trend(only_last=only_last, show=True, show_step=show_step)
else:
# 支持线和阻力线都绘制
kl_tl.show_support_resistance_trend(only_last=only_last, show=True, show_step=show_step)
plot_trend()
上面的函数绘制了tsla一年中的支撑线和阻力线,由于一年内会存在可能会存在多条阻力线,以及多条支撑线,有些支撑线也已经明显破位,比如上面浅蓝色那根早期的支撑线,还有黄色的早期阻力线,如果只想绘制最近的阻力线和支持线,可以使用only_last参数,如下所示,最近的阻力线红色,最近的支持线蓝色,可以发现两根线马上就要相交了:
In [5]:
plot_trend(only_last=True)
abupy中阻力线,支撑线基本绘制原理如下所示:
下面通过参数show_step为True将绘制阻力线,支撑线的中间分析步骤进行绘制,如下所示:
更多实现细节请阅读源代码AbuTLine以及ABuTLExecute
In [6]:
plot_trend(only_last=True, show_step=True)
下面尝试绘制其它symbol的趋势线,一个个参数换太麻烦了,使用ipywidgets进行交互,如下所示:
In [7]:
from ipywidgets import interact, Checkbox
symbol_range = us_choice_symbols + cn_choice_symbols + hk_choice_symbols
n_folds_range = ['1', '2', '3', '4', '5']
only_last_check = Checkbox(False)
show_step_check = Checkbox(False)
how_range = ['both', 'support', 'resistance']
_ = interact(plot_trend, symbol=symbol_range, n_folds=n_folds_range,
only_last=only_last_check, how=how_range, show_step=show_step_check)
通过阻力线,支撑线的确定,可以实现均值回复类型的择时策略,比如在支撑线位置买入股票,之后在阻力线位置卖出股票。
但是并不建议像上面这种简单实现,因为阻力线和支撑线的确定本身即存在很大分歧,即在本节初始说的,很难有两个人画出的线是完全一样的,即使是一个人不同的时候去画也会有精度的误差,使用程序去绘制的好处是规避感情,人去绘制很容易绘制出自己希望的走势,看上去好像还挺有道理。
建议的使用方式是类似阀值支持度的方式,比如在一个均值回复策略中:使用黄金分割线的0.382附近做为初始检测买入点,这时候可以同时度量一下现在是否同样处在支撑线附近,且离阻力线足够远,同时做为买入条件,也可以再并上其它条件,形成一个苛刻的买入策略,即买入条件为:
量化分析的最大长处即是通过计算机强大的运算能力,在广度上占有绝对优势,即如果是传统人脑的分析方式上述方法是行不通的,因为人的能力范围内所能涉及的交易目标数量有限,上述苛刻条件可能导致交易者很长时间无交易可做,但通过量化交易可以在短时间内完成对不同市场的不同交易目标分析,林子大了什么鸟都有,一定会有符合条件的买入目标。
在之后的章节会使用阻力线和支撑线编写一个完整的择时选股策略,,请关注公众号的更新提醒。
跳空缺口是指股价开盘价高于昨天的最高价或低于昨天的最低价,使K线图出现空档的现象。
本节只从使用的角度出发,示例abupy中的跳空统计分析接口的使用:
In [8]:
tsla_df = ABuSymbolPd.make_kl_df('usTSLA')
jumps = tl.jump.calc_jump(tsla_df)
缺口最大的意义在于存在很强的支撑或者阻力,你可以发现上述实现的缺口选取了很多点,那首先做做减法,选取那些阻力支撑最强的缺口,从代码来说就是jump_power最大的那些缺口。
可以使用tl.jump.calc_jump_line()获取jump_power大于阀值的缺口,如下所示以2.8为跳空能量筛选阀值:
In [9]:
jump_pd = tl.jump.calc_jump_line(tsla_df, power_threshold=2.8)
tl.jump.calc_jump_line_weight()函数与上面使用的calc_jump_line()函数区别是根据时间权重重新计算了jump_power,也就比如一年前有个jump_power=2的缺口,昨天也有个jump_power=2的缺口,根据时间线性加权的结果,一年前的jump_power要远远小于2可能只有0.8了,但是昨天的缺口jump_power还是2。
使用时间加权的一个原因是随着时间的流逝,越远的记忆越淡忘,不管你当时有多懊悔多伤悲,另一个原因是针对同一个市场一支股票的交易者可能已经交替更换,新的交易者没有之前或惋惜或懊悔的记忆,每7年我们就是一个全新的自己,所有细胞血液更新一遍完成。
下面的代码使用tl.jump.calc_jump_line_weight()函数即时间加权方式,对缺口行进行过滤:
In [10]:
# sw[0]代表非时间因素的jump_power,sw[1]代表时间加权因素的jump_power,当sw[0]=1时与非加权方式相同,具体实现请参考源代码
jump_pd = tl.jump.calc_jump_line_weight(tsla_df, sw=(0.5, 0.5))
得到跳空的缺口后,与上面所说的支撑线,阻力线的应用方式类似,可以直接做为策略触发点,也可以做为辅助判断条件使用。
In [11]:
# 设置初始资金数
read_cash = 1000000
# 买入因子依然延用向上突破因子
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}
]
abu_result_tuple, kl_pd_manger = abu.run_loop_back(read_cash,
buy_factors,
sell_factors,
choice_symbols=['usTSLA'])
order = abu_result_tuple.orders_pd.iloc[0]
绘制macd以及交易的买入卖出点位,如下所示:
In [12]:
nd.macd.plot_macd_from_order(order)
绘制boll以及交易的买入卖出点位,如下所示:
In [13]:
nd.boll.plot_boll_from_order(order)
绘制多条均线以及交易的买入卖出点位,如下所示:
In [14]:
nd.ma.plot_ma_from_order(order, time_period=[10, 20, 30, 60, 90, 120])
abupy中内置的技术分析接口还有一些暂时没有示例,在之后的章节会陆续进行示例,请关注公众号的更新提醒。
abu量化系统文档教程持续更新中,请关注公众号中的更新提醒。
更多关于量化交易相关请阅读《量化交易之路》
更多关于量化交易与机器学习相关请阅读《机器学习之路》)
更多关于abu量化系统请关注微信公众号: abu_quant