布林线 | 逆势策略

  下图显示了 EURUSD 货币对的小时图,具有以下指标:
  布林带 (20,2);和
  相对强弱指数 (14)。
  
  上图中的货币对大部分处于区间震荡状态。看看布林带如何很好地定义支撑位和阻力位?
  这绝不是精确的,但上带和下带确实倾向于反映方向反转的位置。认识到这不是一门精确的科学是理解布林带及其在逆势外汇交易中的应用的另一个关键方面。
  当市场接近其中一个波段时,我们很有可能会在此后不久的某个时候看到方向逆转。然而,反趋势交易者必须非常小心,进行适当的风险管理是实现这一目标的好方法。请记住,在任何区间波动的市场中,价格最终都会突破。这是关键点 -如果有任何适当突破的迹象,您需要迅速关闭亏损头寸。
  在上图中,添加了 RSI 作为过滤器,以尝试提高此布林带策略生成的信号的有效性。这将减少整体交易的数量,但有望增加赢家的比例。
  使用此过滤器,您应该在价格突破上限时卖出,但前提是 RSI 高于 70(即表明市场超买)。您在价格跌破下限时买入,但前提是 RSI 低于 30(即表明市场超卖)。
  CCI 或随机震荡指标也可用于创建与上述类似的布林带交易策略。一般来说,最好使用像这样的辅助指标,而不仅仅是布林带,以确认主要指标在说什么,因此有助于确保交易信号更可靠。

 

### 布林线量化交易策略实现方法 #### 1. 数据准备 为了构建基于布林线的量化交易模型,首先需要获取目标股票的历史数据。这包括开盘价、收盘价、最高价、最低价以及成交量等基本信息。 ```python import pandas as pd from datetime import date import yfinance as yf def get_stock_data(ticker, start_date, end_date): stock_data = yf.download( tickers=ticker, start=start_date, end=end_date, interval="1d" ) return stock_data[['Open', 'High', 'Low', 'Close', 'Volume']] ``` #### 2. 计算布林带参数 根据给定的时间窗口长度(通常是20天),计算移动平均线和上下轨线。这些数值构成了布林带的核心组成部分[^1]。 ```python def calculate_bollinger_bands(dataframe, window=20, num_std_dev=2): dataframe['MA'] = dataframe['Close'].rolling(window).mean() dataframe['STD'] = dataframe['Close'].rolling(window).std(ddof=0) dataframe['Upper Band'] = dataframe['MA'] + (dataframe['STD'] * num_std_dev) dataframe['Lower Band'] = dataframe['MA'] - (dataframe['STD'] * num_std_dev) return dataframe.dropna() ``` #### 3. 制定买卖规则 当股价突破上轨时视为卖出信号;反之,跌破下轨则发出买入信号。这种做法假设价格会在一定时间内回到布林带内部,体现了均值回归的思想[^2]。 ```python def generate_signals(df): buy_signal = [] sell_signal = [] for i in range(len(df)): if df['Close'][i] > df['Upper Band'][i]: sell_signal.append(df['Close'][i]) buy_signal.append(float('nan')) elif df['Close'][i] < df['Lower Band'][i]: buy_signal.append(df['Close'][i]) sell_signal.append(float('nan')) else: buy_signal.append(float('nan')) sell_signal.append(float('nan')) df['Buy Signal Price'] = buy_signal df['Sell Signal Price'] = sell_signal return df ``` #### 4. 执行回测并评估绩效 通过模拟历史上的交易行为来测试所设计策略的有效性,并据此调整优化各项参数设置。 ```python initial_capital = 100000 position_size = initial_capital / data.iloc[0]['Close'] portfolio_value = [initial_capital] for index, row in data.iterrows(): current_position_value = position_size * row['Close'] portfolio_value.append(current_position_value) returns = pd.Series(portfolio_value).pct_change().dropna() print(f'Annualized Return: {((1 + returns.mean()) ** 252) - 1:.2%}') print(f'Sharpe Ratio: {(returns.mean() / returns.std()) * (252 ** 0.5):.2f}') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值