【金融量化】CTA策略之VeighNa量化实战笔记(1)

news2024/11/26 1:42:28

量化投资实战笔记

1 基本概念

1、一手股票:100支股票
2、收盘比开盘上涨的百分比:(收盘-开盘)/开盘
3、开盘比前日收盘的百分比:(开盘-前日收盘)/前日收盘
4、从dataframe中取每个月的第一天
df.resample(‘M’).first()
5、从dataframe中取每个年的最后一天
df.resample(‘A’).last()
6、什么是均线
对于每一个交易日,都可以计算出前N天的移动平均值,然后把这些移动平均值连接起来,成为一条线,就叫做N日移动平均线。移动平均线常用线有5天、10天、60天、120天和240天的指标。

  • 5天和10天的是短期操作的参考指标,称作日均指标
  • 30天和60天的是中期均线指标,称作季均线指标
  • 120天和240天的是长期均线指标,称作年均线指标

计算5日均线
df[‘close’].rolling(5).mean()
7、金叉日期和死叉日期
分析指标中的两根线,一根为短期内的指标线,另一根是较长时间的指标线
金叉:如果短时间的指标线方向拐头向上,并且穿过了较长的指标线,这种状态称为金叉。
死叉:如果短时间的指标线方向拐头向下,并且穿过了较长的指标线,这种状态称为死叉。
一般情况下,出现金叉后,操作趋向买入,死叉则趋向卖出。当然,金叉和死叉的只是分析指标之一,要和其他很多指标配合使用,才能增加操作的准确性。
计算死叉的日期

s1 = ma5<ma30
s2 = ma5>ma30


death_ex = s1& s2.shift(1)
df.loc[death_ex]
death_date = df.loc[death_ex].index

计算金叉的日期

s1 = ma5<ma30
s2 = ma5>ma30

gold_ex =-(s1& s2.shift(1))
df.loc[gold_ex]
gold_date = df.loc[gold_ex].index

8、根据金叉买入,死叉卖出

s1 = Series(data=1,index = gold_date)
s2 = Series(data=0,index = death_date)

s = s1.append(s2)
s = s.sort_index()


first_money = 100000 # 本金
money = first_money # 手头剩余的钱
hold = 0 # 持有股票数量
for i in range(0,len(s)):
    if s[i]==1:
        time = a.index[i]
        p = df.loc[time]['open']
        hand_count = money//(p*100)
        hold = hand_count*100
        money -=(hold*p)
    else:
        death_time = s.index[i]
        p_death = df.loc[death_time]['open']
        money +=(p_death*hold)
        hold = 0
# 剩余股票的价值
last_money =hold  = df['close'][-1]

9、计算金叉和死叉

def on_bar(self,bar:BarData):
    am = self.am
    am.update_bar(bar)
    if not am.inited:
        return
    # 计算技术指标
    fast_ma = am.sma(self.fast_window,array=True)
    fast_ma0 = fast_ma[-1]
    fast_ma1 = fast_ma[-2]
    
    slow_ma = am.sma(self.slow_window,array=True)
    slow_ma0 = slow_ma[-1]
    slow_ma1 = slow_ma[-2]
    
    # 判断均线交叉
    # 金叉
    cross_over = (self.fast_ma0 >=self.slow_ma0 and self.fast_ma1 <self.slow_ma1)
    cross_below = (slef.fast_ma0 >=self.slow_ma0 and self.slow_ma1 > sefl.fast_ma1)
    # 发生金叉
    if cross_over:
        price = bar.close_price + 10
        # 当前没有仓位
        if not self.pos:
            # 买1手
        self.buy(price,1)
        # 有空头仓位,需要平掉空头仓位,再买入
      elif self.pos<0:
            self.cover(price,1)
            self.buy(price,1)
    #  发生死叉
    elif cross_below:
        price = bar.close_price - 10
        # 当前没有仓位
        if not self.pos:
            # 做空1手
        self.short(price,1)
        # 有多头仓位,需要卖掉多头仓位,再做空
      elif self.pos>0:
            self.sell(price,1)
            self.short(price,1)    
    self.put_event()

10、Tick 数据和Bar数据的区别
Tick 是某种金融产品交易时的逐笔数据。为了高频的 tick 数据从中提取有价值的信息,并以合适的形式存储它们。这种数据储存形式叫做 bar。将右图的单元放大得到两种类型的 bar (绿色空心代表价格上升的 bar,红色实心代表价格下降的 bar):

12、委托和成交的区别
委托中包括了撤单的和成交的。
13、VeighNa回测的K线图标中黄色上三角和蓝色下三角的意义
黄色表示买入做多的位置,蓝色表示卖出做空的位置。
14、VeighNa连接测试TCP
用户名:000300
密码:vnpy1234
经纪商代码:9999
交易服务器:180.168.146.187:10101
行情服务器:180.168.146.187:10101
产品代码:simnow_client_test
授权编码:0000000000000000
15、SimNow 是做什么的?
是上期所全资子公司上期技术公司专门为投资者打造的期货、期权模拟交易平台,为上期所投资者教育网认证的期货、期权模拟仿真系统。
SimNow可以仿真各期货交易所的交易、结算规则,目前已支持国内各期货交易所的商品期货、期权业务。
SimNow的优势:
(1)模拟实盘行情,将实盘价格信息引入仿真
(2)提供7 * 24小时仿真服务
(3)提供TradeNow手机APP,支持手机端操作
(4)便捷开户,直接通过网站注册即可开户,无须线下办理
(5)便捷入金,直接通过网站申请入金
(6)可以支持期货公司等举办仿真交易比赛
16、VeighNa开发一个新指标的过程
以阿隆指标为例。创建my_strategy_tool.py,继承创建NewArrayManager类,新增Aroon指标函数,调用talib的AROON函数,最后返回数组和最新值。

class NewArrayManager(ArrayManager):
    def __init__(self,size=100):
        super().__init__(size)
    def aroon(self,n,array=False):
        aroon_up,aroon_down = talib.AROON(self.high,self.low,n)
        if array:
            return aroon_up,aroon_down
        return aroon_up[-1],aroon_down[-1]

17、指标条件逻辑

am = self.am

am.update_bar(bar)
if not am.inited:
    return
fast_rsi = am.rsi(self.fast_window,array =True)
slow_rsi = am.rsi(self.slow_window,array =True)
fast_rsi_0 = fast_rsi[-1] 
fast_rsi_1 = fast_rsi[-2]
slow_rsi_0 = slow_rsi[-1] 
slow_rsi_1 = slow_rsi[-2]
if fast_rsi_0 >=70:
    print('over bought')
elif fast_rsi_0<=30:
    print('over sold')
# RSI 的金叉与死叉
rsi_crss_over = (fast_rsi_1<slow_rsi_1) and (fast_rsi_0 >=slow_rsi_0)
rsi_crss_below = (fast_rsi_1>slow_rsi_1) and (fast_rsi_0 <=slow_rsi_0)

if rsi_crss_over:
    print('we buy')
elif rsi_crss_below:
    print('we sell')

18、CTA策略的构成
分为信号、过滤和出场三部分。信号是指赌涨还是跌或者不玩。信号主要分为两类,第一类是信号跟踪类。
在这里插入图片描述

其中SMA是指算术平均、EMA是指指数平均、AMA是指自适应性平均。
第二类是趋势突破性信号
在这里插入图片描述

过滤是指是否应该下注,出场是指手气不顺要跑。
以RSI指标举例,RSI进入超买区,做多,RSI进入超买器做空
在这里插入图片描述

出场逻辑,是指什么时候平仓
在这里插入图片描述

价格百分比,移动止损
19、CTA策略中数据回放撮合流程
在这里插入图片描述

20、限价单的触发、提交、委托推送流程
在这里插入图片描述

21、什么叫市价单、限价单和停止单?
市价单:按市场价来执行的订单。优点是交易快和原理简单、缺点是存在Slippage(实际执行价与期待价格间的价差)
限价单:买入时的限价单是指,就是告诉券商,我要以多少钱买入,比这个价格高就不买,比这个价格低可以;卖出时的限价单是指,就是告诉券商,我要以多少钱卖出,比这个价格低就不卖,比这个价格高就卖,这样限制了成交的最差的价格。优点是避免了Slippage的价差,从而保证价格,缺点是单子可能不会被执行或者只执行了一部分。限价单适合波段交易或者长期投资,对时间不敏感的交易类型,在日交易中,会错过很多交易。
停止单:触发的价格
通常说的限价单是用来入场的,而停止单是用来出场的。
在这里插入图片描述

22、停止单撮合
在这里插入图片描述

停止单撮合规则一
在这里插入图片描述

停止单撮合规则二
在这里插入图片描述

23、Dual Trust 策略
做空做多设置一个上轨和下轨,这个轨的范围(Range)的设定,计算公式如下,从(bar中的最高价的最高价HH-收盘价的最高价HC)和(bar中的收盘价的最高价HC-最低价的最低价LL)中选择最大的作为轨的上下范围。
优点是:思路简单、参数不多
缺点是:日内策略,不持仓过夜
特点是:需要日线数据产生信号,分钟线数据进行回测
在这里插入图片描述

策略实现思路
(1)全撤委托:清空策略状态
(2)缓存K线:判断是否隔日
(3)计算入场价格:开盘价加减
(4)判断当前时间

  • 若交易时间段
    • 停止单入场
  • 若结束时间段
    • 超价平仓

24、通道突破策略
(1)Bollinger Band 布林带策略
布林带是一种多功能工具,结合移动平均线和标准差来检测市场波动的变化。布林带指标包含三个组成部分:

  • 中轨 = N时间段的简单移动平均线(SMA)
  • 上轨 = 中轨 + K × N时间段的标准差
  • 下轨 = 中轨 − K × N时间段的标准差

一般情况下,设定N=20和K=2,这两个数值也是在布林带当中使用最多的。在日线图里,N=20其实就是“月均线”(MA20)。依照正态分布规则,约有95%的数值会分布在距离平均值有正负2个标准差的范围内。
交易规则:价格突破上轨(%b大于等于1),买入开仓,价格突破下轨(%b小于等于0),卖出开仓
python 实现

def boll(self,n,dev,array=False):
    mid = self.sma(n,array)
    std = self.std(n,array)
    up  = mid+std*dev
    down = mid- std*dev
    return up,down

(2)肯特纳通道策略(Keltner Channel)
肯特纳通道也是一个基于波动率的技术指标,由三条独立的线组成。Keltner Channels 不使用标准偏差,而是使用平均真实范围 (ATR)来设置通道距离。以下是三个组件:

  • 中轨:N时间段的周期指数移动平均线 (EMA)
  • 上轨:中轨 +K* 平均真实范围(ATR)
  • 下轨:中轨 -K * 平均真实范围(ATR)

python 实现

def keltner(self,n,dev,array=False):
    mid = self.sma(n,array)
    atr = self.atr(n,array)
    up  = mid+atr*dev
    down = mid- atr*dev
    return up,down

(3)唐奇安通道策略
上线=Max(最高价,n),是指n天的最高价
下线=Min(最低价,n),是指n天的最低价
中线=(上线+下线)/2
python实现

def donchian(self,n,array = False):
    up = talib.MAX(self.high,n)
    down = talib.MIN(self.low,n)
    if array:
        return up,down
    return up[-1],down[-1]

3 参考资料

  1. 『金融数据结构』「2. 从 Tick 到 Bar」
  2. VNPY 实战进阶CTA策略网课:https://www.betterbench.top/#/24/detail

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

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

相关文章

Hgame-week 1(部分)

标题MISCSing InWhere am I神秘的海报e99p1ant_want_girlfriendWEDClassic Childhood Game改源码直接看jsBecome A MemberUser-Agent:Cookie:Referer:X-Forwarded-For:json请求方式登陆Guess Who I AmCRYPTO神秘的电话注意大小写REVERSEtest your IDAMISC Sing In aGdhbWV7V2…

【GPLT 二阶题目集】L2-027 名人堂与代金券

对于在中国大学MOOC&#xff08;http://www.icourse163.org/ &#xff09;学习“数据结构”课程的学生&#xff0c;想要获得一张合格证书&#xff0c;总评成绩必须达到 60 分及以上&#xff0c;并且有另加福利&#xff1a;总评分在 [G, 100] 区间内者&#xff0c;可以得到 50 元…

二十、Gtk4-GtkMenuButton, accelerators, font, pango and gsettings

本节将重新构造Tfe文本编辑器。 在工具栏上放置了打开、保存和关闭按钮。此外&#xff0c;GtkMenuButton被添加到工具栏中。当点击这个按钮时会显示一个弹出式菜单。在这里&#xff0c;弹出式的含义很广泛&#xff0c;包括下拉式菜单。新建、另存为、偏好和退出项目被放入菜单…

Java IO流之序列化流

序列化流/对象操作输出流 可以把Java中的对象写到本地文件中 序列化流的小细节 使用对象输出流将对象保存到文件时会出现NotSerializableException\color{#FF0000}{NotSerializableException}NotSerializableException 异常 解决方案&#xff1a;需要让JavaBean类实现Serializa…

【树】二叉树递归遍历和创建

二叉树的遍历二叉树的遍历是将二叉树的每个结点访问且访问一次遍历按根来说常用三种设访问根结点记作V&#xff0c;遍历根的左子树记作L&#xff0c;遍历根的右子树记作R&#xff1b;有&#xff1a;先序遍历VLR&#xff0c;中序遍历LVR&#xff0c;后序遍历LRV。这个遍历是递归…

设计模式 - 六大设计原则之ISP(接口隔离原则)

文章目录概述CaseBad ImplBetter Impl概述 接口隔离原则&#xff08;Interface Segregation Principle, ISP&#xff09;,要求尽量将臃肿庞大的接口拆分成更小的和更具体的接口&#xff0c;让接口中只包含相关的方法。 接口隔离是为了高内聚、低耦合。 在实际的开发中&#x…

Altova MobileTogether 8.1

Altova MobileTogether 8.1 使用RecordsManager进行无代码开发的主要更新 可视化配置复杂条件的主要脚本扩展。 分层用户组。 客户端之间的UI兼容性模式 当开发人员希望应用程序在所有平台上看起来都一样&#xff0c;而不是使用每个平台的原生外观时&#xff0c;现在可以使用新…

蓝桥杯刷题016——最大子矩阵(尺取法+单调队列)

题目来源&#xff1a;最大子矩阵 - 蓝桥云课 (lanqiao.cn) 问题描述 小明有一个大小为 NM 的矩阵, 可以理解为一个 N 行 M 列的二维数组。 我们定义一个矩阵 m 的稳定度 f(m) 为f(m)max(m)−min(m), 其中 max(m) 表示矩阵 m 中的最大值, min(m) 表示矩阵 m 中的最小值。 现在小…

朴素贝叶斯分类

一、朴素贝叶斯法原理 1.基本原理 朴素贝叶斯法(Naive Bayes)是一种基础分类算法&#xff0c;它的核心是贝叶斯定理条件独立性假设。贝叶斯定理描述的是两个条件概率之间的关系&#xff0c;对两个事件A和B&#xff0c;由乘法法则易知(A∩B)P(A)P(B│A)P(B)P(A│B)(A∩B)P(A)P(…

离散数学与组合数学-06特殊的图

文章目录离散数学与组合数学-06特殊的图6.1 欧拉图6.1.1 哥尼斯堡七桥问题6.1.2 欧拉图的定义6.1.3 无向欧拉图的判定6.1.4 有向欧拉图的判定6.1.5 一笔画问题6.1.6 求回路6.2 哈密顿图6.2.1 周游世界问题6.2.2 哈密顿图的定义6.2.3 哈密顿图的必要条件6.2.4 哈密顿图的充分条件…

Hadoop基础之《(5)—MapReduce概述》

一、什么是MapReduce MapReduce将计算过程分为两个阶段&#xff1a;Map和Reduce。 1、Map阶段并行处理输入数据。 2、Reduce阶段对map结果进行汇总。 二、结构图 三、HDFS、Yarn、MapReduce三者之间的调用关系 HDFS三台服务器&#xff0c;第一台上有DataNode和NameNode。第二…

如何像程序员一样思考

如何像程序员一样思考 全世界越来越多的人发现了软件开发的乐趣和兴奋。一个你构建东西的职业&#xff0c;去打破它们&#xff0c;然后再把它们构建得更好。您可以经常设定自己的工作时间并与来自全球各地的客户一起工作的职业。一个可以自己当老板的职业&#xff1f;编程在 2…

android12.0(S) Launcher3 导入 AndroidStudio 调试编译

验证环境 aosp 12.0 源码&#xff0c;分支 android-12.0.0_r3 可以参考之前写的 android12.0(S) Pixel 3XL (QCOM 845) 编译刷机 AndroidStudio 版本 Android Studio Arctic Fox | 2020.3.1 Patch 4 gradle 版本 gradle-7.0.2-bin.zip gradle:7.0.4 二手 Pixel 3 XL一台可直…

[WUSTCTF2020]颜值成绩查询(布尔注入)

目录 信息收集 脚本 reference 信息收集 输入1出现固定的回显&#xff0c;输入2-4出现乱码 Hi admin, your score is: 100 输入其他特殊字符无回显&#xff0c;也无报错回显 采用布尔注入进行判断 布尔注入原理 代码存在SQL注入漏洞&#xff0c;然而页面即不会回显数据&am…

【C++算法图解专栏】一篇文章带你掌握尺取法(双指针)

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4e3;专栏定位&#xff1a;为 0 基础刚入门数据结构与算法的小伙伴提供详细的讲解&#xff0c;也欢迎大佬们一起交流~ &#x1f4da;专栏地址&#xff1a;https://blog.csdn.net/Newin…

java spring IOC xml方式工厂Bean操作

spring中有两种Bean 第一种 普通 Bean 就是我们在配置文件中 定义的类对象 创建bean 并定义相关的id和声明类对象 普通bean的特点在于 在配置文件中定义的类型 也就是返回类型 就比如 你定义的是一个 book类的类型 那你这个bean返回的 也比如是个book类型的对象 第二种 是在工…

模拟实现vector/迭代器失效问题

对于STL&#xff0c;我们不仅学会使用STL,还要了解其底层原理&#xff0c;这样一来&#xff0c;我们就能知道什么时候用string好&#xff0c;什么时候用vector&#xff0c;什么时候用list&#xff0c;哪种方法效率高等等。其次了解了STL的底层原理&#xff0c;也助于我们的C功力…

RTF、RIR、Steering Vector傻傻分不清

RTF&#xff1a; Relative transfer function&#xff0c;相对传递函数RIR: Room impulse response&#xff0c;空间冲击响应Steering vector: 导向矢量场景问题定义&#xff1a;空间中存在I个麦克风和J个声源&#xff0c;麦克风采集到的信号其中&#xff0c;麦克i的信号其中表…

一起自学SLAM算法:9.1 ORB-SLAM2算法

连载文章&#xff0c;长期更新&#xff0c;欢迎关注&#xff1a; 下面将从原理分析、源码解读和安装与运行这3个方面展开讲解ORB-SLAM2算法。 9.1.1 ORB-SLAM2原理分析 前面已经说过&#xff0c;ORB-SLAM2算法是特征点法的典型代表。因此在下面的分析中&#xff0c;首先介绍一…

被删库勒索了,怎么使用docker进行MySQL容器的管理?

大家觉得写还可以&#xff0c;可以点赞、收藏、关注一下吧&#xff01; 也可以到我的个人博客参观一下&#xff0c;估计近几年都会一直更新&#xff01;和我做个朋友吧&#xff01;https://motongxue.cn 起因&#xff1a;云服务器MySQL密码设置的太简单了&#xff0c;导致到被入…