admin 管理员组

文章数量: 887018

今天带给大家的是从新浪和腾讯爬取股票数据,主要是因为新浪和腾讯的股票数据存储在js中,不需要再重新解析网页源码方便很多。

今天我们要实现的股票爬取设计内容丰富,包括:

1、一个股票数据(沪深)爬虫和选股策略测试框架,数据基于腾讯L和新浪财经。

2、爬取所有沪深两市股票的行情数据,可选择时分线、日k线、周K线、月K线、股票最新行情。

3、根据指定的选股策略和指定的日期进行选股测试。

4、计算选股测试实际结果(包括与沪深300指数比较)。

5、 保存数据到JSON文件、CSV文件。

6、支持使用表达式定义选股策略。

7、支持多线程处理。

使用环境python3.6

option.py

首先是参数定义部分option.py,这一部分用于控制代码的运行,主要包括,是否下载数据,是否进行测试,文件保存格式,文件的字符编码、测试的时间范围、抓起的时间起点、抓取的时间终点、股票数据保存路径、线程数目、选股策略文件路径(UTF8编码)、选股策略的数据库名称(不用数据库可以不用关心)、策略表达式(也可以将策略表达式放在文件中)

#coding:utf-8

#爬虫参数配置

import argparse

import datetime

#获取偏移指定天数的时间表达式

def get_date_str(offset):

if(offset is None):

offset = 0

date_str = (datetime.datetime.today() + datetime.timedelta(days=offset)).strftime("%Y%m%d")

return date_str

_default = dict(

reload_data = 'Y', # --reload {Y,N} 是否重新抓取股票数据,默认值:Y

gen_portfolio = 'Y', # --portfolio {Y,N} 是否生成选股测试结果,默认值:N

output_type = 'json', # --output {json,csv,all} 输出文件格式,默认值:json

charset = 'utf-8', # --charset {utf-8,gbk} 输出文件编码,默认值:utf-8

test_date_range = 60, # --testrange NUM 测试日期范围天数,默认值:50

start_date = get_date_str(-90), # --startdate yyyy-MM-dd 抓取数据的开始日期,默认值:当前系统日期-100天(例如2015-01-01)

end_date = get_date_str(None), # --enddate yyyy-MM-dd 抓取数据的结束日期,默认值:当前系统日期

target_date = get_date_str(None), # --targetdate yyyy-MM-dd 测试选股策略的目标日期,默认值:当前系统日期

store_path = 'stockholm_export', # --storepath PATH 输出文件路径,默认值:stockholm_export

thread = 10, # --thread NUM 线程数,默认值:10

testfile_path = './portfolio_test.txt',# --testfile PATH 选股策略文件路径,默认值:./portfolio_test.txt

db_name = 'stockholm', #选股策略数据库名称

methods = '' #选股策略表达式

)

parser = argparse.ArgumentParser(description='A stock crawler and portfolio testing framework.')

parser.add_argument('--reload', type=str, default=_default['reload_data'], dest='reload_data', help='Reload the stock data or not (Y/N), Default: %s' % _default['reload_data'])

parser.add_argument('--portfolio', type=str, default=_default['gen_portfolio'], dest='gen_portfolio', help='Generate the portfolio or not (Y/N), Default: %s' % _default['gen_portfolio'])

parser.add_argument('--output', type=str, default=_default['output_type'], dest='output_type', help='Data output type (json/csv/all), Default: %s' % _default['output_type'])

parser.add_argument('--charset', type=str, default=_default['charset'], dest='charset', help='Data output charset (utf-8/gbk), Default: %s' % _default['charset'])

parser.add_argument('--testrange', type=int, default=_default['test_date_range'], dest='test_date_range', help='Test date range(days): %s' % _default['test_date_range'])

parser.add_argument('--startdate', type=str, default=_default['start_date'], dest='start_date', help='Data loading start date, Default: %s' % _default['start_date'])

parser.add_argument('--enddate', type=str, default=_default['end_date'], dest='end_date', help='Data loading end date, Default: %s' % _default['end_date'])

parser.add_argument('--targetdate', type=str, default=_default['target_date'], dest='target_date', help='Portfolio generating target date, Default: %s' % _default['target_date'])

parser.add_argument('--storepath', type=str, default=_default['store_path'], dest='store_path', help='Data file store path, Default: %s' % _default['store_path'])

parser.add_argument('--thread', type=int, default=_default['thread'], dest='thread', help='Thread number, Default: %s' % _default['thread'])

parser.add_argument('--testfile', type=str, default=_default['testfile_path'], dest='testfile_path', help='Portfolio test file path, Default: %s' % _default['testfile_path'])

parser.add_argument('--dbname', type=str, default=_default['db_name'], dest='db_name', help='MongoDB DB name, Default: %s' % _default['db_name'])

parser.add_argument('--methods', type=str, default=_default['methods'], dest='methods', help='Target methods for back testing, Default: %s' % _default['methods'])

def main():

args = parser.parse_args()

print(args)

if __name__ == '__main__':

main()

股票数据爬取、测试,存储、读取等全部主要功能程序stockholm.py

#coding:utf-8

import requests

import json

import datetime

import timeit

import time

import io

import os

import csv

import re

from pymongo import MongoClient

from multiprocessing.dummy import Pool as ThreadPool

from functools import partial

class Stockholm(object):

def __init__(self, args):

## --reload {Y,N} 是否重新抓取股票数据,默认值:Y

self.reload_data = args.reload_data

## --portfolio {Y,N} 是否生成选股测试结果,默认值:N

self.gen_portfolio = args.gen_portfolio

## --output {json,csv,all} 输出文件格式,默认值:json

self.output_type = args.output_type

## --charset {utf-8,gbk} 输出文件编码,默认值:utf-8

self.charset = args.charset

## --testrange NUM 测试日期范围天数,默认值:50

self.test_date_range = args.test_date_range

## --startdate yyyy-MM-dd 抓取数据的开始日期,默认值:当前系统日期-100天(例如2015-01-01)

self.start_date = args.start_date

## --enddate yyyy-MM-dd 抓取数据的结束日期,默认值:当前系统日期

self.end_date = args.end_date

## --targetdate yyyy-MM-dd 测试选股策略的目标日期,默认值:当前系统日期

self.target_date = args.target_date

## --thread NUM 线程数,默认值:10

self.thread = args.thread

## --storepath PATH 输出文件路径,默认值࿱

本文标签: 新浪 股票 爬虫 腾讯 数据采集