2.3 经典策略之海龟策略

说起经典的交易策略,就不得不提到“海龟策略”——一个20世纪80 年代提出的,以海龟交易法则为核心的交易策略。其核心要点是:在股 价超过过去N个交易日的股价最高点时买入,在股价低于过去N个交易 日的股价最低点时卖出。上述的若干个最高点和最低点会组成一个通 道,称为“唐奇安通道”。

关于海龟策略的介绍,限于篇幅,本书不展开详细介绍。我们重点 来研究一下如何帮助小瓦使用Python来实现海龟策略。

以下两段代码是加载必要库、设置、加载数据。

前面反复用过,没什么可说的

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import tushare as tspd.set_option('expand_frame_repr', False)  # True就是可以换行显示。设置成False的时候不允许换行
pd.set_option('display.max_columns', None)  # 显示所有列
pd.set_option('display.max_rows', None)  # 显示所有行
pd.set_option('colheader_justify', 'centre')  # 显示居中
ts.set_token('你的token')
pro = ts.pro_api()
# 股票代码
ts_code="002624.SZ"
start = "20220901"
end = "20230310"
# # 日线行情
zgpa = pro.daily(ts_code=ts_code, start_date=start, end_date=end)
zgpa.sort_values('trade_date', inplace=True)
zgpa.set_index('trade_date', inplace=True)
print(zgpa.head())
print(zgpa.tail())

备注:

如果上面程序报错

ts.set_token('你的token')改成:ts.set_token('token')

token即你的 tushare官网 token

需要去 tushare官网 注册账户,就有了你的token,登录后个人主页中找

2.3.1 使用海龟策略生成交易信号

海龟策略的一个重点是,使用过去N天的股价最高点和过去N天的 股价最低点生成唐奇安通道。一般来说,N会设置为20。不过因为我们 下载的股票数据时间范围跨度比较小,所以选择了使用过去5日的股价 最高点和最低点来进行演示。输入代码如下:

# 创建一个名为的数据表,使用原始数据表的日期序号
turtle = pd.DataFrame(index=zgpa.index)
# 设置唐奇安通道的上沿为前5天股价的最高点
turtle['high'] = zgpa['close'].shift(1).rolling(5).max()
# 设置唐奇安通道的下沿为前5天股价的最低点
turtle['low'] = zgpa['close'].shift(1).rolling(5).min()
# 当股价突破上沿时,发出买入信号
turtle['buy'] = zgpa['close'] > turtle['high']
# 当股价突破下沿时,发出卖出信号
turtle['sell'] = zgpa['close'] < turtle['low']
turtle.tail()

【结果分析】从输出中可以看到,high中存储的是唐奇安通道的上 沿数据;low中存储的是唐奇安通道的下沿;buy如果为True,则为买入 信号;sell如果为True,则为卖出信号;而当buy和sell都是False时,则 不进行下单。 注意:实际上,在唐奇安通道中,还有一条中线,中线的值是上 沿和下沿的均值。本例进行了简化处理。

2.3.2 根据交易信号和仓位进行下单

下面我们就根据生成的交易信号来下单。需要说明的是,当程序给 出交易信号时,还要结合仓位来判断:当交易信号为“买入”且空仓时, 我们才会下买入订单;而交易信号为“卖出”且有持仓股票时,我们才会 下卖出订单。输入代码如下:

turtle['orders'] = 0
# 初始的仓位为0
position = 0
# 设置循环,遍历turtle数据表
for k in range(len(turtle)):# 当买入信号为True且仓位为0时下单买入1手if turtle.buy[k] and position==0:# 修改对应的orders值为1turtle.orders.values[k] = 1# 仓位也增加1手position = 1# 当卖出信号为True且持仓时卖出1手if turtle.sell[k] and position>0:# 修改对应的orders值为-1turtle.orders.values[k] = -1# 仓位相应清零position = 0print(turtle.tail(30))
print(position)

【结果分析】仔细观察表2.7,大家会发现:在2月20日这一天,程 序下了买入单;而在2月27日,程序下了卖出单。如果读者朋友得到了类 似的结果,说明成功地根据交易信号和仓位生成了买卖订单。

为了方便观察,我们也可以用可视化的方式来进行下单的展示。

输入代码如下:

# 设置字体 显示汉字
plt.rcParams["font.sans-serif"] = "SimHei"
# 设置画布的尺寸为18*10
plt.figure(figsize=(18, 10))
# 使用折线图绘制出每天的收盘价
plt.plot(zgpa['close'], lw=1.2, label='收盘价')
# 唐奇安通道的上沿
plt.plot(turtle['high'], lw=1,  ls='--',c='r', label='high')
# 唐奇安通道的下沿
plt.plot(turtle['low'], lw=1,  ls='--',c='g', label='low')
#将买入信号用正三角标识
plt.scatter(turtle.loc[turtle.orders == 1].index,zgpa['close'][turtle.orders == 1],marker='^', s=80, c='r', label='buy')
#将卖出信号用倒三角标识
plt.scatter(turtle.loc[turtle.orders == -1].index,zgpa['close'][turtle.orders == -1],marker='v', s=80, c='g', label='shell')
#添加图注
plt.legend()
# plt.grid()
# 将图像进行展示
plt.show()

【结果分析】在输出图中,实线部分体现的是该股每日的价格,两 条虚线分别对应唐奇安通道的上沿和下沿。

当股价第一次突破唐奇安通道上沿时,程序进行了买入,但随后的几天中, 股价再次突破了上沿,但由于此时已经有1手持仓,故没有再次买入。

之后股价急转直下,突破了通道下沿,程序下单卖出。

依次类推,在选定的时间范围内,程序进行了N笔交易。

2.3.3对海龟策略进行回测

在前面小节中,我们使用海龟策略分别生成了交易信号和订单。同 样,为了帮助小瓦了解海龟策略的业绩表现,下面对其进行简单回测。

输入代码如下:

# 初始资金
initial_cash = 20000
# 创建新的数据表,序号和turtle数据表一致
positions = pd.DataFrame(index=turtle.index).fillna(0.0)
# 每次交易为1手,既100股,仓位既买单和卖单的累积加和
positions['stock'] = 900 * turtle['orders'].cumsum()
# 创建投资组合数据表
portfolio = positions.multiply(zgpa['close'], axis=0)
# 持仓市值为持仓股票数乘以股价
portfolio['holding_values'] = positions.multiply(zgpa['close'], axis=0)
# 计算出仓位的变化
pos_diff = positions.diff()
# 剩余的现金是初始资金减去仓位变化产生的现金流累计加和
portfolio['cash'] = initial_cash - (pos_diff.multiply(zgpa['close'], axis=0)).cumsum()
# 总资产既持仓股票市值加剩余现金
portfolio['total'] = portfolio['cash'] + portfolio['holding_values']
print(portfolio.tail())

为了方便观察,我们也可以用可视化的方式来进行下单的展示。

输入代码如下:

plt.figure(figsize=(18, 10))
plt.plot(portfolio['total'], label='总资产')
plt.plot(portfolio['holding_values'], '--', label='持仓股票市值')
plt.legend()
plt.grid()
plt.show()

【结果分析】从图中可以清晰地看到使用海龟策略进行交易后 小瓦总资产和持仓市值的变化情况:实线部分体现的是总资产变化,虚 线部分代表小瓦持仓股票的市值。与使用双移动平均策略相似,在整个 股价变动明显的情况下,小瓦的总资产略有减少。 为了对比海龟策略和双移动平均策略的业绩表现,我们可以看看使 用海龟策略后,小瓦的总资产究竟减少了多少。

2.4 小结

在本章中,为了帮助小瓦评估她的“低买高卖”策略,我们简单设计 了一个回测程序,通过小瓦总资产的变化来评价策略的业绩表现;随后 又介绍了两个经典的交易策略——双移动平均策略和海龟策略。当然, 这两种策略都是基于市场动量的变化而设计的,核心思想如下:如果股 价上涨并超过某个点位,说明其上升的动量变强,这时应该买入;反 之,则下行的动量变强,此时应该卖出。类似的策略也可以看作基于直 觉的交易策略,在下一章中,我们会和小瓦一起学习使用机器学习技术 来创建交易策略。

深入浅出Python量化交易实战--第2章 回测与经典策略(下)相关推荐

  1. 深入浅出Python量化交易实战--第1章 从零开始

    本书源于一个真实的故事,故事的主角是一位名叫小瓦的姑娘. 小瓦出生在一个普通的家庭,父母都是老实淳朴的普通人,靠着并不 丰厚的收入把小瓦养育成人.18岁那年,小瓦考上了一所不好不坏的 大学,所学专业是 ...

  2. 《深入浅出Python量化交易实战》:散户也能学会的数字化交易策略

    前言 您可能不知道,许多专业的交易机构已经采用设定程序完成自动化交易,通过机器语言,解密盘面的走势,从而实现持续盈利的目的. (文末送读者福利) 这并非什么秘密,他们正是借助了这样的数字化工具进行操作 ...

  3. 【赠书】深入浅出Python量化交易实战

    ‍‍ 本书主要以国内A股市场为例,借助第三方量化交易平台,讲述了KNN.线性模型.决策树.支持向量机.朴素贝叶斯等常见机器学习算法在交易策略中的应用,同时展示了如何对策略进行回测,以便让读者能够有效评 ...

  4. 深入浅出Python量化交易实战--笔记01

    第1章 从零开始 本书源于一个真实的故事,故事的主角是一位名叫小瓦的姑娘. 小瓦出生在一个普通的家庭,父母都是老实淳朴的普通人,靠着并不 丰厚的收入把小瓦养育成人.18岁那年,小瓦考上了一所不好不坏的 ...

  5. 学习《深入浅出python量化交易交易实战》第一章(笔记)

    1.学习<深入浅出python量化交易交易实战>第一章 记录学习过程中的代码和一些坑 1.1 基础(名词解释) 1.1.1 CAPM (Capital Asset Pricing Moda ...

  6. 很燃基于掘金量化平台的《Python量化交易实战》新书介

    原 很燃!基于掘金量化平台的<Python量化交易实战>新书简介 内容简介: 在目前不断变化.蓬勃发展的中国资本市场,量化投资作为新兴的投资方法,引来越来越多的关注,使用量化投资技术的证券 ...

  7. Python量化交易实战-40easytrader开发环境安装

    B站配套视频教程观看 初始化easytrader开发环境 一.安装对象 1.1客户端安装 股票的客户端,可以是券商,比如说华泰.海通.也可以是第三方平台,东方财富.同花顺.但是由于easytrader ...

  8. Python量化交易实战-41EasyTrader自动化模拟真实交易

    B站配套视频教程观看 EasyTrader自动化模拟真实交易 来到官方文档的使用部分: https://easytrader.readthedocs.io/zh/master/usage/ 一.用法 ...

  9. Python量化交易实战-38使用开源项目回测双均线策略

    B站配套视频教程观看 使用PyAlgoTrade回测双均线策略 双均线策略:长短周期均线,通过金叉,死叉的方式买入卖出股票,获取收益的策略. 回顾上节课代码的部分,上节课完成了可视化代码的部分, 主要 ...

最新文章

  1. php 数组 添加元素、删除元素
  2. 工作日报模板_千份财会人通用工作模板:自动核算工资、财务分析报表等等
  3. 【物理女神】谁是中国第一位物理学女博士?
  4. java double 的精度_Java Double的精度问题
  5. Set和Map集合的比较
  6. Flink 读取 Mysql
  7. 爬虫开发python工具包介绍 (4)
  8. nodejs写的HTTP静态文件的引擎(轻量级)
  9. matplotlib绘制李萨如图(一) 静态2D李萨如图
  10. IntelliJ IDEA使用教程 (总目录篇)
  11. 后台管理系统 - 权限设计
  12. python实现归结演绎推理_归结演绎推理
  13. 期货交易中的量价关系
  14. css 平行四边形 梯形 组合_CSS实现平行四边形布局
  15. python培训骗局
  16. 猿创征文|Python基础——Visual Studio版本——第五章 文件I/O
  17. 学计算机编程我有什么好处,学编程到底有什么好处?我发现了这三个秘密!
  18. 微信小程序:云开发表情包制作源码
  19. 谷歌浏览器网页表格复制一列_如何冻结或隐藏Google表格中的列和行
  20. ConstraintLayout2.x使用详解

热门文章

  1. 将dtb反编译成dts
  2. 雷克萨斯全球首发新纯电车型RZ;中国海油正式登陆A股 | 美通企业日报
  3. python循环体结束标志_Python循环语句代码详解:while、for、break
  4. 毕业论文第一步--如何快速写出让人眼前一亮的文献综述论文(citspace)
  5. joomla安装,代码结构
  6. 国外软件下载网站列表和排名
  7. 视觉SLAM十四讲学习笔记-第五讲-相机模型
  8. 架构设计——业务逻辑层概述
  9. Android Binder 机制
  10. 将rmvb下载的电影转换成可用家庭dvd播放的dvd格式