Python 金融量化 道路突破策略(唐奇安道路突破策略&布林带通道及其市场风险)

最后

Python崛起并且风靡,因为优点多、应用领域广、被大牛们认可。学习 Python 门槛很低,但它的晋级路线很多,通过它你能进入机器学习、数据挖掘、大数据,CS等更加高级的领域。Python可以做网络应用,可以做科学计算,数据分析,可以做网络爬虫,可以做机器学习、自然语言处理、可以写游戏、可以做桌面应用…Python可以做的很多,你需要学好基础,再选择明确的方向。这里给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

👉Python所有方向的学习路线👈

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

👉Python必备开发工具👈

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

👉Python全套学习视频👈

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

👉实战案例👈

学python就与学数学一样,是不能只看书不做题的,直接看步骤和答案会让人误以为自己全都掌握了,但是碰到生题的时候还是会一筹莫展。

因此在学习python的过程中一定要记得多动手写代码,教程只需要看一两遍即可。

👉大厂面试真题👈

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!


唐奇安通道突破的规则相对简单,但是要注意,时间跨度n的选择尤为重要。n的取值不同,结果也随之而变,寻找合适的时间跨度n是唐奇安通道突破策略的关键。

在20到60的时间跨度中寻找该股票唐奇安通道突破策略胜率最大 的时间跨度

list1 = []

list2 = []

for m in range(20,61):

upboundDC = pd.Series(0.0, index=Close.index)

downboundDC = pd.Series(0.0, index=Close.index)

midboundDC = pd.Series(0.0, index=Close.index)

求唐奇安上、下通道

for i in range(m,len(Close)):

upboundDC[i] = max(High[(i-m):i])

downboundDC[i] = min(Low[(i-m):i])

upboundDC = upboundDC[m:]

downboundDC = downboundDC[m:]

midboundDC = midboundDC[m:]

唐奇安通道突破策略

UpBreak = upbreak(Close[upboundDC.index[0]:], upboundDC)

DownBreak = downbreak(Close[downboundDC.index[0]:], downboundDC)

BreakSig = UpBreak - DownBreak

计算预测获胜率

tradeSig = BreakSig.shift(1)[‘2020’]

ret = Close / Close.shift(1) - 1 # 这里的Close依然是全时间序列的

tradeRet = (ret * tradeSig).dropna() # 一次乘法加dropna()之后,Close()多出的时间序列就被过滤掉了。

winRate = len(tradeRet[tradeRet > 0]) / len(tradeRet[tradeRet != 0])

list1.append(m)

list2.append(winRate)

print(‘该股票2020年唐奇安道路突破策略时间跨度为m为{}时胜率最大为{}’.format(list1[list2.index(max(list2))], max(list2)))

结果输出:

在这里插入图片描述

结果我们可以看出,在20-60的时间跨度内,2020年度选择50日日时间跨度是唐安奇通道突破策略胜率最大。


3.布林带通道

=============================================================================

3.1 布林带通道概述


  • “布林通道”又称“布林带状(Bollinger Bands, BBands)”,或者保力加通道,是通道的形式之一。与唐奇安通道类似,布林带通道也有刻画股票价格变化和波动幅度大小的作用。布林带通道是由美国投资者约翰·布林格(John Bollinger)在20世纪后期结合统计学理论发明的一种技术分析指标。

  • 在分析股价运动时,一般选取股价平均线作为参照线,而布林带在均线的基础上增添了上下两条“股价通道”线。布林带的中轨道线是股价的平均线,上通道为均线加上一定倍数的标准差,下通道则是均线减去一定倍数的标准差得到的。

  • 布林带通道的趋势主要由中轨道平均线决定,当平均线呈现上升趋势的时候,布林带通道也会向上走,当平均线走低时,布林带通道也会有向下的趋势。布林带通道的宽由股价的标准差决定;而股价的标准差刻画了股价波动的范围的大小,当股价的波动较大时,标准差较大,布林带通道带宽也越大;反之股价波动幅度较小的时候,标准差较小,布林带带宽会相应变窄。


3.2布林带通道计算方式


  • 布林带中轨道线: μn = 1 n ∑ i = 1 n p i \displaystyle {\frac{1}{n} }{\sum_{i=1}^n p_i } n1​i=1∑n​pi​

其中un是第t期观测到的前n期股票价格均值

  • 第t期观测到,股价在过去n期的标准差为

σn = 1 n ∑ i = 1 n ( p i − μ n ) 2 \displaystyle \sqrt{{\frac{1}{n}}{\sum_{i=1}^n \left(p_i-μ_n \right)^2}} n1​i=1∑n​(pi​−μn​)2 ​

  • 布林带上轨道线值   B u p _ n \displaystyle \ B_{up\_n}  Bup_n​:

B u p _ n \displaystyle \ B_{up\_n}  Bup_n​ = un + a × σn

  • 布林带下轨道线值   B d o w n _ n \displaystyle \ B_{down\_n}  Bdown_n​:

B d o w n _ n \displaystyle \ B_{down\_n}  Bdown_n​ = un - a × σn

  • a表示标准差的倍数。

  • 从上述公式可以看出,时间区间n和标准差倍数a的取值可以影响到布林带三条通道的计算结果。一般吧n取值为20天,a取值为2,依此设定暂有:

  • σ20 = 1 20 ∑ i = 1 n ( p i − μ 20 ) 2 \displaystyle \sqrt{{\frac{1}{20}}{\sum_{i=1}^n \left(p_i-μ_{20} \right)^2}} 201​i=1∑n​(pi​−μ20​)2 ​

  • B u p _ 20 \displaystyle \ B_{up\_20}  Bup_20​ = u20 + a × σ20

  • B d o w n _ 20 \displaystyle \ B_{down\_20}  Bdown_20​ = u20 - a × σ20


3.3 开始编码


定义布林带通道函数bbands()

def bbands(tsPrice, period=20, times=2):

upBBand = pd.Series(0.0, index=tsPrice.index)

midBBand = pd.Series(0.0, index=tsPrice.index)

downBBand = pd.Series(0.0, index=tsPrice.index)

sigma = pd.Series(0.0, index=tsPrice.index)

for i in range(period-1, len(tsPrice)):

midBBand[i] = np.nanmean(tsPrice[i-(period-1):(i+1)]) # nanmean忽略Nan计算均值

sigma[i] = np.nanstd(tsPrice[i-(period-1):(i+1)]) # nanstd忽略Nan计算标准差

upBBand[i] = midBBand[i] + times * sigma[i]

downBBand[i] = midBBand[i] - times * sigma[i]

BBands = pd.DataFrame({‘upBBand’:upBBand[(period-1):],\

‘midBBand’:midBBand[(period-1):],\

‘downBBand’:downBBand[(period-1):],\

‘sigma’:sigma[(period-1):]})

return(BBands)

计算20日布林带通道线

LymyBBands = bbands(Close, 20, 2)

提取数据

UpBBands = LymyBBands.upBBand[‘2020’]

DownBBands = LymyBBands.downBBand[‘2020’]

MidBBands = LymyBBands.midBBand[‘2020’]


3.4 布林带通道线及K线图绘制


s = mpf.make_mpf_style(base_mpf_style=‘nightclouds’, rc={‘font.family’: ‘SimHei’})

add_plot=[

mpf.make_addplot(UpBBands),

mpf.make_addplot(DownBBands),

mpf.make_addplot(MidBBands)]

mpf.plot(df[‘2020’], type=‘candle’, style=s, title=“洛阳钼业2020年K线图及布林带通道线”, addplot=add_plot, volume=True)

生成图像效果如下:

在这里插入图片描述

  • 价格接近或突破上轨道或下轨道表明市场处于明显上涨或下跌趋势。

  • 蜡烛图上下波动大的时候,布林带通道的带宽也相对较大。

  • 蜡烛图波动幅度小的时候,布林带通道的带宽也相对较小。

  • 整体而言,K线图大部分都在通道内部运行,K线图与布林带中轨道多次交叉,但价格基本上在布林带上下通道内部运动,布林带通道过滤掉了部分价格穿破均线的“虚假信号”。


3.5 布林带通道与市场风险


3.5.1 布林带通道的正态分布思想

布林带通道的设定蕴含着统计学原理,假设股票价格走势呈现正态分布,正态分布是关于均值呈对称分布的均值加减两倍标准差范围内的数据大概占据了整个数据的95.44%,布林带通道以价格的平均值加减两个标准差来设定上下通道。

从正态分布的角度来看,布林带通道刻画了股票价格的主要变化范围,即大部分时间股价都在布林带通道内运动,股价只有大约5%的概率会突破布林带通道的上轨道或者下轨道。因此在正常情况下,当价格线超出布林带通道的上轨道或者下轨道的时候,可以认为价格线有偏离,未来价格很可能回落到布林带通道内部。

在这里插入图片描述

  • 由于布林带通道的设定与标准差的倍数有关,布林带通道可以与股市风险联系起来一起分析市场行情。当以加减2倍标准差刻画时,股价有95.44%的概率在正负2倍标准差内部波动,异常波动的概率为4.56%。

  • 将股价波动到布林带通道外部的情况定义为布林带风险(Bollinger Risk)

  • 由统计学原理,在置信水平为α的条件下,布林带风险BRα 的计算公式为: BRα = d m d t × 100 \displaystyle \frac{d_m}{d_t}×100% dt​dm​​×100

其中 ,dt 表示观察的股价数据总期数,dm表示观察期内股价在布林带上下通道外部的总期数。一般而言,置信水平为α的取值可以为1%,5%或者10%。在不同置信水平下,布林带上下通道的界定不同。

α=10%时,   B u p _ n \displaystyle \ B_{up\_n}  Bup_n​ = un + 1.65 × σn,   B d o w n _ n \displaystyle \ B_{down\_n}  Bdown_n​ = un - 1.65 × σn

α=5%时,   B u p _ n \displaystyle \ B_{up\_n}  Bup_n​ = un + 1.96 × σn,   B d o w n _ n \displaystyle \ B_{down\_n}  Bdown_n​ = un - 1.96 × σn

α=1%时,   B u p _ n \displaystyle \ B_{up\_n}  Bup_n​ = un + 2.58 × σn,   B d o w n _ n \displaystyle \ B_{down\_n}  Bdown_n​ = un - 2.58 × σn


3.5.2 构造布林带风险函数

构建布林带风险函数

def CalBollRisk(tsPrice, multiplier):

k = len(multiplier)

overUp = []

belowDown = []

BollRisk = []

for i in range(k):

BBands=bbands(tsPrice, 20, multiplier[i])

a = 0

b = 0

for j in range(len(BBands)):

tsPrice=tsPrice[-(len(BBands)):]

if tsPrice[j] > BBands.upBBand[j]:

a += 1

elif tsPrice[j] < BBands.downBBand[j]:

b += 1

overUp.append(a)

belowDown.append(b)

BollRisk.append(100*(a+b)/len(tsPrice))

return(BollRisk)

设定不同的置信水平,来比较洛阳钼业股价在不同年份的布林带风险

multiplier = [1, 1.65, 1.96, 2, 2.58]

  • 下边计算不同年份的布林带风险

2016

price2016 = Close[‘2016’]

BBandRisk2016 = CalBollRisk(price2016,multiplier)

print(BBandRisk2016)

结果如下:

在这里插入图片描述

#2017

price2017 = Close[‘2017’]

BBandRisk2017 = CalBollRisk(price2017,multiplier)

print(BBandRisk2017)

结果如下:

在这里插入图片描述

#2018

price2018 = Close[‘2018’]

BBandRisk2018 = CalBollRisk(price2018,multiplier)

print(BBandRisk2018)

结果如下:

在这里插入图片描述

#2019

price2019 = Close[‘2019’]

BBandRisk2019 = CalBollRisk(price2019,multiplier)

print(BBandRisk2019)

结果如下:

在这里插入图片描述

#2020

price2020 = Close[‘2020’]

BBandRisk2020 = CalBollRisk(price2020,multiplier)

print(BBandRisk2020)

结果如下:

在这里插入图片描述

由以上数据可知,置信水平α越大,对应的布林带通道越窄,布林带突破上下界的机会也就越大,因此呈现出的布林带风险也就越大。


4. 道路突破交易策略制定

====================================================================================

4.1 一般布林带上下通道突破策略


布林带通道最常见的策略就是根据价格线突破布林带通道上下界来制定交易策略。

  • 当股价向上突破布林带上通道的时候,股票可能产生了异常上涨,未来股价会跌落到布林带通道内部,此时宜看空。

  • 当股价向下突破布林带下通道时,股票可能产生了异常跌势,未来股价会上升到布林带通道内部,此时宜做多。

布林带上下通道突破策略

BBands = bbands(Close[‘2020’], 20, 2)

upbreakBB1 = upbreak(Close, BBands.upBBand)

downbreakBB1 = downbreak(Close, BBands.downBBand)

信号出现两天后进行交易

upBBSig1 = upbreakBB1.shift(2)

downBBSig1 = downbreakBB1.shift(2)

tradSignal1 = upBBSig1 + downBBSig1

tradSignal1[tradSignal1 == -0] = 0

  • 构造交易评价函数

def perform(tsPrice, tsTradSig):

ret = tsPrice/tsPrice.shift(1) - 1

tradRet = (ret * tsTradSig).dropna()

ret = ret[-len(tradRet):]

winRate = [len(ret[ret > 0]) / len(ret[ret != 0]), len(tradRet[tradRet > 0]) / len(tradRet[tradRet != 0])]

meanWin = [np.mean(ret[ret > 0]), np.mean(tradRet[tradRet > 0])]

meanLoss = [np.mean(ret[ret < 0]), np.mean(tradRet[tradRet < 0])]

Performance = pd.DataFrame({‘WinRate’: winRate, ‘meanWin’: meanWin, ‘meanLoss’: meanLoss})

Performance.index = [‘Stock’, ‘Trade’]

return Performance

#计算平均损失、平均获胜率以及交易获胜率

Performance1 = perform(Close[‘2020’], tradSignal1)

print(Performance1)

输出结果:

在这里插入图片描述


4.2 特殊布林带通道突破策略


布林带通道的上下轨道线的刻画,由选取的时间周期和标准差倍数两部分决定。如果布林带通道线设定不合理,股票价格向上穿过布林带上通道先以后,中短期内一直出于上升趋势,且不会回落到通道线内部,或者股价跌破布林带下通道线以后,可能会比较晚地回升到下通道线上方。为了降低“回落到通道内部”这个期望落空的风险,可以改变布林带通道突破交易策略。交易规则如下:

  • 当价格线由布林带上通道线的上方穿到布林带通道内部的时候,说明股价从异常上升行期要恢复到正常波动行期,股票短期有下跌趋势,此时做空。

  • 当价格线由布林带下通道的下方穿到布林带通道内部时,说明股价从异常下跌行期要恢复到正常波动行期,股票短期有上升趋势,此时做多。

交易代码如下

另一种布林带通道突破策略

价格向上穿下通道,做多

价格向下穿上通道,看空

upbreakBB2 = upbreak(Close[‘2020’], BBands.downBBand)

downbreakBB2 = downbreak(Close[‘2020’], BBands.upBBand)

交易执行

upBBSig2 = upbreakBB2.shift(2)

downBBSig2 = - downbreakBB2.shift(2)

trdaSignal2 = upBBSig2 + downBBSig2

交易策略实现

Performance2 = perform(Close[‘2020’], trdaSignal2)

print(Performance2)

最后

🍅 硬核资料:关注即可领取PPT模板、简历模板、行业经典书籍PDF。
🍅 技术互助:技术群大佬指点迷津,你的问题可能不是问题,求资源在群里喊一声。
🍅 面试题库:由技术群里的小伙伴们共同投稿,热乎的大厂面试真题,持续更新中。
🍅 知识体系:含编程语言、算法、大数据生态圈组件(Mysql、Hive、Spark、Flink)、数据仓库、Python、前端等等。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 20
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
唐奇安通道布林通道都是常用的技术分析指标,用于判断股票价格的趋势和波动情况。下面是对唐奇安通道布林通道的介绍和Python代码实现: 1. 唐奇安通道 唐奇安通道是由三条轨道线构成的,分别是通道上界、通道下界和中轨道。其中,通道上界等于过去20日内的最高价,通道下界等于过去20日内的最低价,中轨道等于通道上界和通道下界的平均值。唐奇安通道突破是指股票价格突破通道上界或通道下界,这通常被视为一个买入或卖出信号。 2. 布林通道 布林通道也是由三条轨道线构成的,分别是通道上界、通道下界和中轨道。其中,通道上界等于中轨道加上两倍的标准差,通道下界等于中轨道减去两倍的标准差,中轨道等于股票价格的移动平均线。布林通道突破是指股票价格突破通道上界或通道下界,这通常被视为一个买入或卖出信号。 下面是Python代码实现唐奇安通道布林通道: ```python import pandas as pd import numpy as np import matplotlib.pyplot as plt # 计算唐奇安通道 def donchian_channel(high, low, window=20): channel_up = high.rolling(window=window).max() channel_down = low.rolling(window=window).min() channel_mid = (channel_up + channel_down) / 2 return channel_up, channel_down, channel_mid # 计算布林通道 def bollinger_band(close, window=20, k=2): std = close.rolling(window=window).std() band_up = close.rolling(window=window).mean() + k * std band_down = close.rolling(window=window).mean() - k * std band_mid = close.rolling(window=window).mean() return band_up, band_down, band_mid # 读取股票数据 df = pd.read_csv('stock.csv', index_col='date', parse_dates=True) # 计算唐奇安通道布林通道 channel_up, channel_down, channel_mid = donchian_channel(df['high'], df['low']) band_up, band_down, band_mid = bollinger_band(df['close']) # 绘制K线图和唐奇安通道布林通道 fig, ax = plt.subplots(figsize=(16, 8)) ax.set_title('Stock Price') ax.set_ylabel('Price') ax.grid(True) candlestick_ohlc(ax, zip(mdates.date2num(df.index.to_pydatetime()), df['open'], df['high'], df['low'], df['close']), width=0.6, colorup='red', colordown='green') ax.plot(df.index, channel_up, label='Donchian Channel Up', color='blue') ax.plot(df.index, channel_down, label='Donchian Channel Down', color='blue') ax.plot(df.index, band_up, label='Bollinger Band Up', color='orange') ax.plot(df.index, band_down, label='Bollinger Band Down', color='orange') ax.legend(loc='upper left') plt.show() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值