量化交易系统开发-实时行情自动化交易-8.25.真格(澎博财经旗下)平台

news2024/12/14 16:31:48

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

接下来会对于真格(澎博财经旗下)平台介绍。

真格平台是澎博财经旗下的一款量化交易工具,专注于提供高效的数据接口、量化策略开发环境和回测框架。通过真格平台,用户可以方便地构建、测试和优化量化交易策略,同时利用其专业化工具高效地管理交易流程。

以下以“布林带策略”为例,展示如何使用真格平台进行量化交易开发和回测。


1. 策略背景:布林带策略

策略逻辑

布林带是一种经典的技术指标,通过价格与波动率之间的关系生成交易信号。布林带由以下三部分构成:

  • 上轨线:均线 + K倍标准差
  • 中轨线:简单移动平均线
  • 下轨线:均线 - K倍标准差

布林带策略逻辑如下:

  • 买入信号:价格触及下轨并开始反弹。
  • 卖出信号:价格触及上轨并开始回落。
适用场景
  • 优势:适用于震荡市场,能够捕捉价格的区间波动。
  • 局限:在强趋势行情中,可能错过趋势性机会。

2. 策略开发

以下代码基于真格平台Python SDK实现布林带策略的开发与回测。

(1)准备工作

在使用真格平台之前,需要完成以下准备:

  1. 安装SDK:通过真格平台提供的安装包或pip安装其Python SDK。
    pip install zhenge-sdk
    
  2. 申请开发者账号:获取API密钥以访问平台数据接口。
  3. 设置交易环境:确认回测所需的账户、品种和时间段。
(2)初始化参数与环境
import pandas as pd
import numpy as np
from zhenge import ZhengeAPI, Backtest

# 策略参数
SYMBOL = '600519.SH'  # 茅台股票
START_DATE = '2020-01-01'
END_DATE = '2022-01-01'
INITIAL_CAPITAL = 100000  # 初始资金
BOLL_PERIOD = 20  # 布林带周期
BOLL_K = 2  # 布林带倍数
(3)获取历史数据

通过真格平台的API获取标的历史行情数据。

# 获取历史数据
def get_data(symbol, start_date, end_date):
    api = ZhengeAPI(api_key='your_api_key')
    df = api.get_kline(symbol=symbol, start_date=start_date, end_date=end_date, freq='1d')
    df['Date'] = pd.to_datetime(df['date'])
    df.set_index('Date', inplace=True)
    return df[['close']]

# 加载数据
data = get_data(SYMBOL, START_DATE, END_DATE)
(4)计算布林带

利用Pandas计算布林带的上轨、中轨和下轨。

# 计算布林带
data['Middle'] = data['close'].rolling(BOLL_PERIOD).mean()
data['StdDev'] = data['close'].rolling(BOLL_PERIOD).std()
data['Upper'] = data['Middle'] + BOLL_K * data['StdDev']
data['Lower'] = data['Middle'] - BOLL_K * data['StdDev']
(5)生成交易信号

根据布林带策略逻辑生成交易信号。

# 生成交易信号
data['Signal'] = 0
data.loc[data['close'] < data['Lower'], 'Signal'] = 1  # 买入信号
data.loc[data['close'] > data['Upper'], 'Signal'] = -1  # 卖出信号
(6)回测逻辑

通过信号生成持仓和资金变化。

# 初始化回测变量
data['Position'] = 0  # 持仓
data['Cash'] = INITIAL_CAPITAL  # 初始现金
data['Portfolio'] = INITIAL_CAPITAL  # 总资产

holdings = 0  # 当前持仓数量
entry_price = 0  # 买入价格

# 回测主循环
for i in range(1, len(data)):
    current_signal = data.iloc[i]['Signal']
    current_price = data.iloc[i]['close']

    # 买入逻辑
    if current_signal == 1 and holdings == 0:
        holdings = data.iloc[i - 1]['Cash'] // current_price
        data.at[data.index[i], 'Cash'] = data.iloc[i - 1]['Cash'] - holdings * current_price
        data.at[data.index[i], 'Position'] = holdings
        entry_price = current_price  # 记录买入价格

    # 卖出逻辑
    elif current_signal == -1 and holdings > 0:
        data.at[data.index[i], 'Cash'] = data.iloc[i - 1]['Cash'] + holdings * current_price
        holdings = 0
        data.at[data.index[i], 'Position'] = holdings

    # 更新总资产
    current_holdings = holdings * current_price
    data.at[data.index[i], 'Portfolio'] = data.iloc[i]['Cash'] + current_holdings

3. 策略优化

(1)参数优化

通过调整布林带周期和倍数,优化策略参数。

best_params = None
best_return = -float('inf')

for period in range(10, 31):
    for k in np.arange(1.5, 3.0, 0.1):
        # 计算布林带
        data['Middle'] = data['close'].rolling(period).mean()
        data['StdDev'] = data['close'].rolling(period).std()
        data['Upper'] = data['Middle'] + k * data['StdDev']
        data['Lower'] = data['Middle'] - k * data['StdDev']

        # 生成信号
        data['Signal'] = 0
        data.loc[data['close'] < data['Lower'], 'Signal'] = 1
        data.loc[data['close'] > data['Upper'], 'Signal'] = -1

        # 简化回测逻辑
        holdings = 0
        cash = INITIAL_CAPITAL
        for i in range(1, len(data)):
            signal = data.iloc[i]['Signal']
            price = data.iloc[i]['close']
            if signal == 1 and holdings == 0:
                holdings = cash // price
                cash -= holdings * price
            elif signal == -1 and holdings > 0:
                cash += holdings * price
                holdings = 0

        portfolio = cash + holdings * data.iloc[-1]['close']
        total_return = (portfolio - INITIAL_CAPITAL) / INITIAL_CAPITAL

        if total_return > best_return:
            best_return = total_return
            best_params = (period, k)

print(f"最佳参数:周期={best_params[0]}, 倍数={best_params[1]:.2f}, 收益率={best_return:.2%}")
(2)加入风险管理

在策略中添加止盈和止损机制。

TAKE_PROFIT = 0.1  # 止盈10%
STOP_LOSS = 0.05   # 止损5%

for i in range(1, len(data)):
    if holdings > 0:
        pnl = (data.iloc[i]['close'] - entry_price) / entry_price
        if pnl >= TAKE_PROFIT or pnl <= -STOP_LOSS:
            data.at[data.index[i], 'Cash'] = data.iloc[i - 1]['Cash'] + holdings * data.iloc[i]['close']
            holdings = 0
            data.at[data.index[i], 'Position'] = holdings

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2259430.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

悬赏任务源码(悬赏发布web+APP+小程序)开发附源码

悬赏任务源码是指一个软件或网站的源代码&#xff0c;用于实现悬赏任务的功能。悬赏任务是指发布方提供一定的奖励&#xff0c;希望能够找到解决特定问题或完成特定任务的人。悬赏任务源码通常包括任务发布、任务接受、任务完成和奖励发放等功能的实现。搭建悬赏任务源码是一个…

【一本通】虫洞

【一本通】虫洞 C语言代码C代码JAVA代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; John在他的农场中闲逛时发现了许多虫洞。虫洞可以看作一条十分奇特的有向边&#xff0c;并可以使你返回到过去的一个时刻&#xff08;相对你进入虫洞之…

Linux之条件变量,信号量,生产者消费者模型

Linux之条件变量&#xff0c;信号量&#xff0c;生产消费者模型&#xff0c;日志以及线程池 一.条件变量1.1条件变量的概念1.2条件变量的接口 二.信号量2.1信号量的重新认识2.2信号量的接口 三.生产者消费者模型3.1生产者消费者模型的概念3.2基于阻塞队列的生产者消费者模型3.3…

如何写出优秀的单元测试?

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 写出优秀的单元测试需要考虑以下几个方面&#xff1a; 1. 测试用例设计 测试用例应该覆盖被测试代码的不同场景和边界情况&#xff0c;以尽可能发现潜在的问题。…

【竞技宝】LOL:JDG官宣yagao离队

北京时间2024年12月13日,在英雄联盟S14全球总决赛结束之后,各大赛区都已经进入了休赛期,目前休赛期也快进入尾声,LPL大部分队伍都开始陆续官宣转会期的动向,其中JDG就在近期正式官宣中单选手yagao离队,而后者大概率将直接选择退役。 近日,JDG战队在官方微博上连续发布阵容变动消…

2024美赛数学建模C题:网球比赛中的动量,用马尔可夫链求解!详细分析

文末获取历年美赛数学建模论文&#xff0c;交流思路模型 接下来讲解马尔可夫链在2024年C题中的运用 1. 马尔科夫链的基本原理 马尔科夫链是描述随机过程的一种数学模型&#xff0c;其核心特征是无记忆性。 简单来说&#xff0c;系统在某一时刻的状态只取决于当前状态&#x…

图形学笔记 - 5. 光线追踪 - RayTracing

Whitted-Style Ray tracing 为什么要光线追踪 光栅化不能很好地处理全局效果 软阴影尤其是当光线反射不止一次的时候 栅格化速度很快&#xff0c;但质量相对较低 光线追踪是准确的&#xff0c;但速度很慢 光栅化&#xff1a;实时&#xff0c;光线追踪&#xff1a;离线~10K …

Nginx之配置防盗链(Configuring Anti-hotlinking in Nginx)

运维小白入门——Nginx配置防盗 什么是防盗链&#xff1a; 防盗链技术主要用于防止未经授权的第三方或域名访问网站的静态资源。例如&#xff0c;一个网站可能拥有独特的图片素材&#xff0c;为了防止其他网站通过直接链接图片URL的方式访问这些图片&#xff0c;网站管理员会采…

51c大模型~合集89

我自己的原文哦~ https://blog.51cto.com/whaosoft/12815167 #OpenAI很会营销 而号称超强AI营销的灵感岛实测成效如何&#xff1f; OpenAI 是懂营销的&#xff0c;连续 12 天发布&#xff0c;每天一个新花样&#xff0c;如今刚过一半&#xff0c;热度依旧不减。 毫无疑问&…

深度学习的unfold操作

unfold&#xff08;展开&#xff09;是深度学习框架中常见的数据操作。与我们熟悉的卷积类似&#xff0c;unfold也是使用一个特定大小的窗口和步长自左至右、自上至下滑动&#xff0c;不同的是&#xff0c;卷积是滑动后与核求乘积&#xff08;所以取名为卷积&#xff09;&#…

Jetpack Compose赋能:以速破局,高效打造非凡应用

Android Compose 是谷歌推出的一种现代化 UI 框架&#xff0c;基于 Kotlin 编程语言&#xff0c;旨在简化和加速 Android 应用开发。它以声明式编程为核心&#xff0c;与传统的 View 系统相比&#xff0c;Compose 提供了更直观、更简洁的开发体验。以下是对 Android Compose 的…

Dual-Write Problem 双写问题(微服务)

原文链接https://www.confluent.io/blog/dual-write-problem/ 双写问题发生于当两个外部系统必须以原子的方式更新时。 问题 说有人到银行存了一笔钱&#xff0c;触发 DepositFunds 命令&#xff0c;DepositFunds 命令被发送到Account microservice。 Account microservice需…

桥接模式的理解和实践

桥接模式&#xff08;Bridge Pattern&#xff09;&#xff0c;又称桥梁模式&#xff0c;是一种结构型设计模式。它的核心思想是将抽象部分与实现部分分离&#xff0c;使它们可以独立地进行变化&#xff0c;从而提高系统的灵活性和可扩展性。本文将详细介绍桥接模式的概念、原理…

kubeadm安装K8s集群之高可用组件keepalived+nginx及kubeadm部署

系列文章目录 1.kubeadm安装K8s集群之基础环境配置 2.kubeadm安装K8s集群之高可用组件keepalivednginx及kubeadm部署 3.kubeadm安装K8s集群之master节点加入 4.kubeadm安装K8s集群之worker1节点加入 kubeadm安装K8s集群之高可用组件keepalivednginx及kubeadm部署 1.安装kubeadm…

Avalonia实战实例三:实现可输入框的ComboBox控件

文章目录 一、Avalonia中的ComboBox控件二、更改Template&#xff0c;并添加水印 接着上篇关闭按钮实现登录界面 实现一个可输入&#xff0c;可下拉的用户名输入框 一、Avalonia中的ComboBox控件 Avalonia中Fluent主题里ComboBox实现&#xff1a; <ControlTheme x:Key&q…

TMS320C55x DSP芯片结构和CPU外围电路

第2章 DSP芯片结构和CPU外围电路 文章目录 第2章 DSP芯片结构和CPU外围电路TMS320C55x处理器的特点TMS320c55x CPU单元指令缓冲(Instruction Buffer Unit) I单元程序流程(Program Flow Unit) P单元地址数据(Address-data Flow Unit) A单元数据计算(Data Computation Unit) D单元…

Oracle 与 达梦 数据库 对比

当尝试安装了达梦数据库后&#xff0c;发现达梦真的和Oracle数据库太像了&#xff0c;甚至很多语法都相同。 比如&#xff1a;Oracle登录数据库采用sqlplus&#xff0c;达梦采用disql。 比如查看数据视图&#xff1a;达梦和Oracle都有 v$instance、v$database、dba_users等&a…

数据结构之五:排序

void*类型的实现&#xff1a;排序&#xff08;void*类型&#xff09;-CSDN博客 一、插入排序 1、直接插入排序 思想&#xff1a;把待排序的数据逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 。 单趟&#x…

JavaWeb:JavaScript

学习 资源1 学习资源 2 黑马javaweb 1、引入方式 内部脚本&#xff1a; <script>内容</script> 外部脚本&#xff1a; <script src"js/test.js"></script> 2、基础语法 注释&#xff1a;// /* */ 结尾分号可有可无 大括号表示代码块 …

MySQL其五,索引详解,逻辑架构,SQL优化等概念

目录 一、索引 1、索引的概念 2、索引的优缺点 3、添加索引的原则 4、索引的分类 5、索引如何使用 6、存储过程讲解 7、测试索引的效率 7、索引的数据结构 8、覆盖索引&#xff08;SQL优化的点&#xff09; 9、最佳左前缀法则&#xff08;SQL优化的点&#xff09; 二…