
等级: 新手上路
- 注册:
- 2024-12-9
- 曾用名:
|
import pandas as pd
import numpy as np
def bollinger_bands_strategy(data, window=20, std_dev=2):
# 计算布林带
data['MA20'] = data['Close'].rolling(window=window).mean()
data['Std'] = data['Close'].rolling(window=window).std()
data['Upper'] = data['MA20'] + std_dev * data['Std']
data['Lower'] = data['MA20'] - std_dev * data['Std']
# 计算开口宽度(带宽)
data['Bandwidth'] = (data['Upper'] - data['Lower']) / data['MA20']
# 生成信号
data['Signal'] = 0 # 0:无信号, 1:做多, -1:做空
# 开口扩大条件(带宽连续3日上升)
bandwidth_increasing = data['Bandwidth'].diff() > 0
data['Bandwidth_Up'] = bandwidth_increasing.rolling(3).sum() == 3
# 开口缩小条件(带宽连续2日下降)
bandwidth_decreasing = data['Bandwidth'].diff() < 0
data['Bandwidth_Down'] = bandwidth_decreasing.rolling(2).sum() == 2
# 做多信号:开口扩大 + 收盘价突破上轨 + 成交量放大
data.loc[
(data['Bandwidth_Up']) &
(data['Close'] > data['Upper']) &
(data['Volume'] > data['Volume'].rolling(5).mean()),
'Signal'
] = 1
# 做空信号:开口扩大 + 收盘价跌破下轨 + 成交量放大
data.loc[
(data['Bandwidth_Up']) &
(data['Close'] < data['Lower']) &
(data['Volume'] > data['Volume'].rolling(5).mean()),
'Signal'
] = -1
# 平仓信号:开口缩小
data.loc[data['Bandwidth_Down'], 'Signal'] = 0
return data
# 示例调用
data = pd.read_csv('futures_data.csv') # 输入OHLCV数据
result = bollinger_bands_strategy(data)
print(result[['Date', 'Close', 'Upper', 'Lower', 'Bandwidth', 'Signal']])
补充内容 (2025-3-25 12:38):
开口扩大(波动率上升) 开口缩小(波动率下降)
↗ ↘
价格突破上轨 → 做多信号 → 持有 → 平仓
价格突破下轨 → 做空信号 → 持有 → 平仓 |
|