在之前的教程中,我们已经创建了一个用于比特币交易的自定义Python环境,并编写了强化学习智能体进行交易。我们还测试了三种不同的架构(全连接、卷积神经网络和长短期记忆网络),比较了它们的性能、训练时长和盈利能力。现在,我们将探索如何通过集成技术指标来提升交易机器人的准确性和盈利能力。
为什么需要技术指标?
几乎所有交易者或投资者在进行交易时都会进行一定程度的技术或基本面分析,而技术指标是其中最常用的工具之一。通过在数据集中加入技术指标,我们可以为预测模型提供更多相关信息,从而帮助智能体做出更明智的决策。
五大技术指标详解
我们将使用一个名为ta的Python库来计算以下五个广泛使用的技术指标:
- 移动平均线(MA)
- 布林带(Bollinger Bands)
- 抛物线转向指标(Parabolic SAR)
- 移动平均收敛发散指标(MACD)
- 相对强弱指数(RSI)
移动平均线(MA)
移动平均线是最基本的技术指标之一,用于确定市场趋势方向而不受短期市场波动的影响。它通过计算特定时间段内价格的平均值来显示趋势线方向。
import pandas as pd
from ta.trend import SMAIndicator
def AddIndicators(df):
# 添加简单移动平均线指标
df["sma7"] = SMAIndicator(close=df["Close"], window=7, fillna=True).sma_indicator()
df["sma25"] = SMAIndicator(close=df["Close"], window=25, fillna=True).sma_indicator()
df["sma99"] = SMAIndicator(close=df["Close"], window=99, fillna=True).sma_indicator()
return df移动平均线的长度决定了所使用的数据量。例如,200日移动平均线需要200天的历史数据。通过分析移动平均线,可以研究支撑和阻力水平,观察价格历史,从而预测可能的未来价格模式。
布林带(Bollinger Bands)
布林带是由一组趋势线组成的技术分析工具,由一条简单移动平均线和两条标准差线组成。它由著名技术分析师约翰·布林格开发,用于帮助识别市场条件(超买或超卖)。
from ta.volatility import BollingerBands
def AddIndicators(df):
# 添加布林带指标
indicator_bb = BollingerBands(close=df["Close"], window=20, window_dev=2)
df['bb_bbm'] = indicator_bb.bollinger_mavg()
df['bb_bbh'] = indicator_bb.bollinger_hband()
df['bb_bbl'] = indicator_bb.bollinger_lband()
return df许多交易者认为,价格越接近上轨,市场越超买;价格越接近下轨,市场越超卖。
抛物线转向指标(Parabolic SAR)
抛物线转向指标由J. Welles Wilder Junior开发,用于确定市场方向并在方向变化时发出信号。该指标在图表上显示为一系列位于蜡烛线上方或下方的点。
from ta.trend import PSARIndicator
def AddIndicators(df):
# 添加抛物线转向指标
indicator_psar = PSARIndicator(high=df["High"], low=df["Low"], close=df["Close"], step=0.02, max_step=2, fillna=True)
df['psar'] = indicator_psar.psar()
return df当点从蜡烛线上方翻转到下方时,可能表明市场趋势发生变化。蜡烛线下方的点被视为看涨信号,而上方的点表明空头控制市场。
移动平均收敛发散指标(MACD)
MACD是一个趋势跟踪动量指标,显示两个移动平均线之间的关系。默认计算方式是从12周期指数移动平均线减去26周期指数移动平均线。
from ta.trend import macd
def AddIndicators(df):
# 添加MACD指标
df["MACD"] = macd(close=df["Close"], window_slow=26, window_fast=12, fillna=True)
return dfMACD线与其信号线(9日EMA)的交叉产生交易信号。当MACD上穿信号线时产生买入信号,下穿时产生卖出信号。
相对强弱指数(RSI)
RSI是动量振荡器指标,测量最近价格变化的幅度以估计超买或超卖条件。RSI读数在0-100之间,超过70表示超买,低于30表示超卖。
from ta.momentum import rsi
def AddIndicators(df):
# 添加RSI指标
df["RSI"] = rsi(close=df["Close"], window=14, fillna=True)
return dfRSI由J. Welles Wilder Junior于1978年开发,是技术分析中最受欢迎的指标之一。
指标可视化与整合
为了同时可视化所有指标,我们创建了一个专门的绘图函数:
import matplotlib.pyplot as plt
from mplfinance.original_flavor import candlestick_ohlc
import matplotlib.dates as mpl_dates
def Plot_OHCL(df):
# 数据处理和可视化代码
# ...通过将所有指标整合到一个图表中,我们可以观察到指标与价格变化之间的相关性。👉 查看实时可视化工具可以帮助更好地理解这些关系。
将指标集成到强化学习智能体
现在我们需要修改智能体的状态表示,以包含这些技术指标。原先的状态大小为10个特征,现在增加到19个特征(10个市场特征+9个指标特征)。
我们需要在环境类中修改reset和_next_observation方法:
def reset(self):
# 初始化历史数据
for i in reversed(range(self.lookback_window_size)):
current_step = self.current_step - i
# 添加市场数据和订单数据
# ...
# 添加指标数据
self.indicators_history.append([
self.df.loc[current_step, 'sma7'] / self.normalize_value,
self.df.loc[current_step, 'sma25'] / self.normalize_value,
# ... 其他指标
])
state = np.concatenate((self.market_history, self.orders_history), axis=1) / self.normalize_value
state = np.concatenate((state, self.indicators_history), axis=1)
return state对于MACD和RSI指标,我们使用特定的归一化值(分别除以400和100),因为它们的数值范围与其他指标不同。
模型训练与测试结果
使用相同的密集网络架构和训练参数,我们在包含技术指标的数据集上训练了模型。训练完成后,在未见过的测试数据上进行评估,结果显示:
- 净值:1078.62美元(相比初始1000美元)
- 每 episode 订单数:135.95
- 无盈利 episodes:1
与之前没有使用技术指标的结果相比:
- 净值提高约2%
- 订单频率略有减少
- 亏损 episodes 从14个减少到1个
这些结果表明,技术指标的加入确实提高了交易机器人的性能,在完美条件下实现了近8%的利润。
常见问题
技术指标真的能提高交易机器人性能吗?
是的,我们的实验结果显示,加入技术指标后,交易机器人的净值提高了2%,亏损交易次数显著减少。这表明技术指标提供了有价值的市场信息,帮助智能体做出更好的决策。
需要多长时间来训练这样的交易机器人?
使用标准的硬件配置,训练大约需要16小时。训练时间取决于数据量、模型复杂性和硬件性能。对于更大规模的数据集,可能需要数天时间。
这些技术指标适用于其他加密货币吗?
虽然本文以比特币为例,但这些技术指标同样适用于其他加密货币甚至传统金融市场。不过,最佳参数设置可能因资产特性而异,需要进行相应的调整和测试。
如何选择技术指标的参数?
我们使用的是这些指标的默认参数,这些参数是行业标准值。在实际应用中,您可能需要根据特定市场条件调整这些参数。👉 获取进阶参数优化方法可以帮助进一步提升性能。
总结与展望
本教程展示了如何将五种流行技术指标集成到比特币交易机器人中,并通过实验证明了这种方法能够提高交易性能。虽然结果令人鼓舞,但仍有许多改进空间。
在未来的工作中,我们计划:
- 使用更大规模的历史数据进行训练
- 实现并行化训练以缩短训练时间
- 探索更多技术指标和它们的组合
- 测试在不同市场条件下的稳健性
技术分析指标为强化学习交易智能体提供了有价值的市场洞察,帮助它们做出更明智的交易决策。通过持续优化和改进,我们有望构建出更加智能和盈利的交易系统。
重要提示:本教程仅用于教育目的,不应作为交易建议。基于这些算法进行实际交易可能导致投资损失。