位置:编程技术网 > 区块链 > 正文 >

用Python在股票交易中实现布林带策略

2021年09月14日 20:58来源:网络搜索手机版

唐门高手在异世txt全集下载,es7,特警王成龙牺牲

 

%d

 Python中文社区(ID:python-china)

%d

布林带(BOLL)指标是美国股市分析家约翰·布林根据统计学中的标准差原理设计出来的一种非常简单实用的技术分析指标。一般而言,股价的运动总是围绕某一价值中枢(如均线、成本线等)在一定的范围内变动,布林线指标正是在上述条件的基础上,引进了“股价通道”的概念,其认为股价通道的宽窄随着股价波动幅度的大小而变化,而且股价通道又具有变异性,它会随着股价的变化而自动调整。

%d

我们可以根据它来开发许多不同的算法策略进行测试。下面,我们将介绍 4 种不同的交易策略,这些策略依赖于均值回归和趋势跟踪的波段。

%d布林带和均值回归%d

对于标准布林带设置,我们查看典型价格的 20 天移动平均线。如果典型价格遵循正态分布,则它有大约 5% 的机会将 2 个或更多标准差从均值移开。换句话说,我们有 1/20 的机会到达标准布林带的边缘。

%d

均值回归交易者看到这一点,并希望押注价格将在短期内回到 SMA(TP)。因此,如果我们触及上布林带 (UBB),我们就会做空,如果我们触及下布林带 (LBB),我们就会做多并持有,直到我们到达 SMA(TP)。

%d

下面我们将开始编写此策略并查看其执行情况。让我们导入一些基本的包。

%d

import numpy as np  import pandas as pd  import matplotlib.pyplot as plt  import yfinance as yf %d

接下来我将编写一个函数来计算我们的布林带。

%d

def calcBollingerBand(data, periods=20, m=2, label=None):    '''Calculates Bollinger Bands'''    keys = ['UBB', 'LBB', 'TP', 'STD', 'TP_SMA']    if label is None:      ubb, lbb, tp, std, tp_sma = keys    else:      ubb, lbb, tp, std, tp_sma = [i + '_' + label for i in keys]    data[tp] = data.apply(        lambda x: np.mean(x[['High', 'Low', 'Close']]), axis=1)    data[tp_sma] = data[tp].rolling(periods)    data[std] = data[tp].rolling(periods)    data[ubb] = data[tp_sma] + m * data[std]    data[lbb] = data[tp_sma] - m * data[std]    return data %d

这将从 YFinance 雅虎财经 获取我们需要的数据并计算所有必要的中间值,然后输出典型价格 (TP)、SMA(TP) (TP_SMA)、上布林带 (UBB) 和下布林带 (LBB)。除了我们的数据之外,它还需要我们在计算中使用的周期数(periods)和标准差数 (m)。我还添加了一个可选的标签参数,它将更新数据中的键,因为我们将研究的某些策略使用两组布林带,并且我们不希望在进行计算时覆盖这些值。

%d

接下来,我们将编写均值回归策略。

%d

def BBMeanReversion(data, periods=20, m=2, shorts=True):    '''    Buy/short when price moves outside of bands.    Exit position when price crosses SMA(TP).    '''    data = calcBollingerBand(data, periods)    # Get points where price crosses SMA(TP)    xs = (data['Close'] - data['TP_SMA']) / \      (data['Close'].shift(1) - data['TP_SMA'].shift(1))    data['position'] = np.nan    data['position'] = np.where(data['Close']<=data['LBB'], 1,                                 data['position'])    if shorts:      data['position'] = np.where(data['Close']>=data['UBB'], -1,                                   data['position'])    else:      data['position'] = np.where(data['Close']>=data['UBB'], 0,                                   data['position'])   # Exit when price crosses SMA(TP)    data['position'] = np.where(np.sign(xs)==-1, 0, data['position'])    data['position'] = data['position'].ffill()    return calcReturns(data) 

本文地址:http://www.reviewcode.cn/qukuailian/239456.html 转载请注明出处!

今日热点资讯