柒拾贰- tushare 模拟策略交易 (三)

书接上两回

柒拾- tushare 模拟策略交易 (一)

柒拾壹- tushare 模拟策略交易 (二)


开始

终于我们可以可以来进行模拟了

复杂 的我不会,所以就写个最简单的策略吧:

  • 买入条件
  1. 比两年前是上升的
  2. 比一年前是上升的
  3. 比一个月前上升更下降的区间在 ± 0.38% 内
  4. 比昨天上涨 0.1% 以上 0.5% 以下
  • 卖出条件
  1. 如果当前下跌 5% 则全卖出

进行模拟

设计模拟时间

先进行模拟时间,即回测多少天

strStartDate = '20230101'
strEndDate = '20240407'

就是从 2023年的1月1日开始进行策略,2024年4月7日结束

选股范围

strIndustry = "'银行'"

只选择银行股进行回测

中间计算

因为需要计算 2年、1年、半年等时间窗口各股票的涨跌,用 Python 比较麻烦,于是使用 SQL 进行计算

完整代码


'''
Descripttion: 就简单回测
Version: 1.0
Author: BerryBC
Date: 2024-02-18 12:09:31
LastEditors: BerryBC
LastEditTime: 2024-04-07 11:07:43
'''import datetime
from Lib.DBConn import claDBConn
from Lib.BackTestingDailyDeal import claBackTestingDailyDealbtDaily = claBackTestingDailyDeal('研究银行股', '根据时间窗口看追涨', 100000)
dbConn = claDBConn()strStartDate = '20240101'
strEndDate = '20240407'strStock = '601988.SH'strMaxDate = ''# 时间序列
strSQLTime = "SELECT * FROM tb_calendar WHERE trade_date >=" + \strStartDate+" AND trade_date <= "+strEndDate+" ORDER BY trade_date "
listCal = dbConn.ReturnSQLData(strSQLTime)# 打印快照
btDaily.AssetSnapshot(listCal[0][0])# 循环验证
for tubDay in listCal:# 计算日期strNowDate = tubDay[0]strMaxDate=strNowDate'''.::::..::::::::.:::::::::::..:::::::::::''::::::::::::'.::::::::::'::::::::::::::....::::::::::::.``::::::::::::::::::::``:::::::::'        .:::.::::'   ':::::'       .::::::::..::::'      ::::     .:::::::'::::..:::'       :::::  .:::::::::' ':::::..::'        :::::.:::::::::'      ':::::..::'         ::::::::::::::'         ``::::....:::           ::::::::::::'              ``::.````':.          ':::::::::'                  ::::..'.:::::'                    ':'````..'''# 追涨杀跌# # 每日数据# strSQLQuote = "SELECT * FROM tb_daily_stock_quote WHERE trade_date=" + \#     strNowDate+" AND ts_code = '"+strStock+"'"# listQuote = dbConn.ReturnSQLData(strSQLQuote)# if listQuote[0][8] > 0.2:#     btDaily.BuyStock(strNowDate, strStock, 500,'追涨')# elif listQuote[0][8] < -0.1:#     strSQLSell = "SELECT * FROM tb_bt_daily_tmp_my_stock_pool WHERE stock_code='" + strStock+"' AND bt_ind = '"+str(btDaily.intInd)+"'"#     listSell = dbConn.ReturnSQLData(strSQLSell)#     if len(listSell) > 0 and listSell[0][0] is not None:#         btDaily.SellStock(strNowDate, strStock, listSell[0][2], '全部卖了!!!')'''.::::..::::::::.:::::::::::..:::::::::::''::::::::::::'.::::::::::'::::::::::::::....::::::::::::.``::::::::::::::::::::``:::::::::'        .:::.::::'   ':::::'       .::::::::..::::'      ::::     .:::::::'::::..:::'       :::::  .:::::::::' ':::::..::'        :::::.:::::::::'      ':::::..::'         ::::::::::::::'         ``::::....:::           ::::::::::::'              ``::.````':.          ':::::::::'                  ::::..'.:::::'                    ':'````..'''# 长期来看是否可以买# 针对某个行业的股票listPeriod = [720,360,180,90,30,5]strIndustry = "'银行'"strEndDate ="DATE'"+(datetime.datetime.strptime(strNowDate, "%Y%m%d")).strftime('%Y-%m-%d')+"'"# 计算趋势中间表strSQLTruncate = "TRUNCATE TABLE TB_BT_MID_DAILY_PERIOD_TREND"dbConn.RunSQLOnce(strSQLTruncate)# 根据不同时间长度,如2年、1年、半年等计算股价升降for intCalPeriod in listPeriod:strSQLInsert ='''-- CREATE TABLE TB_BT_MID_DAILY_PERIOD_TREND asINSERT INTO TB_BT_MID_DAILY_PERIOD_TRENDWITH CHECK_STOCK_LIST AS (-- 获取行业对应的所有股票SELECTTS_CODE,NAME,INDUSTRY,EXCHANGEFROMTB_ALL_STOCK_LISTWHERE1=1AND INDUSTRY = '''+strIndustry+''')SELECT'''+str(intCalPeriod)+'''                                              AS DAY_GAP,'''+strEndDate+'''                                            AS END_DATE,S_L_O.TS_CODE,S_L_O.NAME,S_L_O.INDUSTRY,S_L_O.EXCHANGE,-- 获取整体的上升下降趋势,以及简单统计MIN(TTL_U.TRADE_DAY)                                    AS TRADE_DAY,MIN(TTL_U.MIN_COLSE)                                    AS MIN_COLSE,MIN(TTL_U.MAX_COLSE)                                    AS MAX_COLSE,MIN(TTL_U.MIN_PCT_CHG)                                  AS MIN_PCT_CHG,MIN(TTL_U.MAX_PCT_CHG)                                  AS MAX_PCT_CHG,MIN(TTL_U.DOWN_DAY)                                     AS DOWN_DAY,MIN(TTL_U.UP_DAY)                                       AS UP_DAY,-- 期间内的最早收盘价以及最终收盘价MIN(TTL_U.BEGIN_CLOSE)                                  AS BEGIN_CLOSE,MIN(TTL_U.END_CLOSE)                                    AS END_CLOSE,(MIN(TTL_U.END_CLOSE) / MIN(TTL_U.BEGIN_CLOSE) - 1)*100 AS ALL_PCT_CHG,-- 期间内涨跌的天数占比MIN(TTL_U.UP_DAY) / MIN(TTL_U.TRADE_DAY)                AS UP_DAY_PCT,MIN(TTL_U.DOWN_DAY) / MIN(TTL_U.TRADE_DAY)              AS DOWN_DAY_PCT,MIN(TTL_U.END_CLOSE_PCT_C)                              AS END_CLOSE_PCT_CFROM((-- 整体统计趋势SELECTS_DQ.TS_CODE,COUNT(1)            AS TRADE_DAY,MIN(S_DQ.CLOSE)     AS MIN_COLSE,MAX(S_DQ.CLOSE)     AS MAX_COLSE,MIN(S_DQ.PCT_CHG)   AS MIN_PCT_CHG,MAX(S_DQ.PCT_CHG)   AS MAX_PCT_CHG,COUNT(CASEWHEN S_DQ.PCT_CHG < 0 THEN 1ELSE NULLEND) AS DOWN_DAY,COUNT(CASEWHEN S_DQ.PCT_CHG > 0 THEN 1ELSE NULLEND) AS UP_DAY,NULL                AS BEGIN_CLOSE,NULL                AS END_CLOSE,NULL                AS END_CLOSE_PCT_CFROMTB_CALENDAR                                 S_TINNER JOIN TB_DAILY_STOCK_QUOTE             S_DQON S_T.TRADE_DATE   = S_DQ.TRADE_DATEINNER JOIN CHECK_STOCK_LIST                 S_LISTON S_DQ.TS_CODE     = S_LIST.TS_CODEWHERE1=1AND S_T.TRADE_DATE_DT   < '''+strEndDate+'''AND S_T.TRADE_DATE_DT   >= DATE_SUB('''+strEndDate+''', INTERVAL '''+str(intCalPeriod)+''' DAY)GROUP BYS_DQ.TS_CODE)UNION ALL(-- 计算时间窗口内最早那天的收盘价SELECTMIN_MID.TS_CODE,NULL                AS TRADE_DAY,NULL                AS MIN_COLSE,NULL                AS MAX_COLSE,NULL                AS MIN_PCT_CHG,NULL                AS MAX_PCT_CHG,NULL                AS DOWN_DAY,NULL                AS UP_DAY,MIN_MID.CLOSE       AS BEGIN_CLOSE,NULL                AS END_CLOSE,NULL                AS END_CLOSE_PCT_CFROM(SELECTS_DQ_MIN.TS_CODE,S_DQ_MIN.CLOSE,RANK() OVER(PARTITION BY S_DQ_MIN.TS_CODE ORDER BY S_T_MIN.TRADE_DATE_DT ASC)   AS RNKFROMTB_CALENDAR                                 S_T_MININNER JOIN TB_DAILY_STOCK_QUOTE             S_DQ_MINON S_T_MIN.TRADE_DATE   = S_DQ_MIN.TRADE_DATEINNER JOIN CHECK_STOCK_LIST                 S_LISTON S_DQ_MIN.TS_CODE     = S_LIST.TS_CODEWHERE1=1AND S_T_MIN.TRADE_DATE_DT   < '''+strEndDate+'''AND S_T_MIN.TRADE_DATE_DT   >= DATE_SUB('''+strEndDate+''', INTERVAL '''+str(intCalPeriod)+''' DAY)) MIN_MIDWHEREMIN_MID.RNK = 1)UNION ALL(-- 计算当前收盘价SELECTMAX_MID.TS_CODE,NULL                AS TRADE_DAY,NULL                AS MIN_COLSE,NULL                AS MAX_COLSE,NULL                AS MIN_PCT_CHG,NULL                AS MAX_PCT_CHG,NULL                AS DOWN_DAY,NULL                AS UP_DAY,NULL                AS BEGIN_CLOSE,MAX_MID.CLOSE       AS END_CLOSE,MAX_MID.PCT_CHG     AS END_CLOSE_PCT_CFROM(SELECTS_DQ_MAX.TS_CODE,S_DQ_MAX.CLOSE,S_DQ_MAX.PCT_CHG,RANK() OVER(PARTITION BY S_DQ_MAX.TS_CODE ORDER BY S_T_MAX.TRADE_DATE_DT DESC)   AS RNKFROMTB_CALENDAR                                 S_T_MAXINNER JOIN TB_DAILY_STOCK_QUOTE             S_DQ_MAXON S_T_MAX.TRADE_DATE   = S_DQ_MAX.TRADE_DATEINNER JOIN CHECK_STOCK_LIST                 S_LISTON S_DQ_MAX.TS_CODE     = S_LIST.TS_CODEWHERE1=1AND S_T_MAX.TRADE_DATE_DT   < '''+strEndDate+'''AND S_T_MAX.TRADE_DATE_DT   >= DATE_SUB('''+strEndDate+''', INTERVAL '''+str(intCalPeriod)+''' DAY)) MAX_MIDWHEREMAX_MID.RNK = 1)) TTL_UINNER JOIN CHECK_STOCK_LIST        S_L_OON TTL_U.TS_CODE    = S_L_O.TS_CODEGROUP BYS_L_O.TS_CODE,S_L_O.NAME,S_L_O.INDUSTRY,S_L_O.EXCHANGE'''dbConn.RunSQLOnce(strSQLInsert)# 计算趋势strSQLQuote = '''SELECTEND_DATE,TS_CODE,NAME,INDUSTRY,EXCHANGE,MIN(END_CLOSE)              AS END_CLOSE,MIN(CASEWHEN DAY_GAP = 720 THEN ALL_PCT_CHGELSE NULLEND) AS ALL_PCT_CHG_720,MIN(CASEWHEN DAY_GAP = 360 THEN ALL_PCT_CHGELSE NULLEND) AS ALL_PCT_CHG_360,MIN(CASEWHEN DAY_GAP = 180 THEN ALL_PCT_CHGELSE NULLEND) AS ALL_PCT_CHG_180,MIN(CASEWHEN DAY_GAP = 90 THEN ALL_PCT_CHGELSE NULLEND) AS ALL_PCT_CHG_90,MIN(CASEWHEN DAY_GAP = 30 THEN ALL_PCT_CHGELSE NULLEND) AS ALL_PCT_CHG_30,MIN(CASEWHEN DAY_GAP = 5 THEN ALL_PCT_CHGELSE NULLEND) AS ALL_PCT_CHG_5,MIN(CASEWHEN DAY_GAP = 720 THEN UP_DAY_PCTELSE NULLEND) AS UP_DAY_PCT_720,MIN(CASEWHEN DAY_GAP = 360 THEN UP_DAY_PCTELSE NULLEND) AS UP_DAY_PCT_360,MIN(CASEWHEN DAY_GAP = 180 THEN UP_DAY_PCTELSE NULLEND) AS UP_DAY_PCT_180,MIN(CASEWHEN DAY_GAP = 90 THEN UP_DAY_PCTELSE NULLEND) AS UP_DAY_PCT_90,MIN(CASEWHEN DAY_GAP = 30 THEN UP_DAY_PCTELSE NULLEND) AS UP_DAY_PCT_30,MIN(CASEWHEN DAY_GAP = 5 THEN UP_DAY_PCTELSE NULLEND) AS UP_DAY_PCT_5,MIN(END_CLOSE_PCT_C)        AS END_CLOSE_PCT_CFROMTB_BT_MID_DAILY_PERIOD_TRENDWHERE1=1AND END_DATE = '''+strEndDate+'''GROUP BYEND_DATE,TS_CODE,NAME,INDUSTRY,EXCHANGE'''listQuote = dbConn.ReturnSQLData(strSQLQuote)# 针对不同的股票,看整体趋势,再看买还是卖for listStockQuote in listQuote:# 买入条件# 1. 比两年前是上升的# 2. 比一年前是上升的# 3. 比一个月前上升更下降的区间在 ± 0.38% 内# 4. 比昨天上涨 0.1% 以上 0.5% 以下if listStockQuote[18] is not None and listStockQuote[6]>0 and listStockQuote[7]>0 and listStockQuote[10]<0.38 and listStockQuote[10]>-0.38 and listStockQuote[18]>0.1 and listStockQuote[18]<0.5:# 判断有没有持仓,有则不买strSQLSell = "SELECT * FROM tb_bt_daily_tmp_my_stock_pool WHERE stock_code='" + listStockQuote[1]+"' AND bt_ind = '"+str(btDaily.intInd)+"'"listSell = dbConn.ReturnSQLData(strSQLSell)if len(listSell) == 0 :btDaily.BuyStock(strNowDate, listStockQuote[1], 1000,'追涨')# 如果当前下跌 5% 则全卖出if listStockQuote[18] is not None and listStockQuote[18]<-0.5 :strSQLSell = "SELECT * FROM tb_bt_daily_tmp_my_stock_pool WHERE stock_code='" + listStockQuote[1]+"' AND bt_ind = '"+str(btDaily.intInd)+"'"listSell = dbConn.ReturnSQLData(strSQLSell)if len(listSell) > 0 and listSell[0][0] is not None:btDaily.SellStock(strNowDate, listStockQuote[1], listSell[0][2], '全部卖了!!!')# 打印快照
btDaily.AssetSnapshot(strMaxDate)

结果

不得不说,结果实在让人忧伤,我决定就不展示了

反正亏得裤衩都不剩了

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

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

相关文章

前端开发之el-select 设置默认值后选项无法切换

前端开发之el-select 设置默认值后选项无法切换 前言解决方案 前言 在实际使用过程中发现再给el-select设置默认值之后选项无法进行切换了 解决方案 为el-select添加 change“$forceUpdate()” 添加这个即可 <template><el-form-item label"数据类型"&g…

【题目】【信息安全管理与评估】2023年国赛信息安全管理与评估正式赛任务书-模块2

全国职业院校技能大赛高等职业教育组 信息安全管理与评估 任务书 模块二 信息安全管理与评估 网络系统管理 网络搭建与应用 云计算 软件测试 移动应用开发 竞赛任务书&#xff0c;赛题&#xff0c;解析&#xff0c;培训服务添加博主wx&#xff1a;liuliu5488233 网络安全事件…

speech to text 库FastASR交叉编译arm target的配置

FastASR是一个比较方便的SPEECH TO TEXT的AI库。开源。下面介绍下其在交叉编译到ARM target时候的交叉编译的cmake配置&#xff1a; cmake_minimum_required(VERSION 3.10)project(FastASR)SET(CMAKE_C_COMPILER "/home/xxx/buildroot/output/platform_name/host/bin/aar…

Flutter第六弹 基础列表ListView

目标&#xff1a; 1&#xff09;Flutter有哪些常用的列表组建 2&#xff09;怎么定制列表项Item&#xff1f; 一、ListView简介 使用标准的 ListView 构造方法非常适合只有少量数据的列表。我们还将使用内置的 ListTile widget 来给我们的条目提供可视化结构。ListView支持…

性能分析--内存知识

内存相关知识 计算机中与CPU进行数据交换的桥梁。内存的速度&#xff0c;比CPU的速度要慢很多。比磁盘速度要快很多。内存中存放数据&#xff0c;一旦断电就会消失。linux系统的 /proc路径下的文件&#xff0c;都是内存文件。内存大小&#xff0c;一般 是GB为单位。 现在都操作…

WebKit是什么?

WebKit是一个开源的浏览器引擎&#xff0c;它用于呈现网页内容在许多现代浏览器中&#xff0c;包括Safari浏览器、iOS内置浏览器、以及一些其他浏览器如Google Chrome的早期版本。以下是一些关于WebKit的重要信息&#xff1a; 起源和发展&#xff1a;WebKit最初是由苹果公司为其…

K8s学习四(资源调度_1)

资源调度 发现对Pod操作不方便&#xff0c;不能直接操作&#xff0c;而且不能直接编辑&#xff0c;需要对原来的配置文件进行操作&#xff0c;而且需要删除之后再创建Pod&#xff0c;不方便&#xff0c;更多是通过控制器来操作。 Label和Selector 通过设置标签和选择器来确定…

HTTP【超文本传输协议】和HTTPS【超文本传输安全协议】有什么区别?

文章目录 一、HTTP和HTTPS是什么&#xff1f;1、HTTP&#xff08;超文本传输协议&#xff09;2、HTTPS&#xff08;超文本传输安全协议&#xff09;3、HTTPS中加入的SSL/TLS层是什么&#xff1f; 二、HTTP和HTTPS的差异1、安全性2、URL表示3、端口4、证书5、性能6、浏览器显示 …

Python爬虫:为什么你爬取不到网页数据

目录 前言 一、网络请求被拒绝 二、数据是通过JavaScript加载的 三、需要进行登录 四、网站反爬虫策略 五、网站结构变更 总结 前言 作为一名开发者&#xff0c;使用Python编写爬虫程序是一项常见的任务。爬虫程序的目的是收集互联网上的数据&#xff0c;并将其保存或使…

P1616 疯狂的采药(完全背包问题)

题目&#xff1a;P1616 疯狂的采药 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<iostream> #include<algorithm> using namespace std; const int maxm 10010, maxt 10000010; long long v[maxm], t[maxm], f[maxt];//开longlong&#xff01; int m…

解决IDEA 控制台中文乱码

运行某个项目时IntelliJ IDEA 控制台中文乱码&#xff0c;但其他的项目是正常的。接口文档也显示乱码&#xff1a; 一、修改 IntelliJ IDEA 全局编码、项目编码、属性文件编码 上方导航栏“File→Settings…”进入配置页面&#xff0c;在“Editor”中下滑找到“File Encodings…

LeetCode 面试题 02.07.链表相交(判断两个结点是否相同)

给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结果后&#x…

Elasticsearch如何选择版本

不同版本的ES差异非常大&#xff0c;包括不局限于ES语法、架构、API、集群搭建等等。这些差异足以导致不同版本是否能满足你的业务场景以及后续开发维护成本等各种问题。 先说结论&#xff0c;以个人实践经验及综合考虑推荐使用 7.x 版本中的 7.10版本 ES版本对比 以下是通过…

内外网数据交换发展进程:安全与便捷并行

随着信息化的不断推进&#xff0c;医院、党政以及企业的内外网数据交换正成为日益关注的焦点。在保障数据安全的前提下&#xff0c;需要寻求一种既安全可靠又操作便捷的数据传输方式。本文将探讨内外网数据交换发展进程&#xff0c;分析各种传输方式的优缺点&#xff0c;以及它…

麒麟系统ARM安装rabbitmq

简单记录下&#xff0c;信创服务器&#xff1a;麒麟系统&#xff0c;安装rabbitmq的踩坑记录。 本文章参考了很多大佬文章&#xff0c;我整理后提供。 一、安装基础依赖 yum -y install make gcc gcc-c kernel-devel m4 ncurses-devel openssl-devel unixODBC-devel 二、下载…

k8s资源监控_bitnami metrics-server v0(1),2024一位Linux运维中级程序员的跳槽面经

错误3 也有可能会遇到以下错误&#xff0c;按照下面提示解决 Error from server (ServiceUnavailable): the server is currently unable to handle the request (get nodes.metrics.k8s.io) 如果metrics-server正常启动&#xff0c;没有错误&#xff0c;应该就是网络问题。修改…

花一分钟简单认识 CSS 中的规则 —— 级联层 @layer

layer 简介&#xff1a; 声明级联层时&#xff0c;越靠后优先级越高。不属于任何级联层的样式&#xff0c;将自成一层匿名级联层&#xff0c;并置于所有层之后 —— 级别最高。 用法一&#xff1a;在同一文件中 layer base, special; layer special {/* 优先 */li { color: …

Android查看SO库的依赖

➜ bin pwd /Users/xxx/Library/Android/sdk/ndk/21.1.6352462/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin ➜ bin ./aarch64-linux-android-readelf -d /Download/libxxx.so 0x0000000000000001 (NEEDED) Shared library: [liblog.so]0x…

Python学习笔记——heapq

堆排序 思路 堆排序思路是&#xff1a; 将数组以二叉树的形式分析&#xff0c;令根节点索引值为0&#xff0c;索引值为index的节点&#xff0c;子节点索引值分别为index*21、index*22&#xff1b;对二叉树进行维护&#xff0c;使得每个非叶子节点的值&#xff0c;都大于或者…

Day32|贪心算法part02:122.买卖股票的最佳时机II、55. 跳跃游戏、45. 跳跃游戏II

122. 买卖股票的最佳时机II 这题应该是dp的主菜&#xff0c;II的要求是可以无限次买无限次卖&#xff0c;可以用贪心做&#xff0c;想了下没想到思路&#xff0c;直接看题解。 贪心策略&#xff1a; 一直统计每次的差值&#xff0c;只要为负&#xff0c;不卖出&#xff0c;选…