当前位置: 首页 > article >正文

量化交易系统开发-实时行情自动化交易-4.1.1.A股趋势跟踪交易策略实现

19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。

接下来继续说说A股趋势跟踪交易策略实现。

A 股市场的趋势跟踪交易策略是一种基于识别市场趋势并顺势而为的策略,旨在在市场上涨时买入,下跌时卖出。这种策略通常利用技术指标来识别趋势,如移动平均线(MA)、布林带(Bollinger Bands)、相对强弱指数(RSI)等。下面展示如何使用 Python 实现一个适用于 A 股的趋势跟踪交易策略,包括数据获取、技术指标计算、交易信号生成和回测等内容。

1. 导入必要的库
import pandas as pd
import numpy as np
import tushare as ts  # 用于获取A股数据
import matplotlib.pyplot as plt

为了获取 A 股数据,我们使用了tushare库,这个库是一个广泛使用的中国股市数据接口。此外,我们还使用了pandasnumpymatplotlib来处理数据和绘图。

2. 获取 A 股股票数据

使用 tushare 获取 A 股的历史数据。需要首先注册一个 Tushare API token。

# 设置 Tushare token 并初始化
ts.set_token('your_tushare_token')
pro = ts.pro_api()

# 获取 A 股的日线数据(以贵州茅台为例)
def get_a_stock_data(stock_code, start_date, end_date):
    df = pro.daily(ts_code=stock_code, start_date=start_date, end_date=end_date)
    df = df[['trade_date', 'open', 'high', 'low', 'close', 'vol']]
    df['trade_date'] = pd.to_datetime(df['trade_date'])
    df.set_index('trade_date', inplace=True)
    df = df.sort_index()
    return df

# 获取贵州茅台(600519.SH)的日线数据
stock_code = '600519.SH'
start_date = '20180101'
end_date = '20220101'
stock_data = get_a_stock_data(stock_code, start_date, end_date)

在上述代码中,我们使用 Tushare 获取了贵州茅台的历史日线数据,包括开盘价、最高价、最低价、收盘价和成交量,并进行了数据格式处理。

3. 计算技术指标
3.1 移动平均线(MA)

计算短期和长期的移动平均线,以帮助判断市场的趋势。

def calculate_moving_averages(data, short_window=20, long_window=60):
    data['short_ma'] = data['close'].rolling(window=short_window).mean()
    data['long_ma'] = data['close'].rolling(window=long_window).mean()
    return data

stock_data = calculate_moving_averages(stock_data)

在该函数中,我们计算了 20 日和 60 日的移动平均线。短期均线上穿长期均线被视为买入信号,反之则为卖出信号。

3.2 布林带(Bollinger Bands)

布林带可以用于判断价格的波动性,通过标准差的范围判断市场的超买和超卖情况。

def calculate_bollinger_bands(data, window=20, num_std_dev=2):
    data['middle_band'] = data['close'].rolling(window=window).mean()
    data['std_dev'] = data['close'].rolling(window=window).std()
    data['upper_band'] = data['middle_band'] + num_std_dev * data['std_dev']
    data['lower_band'] = data['middle_band'] - num_std_dev * data['std_dev']
    return data

stock_data = calculate_bollinger_bands(stock_data)

布林带由中轨(N日均线)、上轨和下轨组成。当价格突破上轨时,可能是卖出信号;当价格跌破下轨时,可能是买入信号。

3.3 相对强弱指数(RSI)

相对强弱指数(RSI)用于判断市场是否处于超买或超卖状态。

def calculate_rsi(data, window=14):
    delta = data['close'].diff()
    gain = (delta.where(delta > 0, 0)).rolling(window=window).mean()
    loss = (-delta.where(delta < 0, 0)).rolling(window=window).mean()
    rs = gain / loss
    data['RSI'] = 100 - (100 / (1 + rs))
    return data

stock_data = calculate_rsi(stock_data)

RSI 值在 70 以上通常被认为是超买区域,30 以下被认为是超卖区域。

4. 生成交易信号

基于上述技术指标,我们生成买入和卖出的信号。

def generate_trading_signals(data):
    data['signal'] = 0
    
    # 移动平均线交叉信号
    data.loc[data['short_ma'] > data['long_ma'], 'signal'] = 1  # 买入信号
    data.loc[data['short_ma'] < data['long_ma'], 'signal'] = -1  # 卖出信号
    
    # RSI 信号
    data.loc[data['RSI'] < 30, 'signal'] = 1  # RSI 超卖,买入信号
    data.loc[data['RSI'] > 70, 'signal'] = -1  # RSI 超买,卖出信号
    
    # 布林带信号
    data.loc[data['close'] < data['lower_band'], 'signal'] = 1  # 跌破下轨,买入信号
    data.loc[data['close'] > data['upper_band'], 'signal'] = -1  # 突破上轨,卖出信号
    
    return data

stock_data = generate_trading_signals(stock_data)

通过以上代码,我们将买卖信号结合起来生成一个最终的交易信号列。

5. 回测策略

为了验证策略的有效性,我们需要回测策略,评估其在历史数据中的表现。

def backtest_strategy(data, initial_balance=100000):
    balance = initial_balance
    position = 0
    portfolio_value = []

    for i in range(1, len(data)):
        # 买入信号且没有持仓时执行买入操作
        if data['signal'].iloc[i] == 1 and position == 0:
            position = balance / data['close'].iloc[i]
            balance = 0
        # 卖出信号且持仓时执行卖出操作
        elif data['signal'].iloc[i] == -1 and position > 0:
            balance = position * data['close'].iloc[i]
            position = 0

        # 计算当前的资产净值
        portfolio_value.append(balance + position * data['close'].iloc[i])
    
    # 将资产净值添加到 DataFrame 中
    data['portfolio_value'] = [initial_balance] + portfolio_value
    return data

# 执行回测
stock_data = backtest_strategy(stock_data)

# 绘制回测结果
plt.figure(figsize=(12, 6))
plt.plot(stock_data.index, stock_data['portfolio_value'], label='Portfolio Value')
plt.title(f'{stock_code} Trend Following Strategy Backtest')
plt.xlabel('Date')
plt.ylabel('Portfolio Value')
plt.legend()
plt.grid()
plt.show()

在此回测代码中,我们模拟了买入和卖出的操作,并计算了每个交易日的资产净值变化。通过绘制资产净值曲线,可以直观地看到策略的表现。

6. 结论

趋势跟踪策略是A股市场中常见的一种交易策略,它通过识别市场的长期趋势来获得收益。上述代码中,我们使用了移动平均线、布林带、RSI等技术指标,并结合 Tushare 获取的数据来设计一个完整的趋势跟踪交易策略。


http://www.kler.cn/a/393226.html

相关文章:

  • 申论1_概括、分析
  • 半导体企业如何利用 Jira 应对复杂商业变局?
  • 【OceanBase 诊断调优】—— ocp上针对OB租户CPU消耗计算逻辑
  • 「Py」Python基础篇 之 Python都可以做哪些自动化?
  • 如何在算家云搭建Peach-9B-8k-Roleplay(文本生成)
  • 十三、注解配置SpringMVC
  • 批量缓存模版
  • 基于yolov5的番茄成熟度检测系统,支持图像、视频和摄像实时检测【pytorch框架、python源码】
  • 【前端篇】Node.js 版本管理新选择:Volta,让版本切换更简单
  • OpenGL 进阶系列07 - 阴影贴图(shadowmap )
  • 【深度学习】使用硬件加速模型训练速度
  • Scala可变List
  • MySQL —— MySQL基础概念与常用功能介绍
  • VScode下脚本被禁止运行的原因及解决方案
  • python 怎么在模块和文件夹名称不一致的情况下,安装自己的模块
  • 物联网设备研究——分配推理负载的联合学习方法
  • Android Studio 中三方库依赖无法找到的解决方案
  • 算法和数据结构 目录
  • 使用 VS Code 远程连接时解决 OpenSSL 版本不匹配及权限问题
  • 接口返回的结构体里包含图片(做图片预览)
  • ubuntu内核更新导致的nvidia cuda驱动失效问题
  • 第十九章 TCP 客户端 服务器通信 - 数据包模式
  • 测试体系与测试方案设计
  • 320页PDF | 集团IT蓝图总体规划报告-德勤(限免下载)
  • 基于物联网的家庭自动化系统:使用网络映射器和MQTT协议
  • LuaJIT源码分析(六)语法分析