1. # -*- coding: utf-8 -*-
  2.  
  3. import os
  4. import pandas as pd
  5.  
  6. # ========== 遍历数据文件夹中所有股票文件的文件名,得到股票代码列表stock_code_list
  7. stock_code_list = []
  8. for root, dirs, files in os.walk('all_stock_data'):# 注意:这里请填写数据文件在您电脑中的路径
  9. if files:
  10. for f in files:
  11. if '.csv' in f:
  12. stock_code_list.append(f.split('.csv')[0])
  13.  
  14. # ========== 根据上一步得到的代码列表,遍历所有股票,将这些股票合并到一张表格all_stock中
  15. all_stock = pd.DataFrame()
  16. # 遍历每个创业板的股票
  17. for code in stock_code_list:
  18. print(code)
  19.  
  20. # 从csv文件中读取该股票数据
  21. stock_data = pd.read_csv('all_stock_data/' + code + '.csv',
  22. parse_dates=[1],encoding='gbk')
  23. stock_data.sort_values('日期', inplace=True)
  24.  
  25. # 计算KDJ指标
  26. low_list=stock_data['最低价'].rolling(window=9).min()
  27. low_list.fillna(value=stock_data['最低价'].expanding().min(), inplace=True)
  28. high_list = stock_data['最高价'].rolling(window=9).max()
  29. high_list.fillna(value=stock_data['最高价'].expanding().max(), inplace=True)
  30.  
  31. rsv = (stock_data['收盘价'] - low_list) / (high_list - low_list) * 100
  32. stock_data['KDJ_K'] = rsv.ewm(com=2).mean()
  33. stock_data['KDJ_D'] = stock_data['KDJ_K'].ewm(com=2).mean()
  34. stock_data['KDJ_J'] = 3 * stock_data['KDJ_K'] - 2 * stock_data['KDJ_D']
  35.  
  36. # 计算KDJ指标金叉、死叉情况
  37. stock_data['KDJ_金叉死叉'] = ''
  38. kdj_position = stock_data['KDJ_J'] > 0
  39. p2 = stock_data['成交量'] < stock_data['成交量'].shift()#shift()表示昨天如果按早到晚排序,参数为正,表示前些天,参数为负,表现后些天
  40. stock_data.loc[kdj_position[(kdj_position == True) & (kdj_position.shift() == False)&p2==True].index, 'KDJ_金叉死叉'] = '金叉'
  41. stock_data.loc[kdj_position[(kdj_position == False) & (kdj_position.shift() == True)].index, 'KDJ_金叉死叉'] = '死叉'
  42.  
  43. # 计算接下来几个交易日的收益率
  44. for n in [1, 2, 3, 5, 10, 20]:
  45. stock_data['接下来'+str(n)+'个交易日涨跌幅'] = stock_data['收盘价'].shift(-1*n) / stock_data['收盘价'] - 1.0
  46.  
  47. # 删除所有有空值的数据行
  48. stock_data.dropna(how='any', inplace=True)
  49. # 筛选出KDJ金叉的数据,并将这些数据合并到all_stock中
  50. stock_data = stock_data[(stock_data['KDJ_金叉死叉'] == '金叉')]
  51. if stock_data.empty:
  52. continue
  53. all_stock = all_stock.append(stock_data, ignore_index=True)
  54.  
  55. # ========== 根据上一步得到的所有股票KDJ金叉数据all_stock,统计这些股票在未来交易日中的收益情况
  56. #print
  57. print('历史上所有股票出现KDJ金叉的次数为%d,这些股票在:' %all_stock.shape[0])
  58. #print
  59.  
  60. for n in [1, 2, 3, 5, 10, 20]:
  61. print("金叉之后的%d个交易日内," % n)
  62. print("平均涨幅为%.2f%%," % (all_stock['接下来'+str(n)+'个交易日涨跌幅'].mean() * 100))
  63. print("其中上涨股票的比例是%.2f%%。" % \
  64. (all_stock[all_stock['接下来'+str(n)+'个交易日涨跌幅'] > 0].shape[0]/float(all_stock.shape[0]) * 100))
  65. #print

KDJ回测的更多相关文章

  1. 用Python编写的第一个回测程序

    用Python编写的第一个回测程序 2016-08-06 def savfig(figureObj, fn_prefix1='backtest8', fn_prefix2='_1_'): import ...

  2. WeQuant比特币交易策略回测记录

    程序参数 PARAMS = { "start_time": "2017-02-01 00:00:00", "end_time": " ...

  3. 量化投资:第8节 A股市场的回测

    作者: 阿布 阿布量化版权所有 未经允许 禁止转载 abu量化系统github地址(欢迎+star) 本节ipython notebook 之前的小节回测示例都是使用美股,本节示例A股市场的回测. 买 ...

  4. 量化框架zipline--分钟回测改写

    转自:http://www.cnblogs.com/dxf813/p/7845398.html 基于zipline的分钟回测改写,其中数据源为自定义,使用bcolz的ctable,该数据格式与pand ...

  5. VNPY回测流程

    又是好久没更新了,2月这一个月,工作上也忙,正好也是过年.加上前一段时间,一直在爬取某眼查的数据. 对VNPY的使用时间就减少了,不过最近还是完成了vnpy回测结构的思维导图.如下: 值得注意的是,v ...

  6. 量化投资策略:常见的几种Python回测框架(库)

    量化投资策略:常见的几种Python回测框架(库) 原文地址:http://blog.csdn.net/lawme/article/details/51454237 本文章为转载文章.这段时间在研究量 ...

  7. 回测框架pybacktest简介(一)

    pybacktest 教程 本教程让你快速了解 pybacktest's 的功能.为此,我们回测精典交易策略移动平均线MA交叉. MA快线上穿慢线时,买进做多 MA快线下穿慢线时,卖出做空 进场规则, ...

  8. 回测框架pybacktest简介(二)

    pybacktest 的疑点 第(一)节“教程”原文,是用 ipython notebook 写成,程序代码是一些片段组成. 为了阅读方便,合并在一起. 本文转载于:http://blog.csdn. ...

  9. OnePy--构建属于自己的量化回测框架

    本文主要记录我构建量化回测系统的学习历程. 被遗弃的项目:Chandlercjy/OnePy_Old 新更新中的项目:Chandlercjy/OnePy 目录 1. 那究竟应该学习哪种编程语言比较好呢 ...

随机推荐

  1. DFS(3)——poj1321棋盘问题

    一.题目回顾 题目链接:棋盘问题 Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于 ...

  2. 软工实践 - 第二十三次作业 Beta 冲刺(1/7)

    队名:起床一起肝活队 组长博客:https://www.cnblogs.com/dawnduck/p/10093337.html 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过 ...

  3. Performanced C++ 经验规则

    http://www.cnblogs.com/ccdev/archive/2012/12/27/2836448.html Performanced C++,意为“高性能C++“编程,是笔者和所在团队多 ...

  4. FileReader 获取图片BASE64 代码 并预览

    FileReader 获取图片的base64 代码 并预览 FileReader ,老实说我也不怎么熟悉.在这里只是记录使用方法. 方法名 参数 描述 abort none 中断读取 readAsBi ...

  5. 在delphi中如何解决空格的问题。。。。烦死 了。。。。

    我每次从数据库里面取数据出来和Edit里面的进行比较的时候总是会受到空格的困扰...老是干扰我...如果我用trim 所有都做去掉所有的空格那么这样就非常麻烦又繁琐..有没有什么方法可以忽略空格的.. ...

  6. [LINUX]警告:检测到时钟错误。您的创建可能是不完整的。

    [LINUX]警告:检测到时钟错误.您的创建可能是不完整的.   原因:     如果上一次编译时为20071001,你把系统时间改成20070901后再编译就会报这样的错误. 解决:     把时间 ...

  7. 【模拟赛·polyline】

    Input file: polyline.in Output file: polyline.out Time limit: 1s Memory limit: 128M 有若⼲个类似于下⾯的函数: 定义 ...

  8. 如何在Javascript中利用封装这个特性

    对于熟悉C#和Java的兄弟们,面向对象的三大思想(封装,继承,多态)肯定是了解的,那么如何在Javascript中利用封装这个特性呢? 我们会把现实中的一些事物抽象成一个Class并且把事物的属性( ...

  9. P2764 最小路径覆盖问题

    题目描述 «问题描述: 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖.P 中路径可以从V 的任何一个顶点开 ...

  10. DOM读取和修改节点对象属性

    一.获取和修改元素间的内容(3种) 1.innerHTML 获得/设置元素开始标签和结束标签之间的html原文 固定套路:1.删除父元素下所有子元素:parent.innerHTML="&q ...