A股数据day级前复权数据下载与存储

存储为3个文件夹:大盘数据、股票数据与概括文件

数据获取来源:股票数据来源于R中的WindR;大盘数据来源于python中的tushare(wind中指数似乎只有中证板块)

设置数据文件夹,代码中只需修改更新截止日期与工作路径,后面创建文件都无需手动操作

文件夹中文件不能随意变动,标红代码部分需要自己修改

股票数据中变量分别为股票代码、股票简称、日期、时间、开高低收(乘10000)、交易量、交易额、转手率(基于自由流通股本)、自由流通股本

初次获取数据

1、大盘指数数据(399001, 399005, 399006, 399300,999999)

## 初始设置
os.chdir("C:/Users/Administrator.USER-20161208UW/Desktop/数据") #修改当前工作目录
start_date = "2009-01-01"
end_date = "2017-12-20"

new_date = end_date.replace("-", "")
## 创建新文件夹
os.mkdir("ts大盘数据")
os.mkdir("ts大盘数据/大盘数据"+new_date)

## 概括信息
stock_info = pd.DataFrame({"stock.code":["399001", "399005", "399006", "399300", "999999"] ,
"stock.name":["深证成指", "中小板指", "创业板指", "沪深300", "上证指数"],
"type":["SZ", "SZ", "SZ", "SZ", "SH"]})
stock_info.to_csv("ts大盘数据/大盘数据"+new_date+"/stock_info.csv", index=False)

# 获取大盘信息
dapanzhishu1 = ["399001", "399005", "399006", "399300", "000001"]
dapanzhishu2 = ["399001", "399005", "399006", "399300", "999999"]
wind_code = ["399001.SZ", "399005SZ", "399006SZ", "399300SZ", "999999SH"]
name = ["深证成指", "中小板指", "创业板指", "沪深300", "上证指数"]
for i in list(range(5)):

df = ts.get_h_data(dapanzhishu1[i], start=start_date, end=end_date, index=True, pause=4)
df.sort_index(inplace=True)
df[["open", "high", "close", "low"]] = df[["open", "high", "close", "low"]]*10000
df["date"] = df.index
df["date"] = df["date"].astype(str).apply(lambda x:x.replace(‘-‘, ‘‘))
df.columns = [‘open‘,‘high‘, ‘close‘, ‘low‘, ‘volumw‘, ‘turover‘, ‘date‘]
df["name"] = name[i]
df["wind_code"] = wind_code[i]
df["time"] = 151500000
df["turn"] = 0
df["free_turn"] = 0
df = df[["wind_code", "name", "date", "time", "open", "high", ‘low‘, ‘close‘, ‘volumw‘, ‘turover‘, "turn", "free_turn"]]
df.to_csv("ts大盘数据/大盘数据"+new_date+"/"+dapanzhishu2[i]+".csv", index=False)

2、A股股票数据与概括文件

## Rlibrary(WindR)
library(xlsx)
library(data.table)
library(magrittr)
library(tcltk2)
setwd("C:/Users/~~~/Desktop/数据")

new.date <- "20171220"
start.date <- "20090101"

w.start()
end.date <- paste(substr(new.date, 1, 4), substr(new.date, 5, 6),
                  substr(new.date, 7, 8), sep = "-")
start.date <- paste(substr(start.date, 1, 4), substr(start.date, 5, 6),
                    substr(start.date, 7, 8), sep = "-")
## 摘取当日在市股票代码
stock.code.df <- w.wset(‘sectorconstituent‘,
                        paste0("date=", end.date, ";sectorid=a001010100000000"))
if(stock.code.df$ErrorCode == 0){
  stock.code.sh.sz <- stock.code.df$Data$wind_code
}else{
  print(paste0("获取数据出错,错误代码", stock.code.df$ErrorCode))
}
new.stock.code <- substr(stock.code.sh.sz, 1, 6)
# str(stock.code.sh.sz)

## 创建新的文件夹
dir.create("概括文件")
dir.create("股票数据")
dir.create(paste0("股票数据/股票数据", new.date))

## 补全stock.code的开始及截至日期及其他信息CSV文件
general.information <- data.frame(array(dim=c(length(stock.code.sh.sz), 5)))
colnames(general.information) <- c("stock.code", "stock.name", "type", "starttime", "endtime")

## 设置进度条
pb <- tkProgressBar("进度", "已完成 %", 0, 100) 

## 从WindR获取数据
## 未检查数据是否存在异常日期(大盘中没有的交易日)
w.start()
# i <- 1
for(i in 1:length(stock.code.sh.sz)){
  wind.data <- w.wsd(stock.code.sh.sz[i], "trade_code, sec_name, open, high, low, close, volume,
                                           amt, free_turn,free_float_shares",
                     start.date, end.date, "unit=1;PriceAdj=F")
  if(wind.data$ErrorCode == 0){
    wind.df <- data.frame(array(dim=c(nrow(wind.data$Data), 12)))
    colnames(wind.df) <- c("wind_code", "name", "date", "time", "open", "high", "low", "close",
                           "volumw", "turover", "free_turn", "free_float_shares")
    wind.df[, 1]    <- wind.data$Code
    wind.df[, 2]    <- wind.data$Data$SEC_NAME
    wind.df[, 3]    <- gsub("-", "", wind.data$Data$DATETIME)
    wind.df[, 4]    <- 151500000
    wind.df[, 5:8]  <- wind.data$Data[4:7] * 10000
    wind.df[, 9:12] <- wind.data$Data[8:11]
    wind.df <- wind.df[!(is.na(wind.df$open)), ]
    if(nrow(wind.df) == 0){
      print(c(i, stock.code[i]))
    }else{
      if(any(is.na(wind.df))){
        print(paste(stock.code.sh.sz[i], "数据出错(数据中仍有NA)"))
      }else{
        if(any(wind.df[, 5:8] == 0)){
          print(paste(stock.code.sh.sz[i], "数据出错(数据中开高低收存在0)"))
        }else{
          if(any(table(wind.df$date) > 1)){
            print(paste(stock.code.sh.sz[i], "数据出错(数据中存在日期相同)"))
          }else{
            if(any(wind.df$date != sort(wind.df$date))){
              print(paste(stock.code.sh.sz[i], "数据出错(数据中日期顺序不对)"))
            }else{
              general.information[i, 1] <- substr(stock.code.sh.sz[i], 1, 6)
              general.information[i, 2] <- wind.df$name[1]
              general.information[i, 3] <- substr(stock.code.sh.sz[i], 8, 9)
              general.information[i, 4] <- wind.df[1, 3]
              general.information[i, 5] <- wind.df[nrow(wind.df), 3]
              write.csv(wind.df, paste("股票数据/股票数据", new.date, "/", new.stock.code[i], ".csv", sep=""),
                        row.names = FALSE)
            }
          }
        }
      }
    }
  }else{
    print(paste0(stock.code.sh.sz[i], "股票获取数据出错,错误代码:", wind.data$ErrorCode))
    break
  }
  info <- sprintf("已完成 %d%%", round(i*100/length(stock.code.sh.sz)))
  setTkProgressBar(pb, i*100/length(stock.code.sh.sz), sprintf("进度 (%s)", info), info)
}

## 关闭进度条
close(pb)

## 总概括文件中无NA时输出
if(all(!(is.na(general.information)))){
  write.xlsx(general.information, paste0("概括文件/概括文件", new.date, ".xlsx"), row.names = FALSE)
}else{
  print("总概况文件中存在NA,需查验")
}

 3、文件格式

(1)一级

(2)二级

(3)三级

时间: 2024-10-25 06:23:31

A股数据day级前复权数据下载与存储的相关文章

A股数据日级前复权数据补全

根据上一篇下载的数据,现在每天更新day数据 需要保证股票当日新上市下载,退市保留,停牌复牌识别.是否发生复权(决定前复权价格是否变化) 数据更新 1.大盘指数数据(399001, 399005, 399006, 399300,999999) ## Pythonimport pandas as pd import numpy as np import tushare as ts import os import shutil os.getcwd() os.chdir("C:/Users/~~~/

ASP.NET MVC 表单提交多层子级实体集合数据到控制器中

于遇到了项目中实体类嵌套多层子级实体集合,并且子级实体集合的数据需要提交保存到数据库中的问题.针对此情况需要进行一些特殊的处理才可以将整个 实体类及子级实体集合数据提交表单到控制器中,解决的方法是根据MVC视图中表单的命名规则来设置正确的子级实体集合所属的表单控件name属性,从而来 获取提交的集合数据. 在说明如何将表单中实体的子级实体集合数据提交到控制器中的问题前,我们需要了解MVC的对于数组和列表集合的表单提交方式(点击此链接进行查看). 定义多层嵌套实体和假设场景 首先我们根据情况进行分

处理百万级以上的数据提高查询速度的方法

处理百万级以上的数据提高查询速度的方法: 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:     select id from t where num is null     可以在num上设置默认值0,确保表中num列没有

vue+mockjs 模拟数据,实现前后端分离开发

在项目中尝试了mockjs,mock数据,实现前后端分离开发. 关于mockjs,官网描述的是 1.前后端分离 2.不需要修改既有代码,就可以拦截 Ajax 请求,返回模拟的响应数据. 3.数据类型丰富 4.通过随机数据,模拟各种场景. 等等优点. 总结起来就是在后端接口没有开发完成之前,前端可以用已有的接口文档,在真实的请求上拦截ajax,并根据mockjs的mock数据的规则,模拟真实接口返回的数据,并将随机的模拟数据返回参与相应的数据交互处理,这样真正实现了前后台的分离开发. 与以往的自己

【springMVC】简单的前后端数据交流

最最常见两种,一则返回视图模板(文档),二则为json数据.就使用一个源代码文件来看看springmvc是怎么做到的. 1.UserController.java源代码文件 (这里额外的使用了fastjson架包来将对象解析为json) package com.zay; import com.alibaba.fastjson.JSON; import org.springframework.stereotype.Controller; import org.springframework.web

前后端数据交互方法

在此介绍几种常用的前后端数据交互方法,并给出使用建议.以提高前后端协同开发的效率. 此文章适合前后端协同开发经验不足的新手阅读. 目录: HTML赋值 JS赋值 script填充JSON AJAX获取JSON WebSocket实时传输数据 总结 HTML赋值 输出到 Element 的 value 或 data-name <input type="hidden" value="<?php echo $user_avatar;?>" /> &

处理千万级以上的数据提高查询速度的方法

处理千万级以上的数据提高查询速度的方法:1.应尽量避免在  where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描.2.对查询进行优化,应尽量避免全表扫描,首先应考虑在  where 及 order by 涉及的列上建立索引.3.应尽量避免在  where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:      select id from t where num is null      可以在num上设置默认值0,确保表中num列

kettle中访问前一行数据

 kettle中访问前一行数据 在kettle中,当需要访问数据流前一行数据时,很多人都是用javascript步骤的特性:实际上没有必要,不是说javascript步骤不好,主要是性能低,同时也增加了复杂度,因为写代码让javascript步骤难以理解,最好是使用kettle标准步骤实现.我们的原则是代码最小化,过程轻松. (The Analytic Query Step)分析查询步骤 TheAnalytic Query 步骤可以查找数据流中的前面行或后面行,并且取值到当前行,很多场合是非

Session(数据)共享的前后端分离Shiro实战

1,前言 本文期望描述如何使用Shiro构建基本的安全登录和权限验证.本文实战场景有如下特殊需求:1,在集群和分布式环境实现session共享:2,前端只使用HTML/CSS/JS.因此无法直接使用Shiro提供的SessionManager,以及Shiro针对web应用提供的Filter拦截方式.当然,除非是一定要通过共享缓存的方式共享session,否则还是使用Shiro默认的session管理,毕竟增加独立缓存就意味着维护成本的提高和可用性的下降. 2, Shiro架构 首先一睹官方给出的