# -*- coding: utf-8 -*-
import tushare as ts
from jqdatasdk import *
import pandas as pd
import requests
import json
import pymysql
from redis import Redis
from multiprocessing import Pool
import time
import datetime
from retry import retry
import warnings
warnings.filterwarnings('ignore')
# -------------------------------------------------------------------------------------------------------------
# mysql数据录入
def table_insert(dataframe, table, data):
conn = pymysql.connect(host='localhost', user='root', passwd='123456', port=3306, db='quant', charset='utf8mb4')
cursor = conn.cursor()
keys = ','.join(dataframe.columns.tolist())
values = ','.join(['%s'] * len(dataframe.columns.tolist()))
sql = 'insert into {table}({keys}) VALUES({values})'.format(table=table, keys=keys, values=values)
try:
if cursor.executemany(sql, data):
print('insert successful')
conn.commit()
except Exception as error:
print('insert failed')
print(error)
conn.rollback()
conn.close()
# -------------------------------------------------------------------------------------------------------------
# tushare:股票列表
# @retry(tries=-1, delay=5)
def stock_list():
print('stock_list函数开始执行')
# 1、接口数据请求
stock = pro.stock_basic(list_status='L', fields='ts_code,name,area,industry,market,exchange,list_date')
stock = stock.rename(columns={'ts_code': 'stk_code', 'name': 'stk_name', 'area': 'province'})
stock['stk_code'] = stock['stk_code'].apply(lambda x: x[:6])
stock['province'] = stock['province'].apply(lambda x: x.replace('深圳', '广东'))
stock['province'] = stock['province'].apply(lambda x: x.replace('内蒙', '内蒙古'))
stock['exchange'] = stock['exchange'].apply(lambda x: x.replace('SSE', '沪'))
stock['exchange'] = stock['exchange'].apply(lambda x: x.replace('SZSE', '深'))
stock = stock[['stk_code', 'stk_name', 'province', 'industry', 'market', 'exchange', 'list_date']]
print(stock.head(5))
stock_list = stock['stk_code'].tolist()
# 2、接口数据解析
stock_data = []
for index, row in stock.iterrows():
stock_data.append((row['stk_code'], row['stk_name'], row['province'], row['industry'], row['market'], row['exchange'], row['list_date']))
# 3、接口数据mysql存储
table_insert(stock, 'stock_info', stock_data)
return stock_list
# -------------------------------------------------------------------------------------------------------------
# tushare:概念股分类数据
# @retry(tries=-1, delay=5)
def concept_classify():
print('concept_classify函数开始执行')
cept_classify = pro.concept(fields='code,name')
cept_id = []
for index, row in cept_classify.iterrows():
cept_id.append(row['code'])
return cept_id
# -------------------------------------------------------------------------------------------------------------
# tushare:概念明细
# @retry(tries=-1, delay=5)
def concept_detail(cept_id):
print('concept_detail函数开始执行')
cept_detail = pd.DataFrame()
for id in cept_id:
cept = pro.concept_detail(id=id, fields='concept_name,ts_code,name')
cept_detail = cept_detail.append(cept, ignore_index=True)
time.sleep(1)
cept_detail = cept_detail.rename(columns={'ts_code': 'stk_code', 'name': 'stk_name', 'concept_name': 'concept'})
cept_detail['stk_code'] = cept_detail['stk_code'].apply(lambda x: x[:6])
cept_detail = cept_detail[['stk_code', 'stk_name', 'concept']]
print(cept_detail.head(5))
cept_detail_data = []
for index, row in cept_detail.iterrows():
cept_detail_data.append((row['stk_code'], row['stk_name'], row['concept']))
table_insert(cept_detail, 'concept_info', cept_detail_data)
# -------------------------------------------------------------------------------------------------------------
# tushare:上证指数
# @retry(tries=-1, delay=5)
def sz_index_info():
print('sz_index_info函数开始执行')
sz_index = pro.index_daily(ts_code='000001.SH', trade_date=current, fields='trade_date,close,open,high,low,pre_close,pct_chg,amount')
sz_index = sz_index.rename(columns={'open': 'cur_open', 'close': 'cur_close'})
sz_index['cur_open'] = sz_index['cur_open'].apply(lambda x: round(x, 2))
sz_index['high'] = sz_index['high'].apply(lambda x: round(x, 2))
sz_index['low'] = sz_index['low'].apply(lambda x: round(x, 2))
sz_index['cur_close'] = sz_index['cur_close'].apply(lambda x: round(x, 2))
sz_index['pre_close'] = sz_index['pre_close'].apply(lambda x: round(x, 2))
sz_index['pct_chg'] = sz_index['pct_chg'].apply(lambda x: round(x, 2))
sz_index['amount'] = sz_index['amount'].apply(lambda x: round(x / 10), 2)
sz_index = sz_index[['trade_date', 'cur_open', 'high', 'low', 'cur_close', 'pre_close', 'pct_chg', 'amount']]
print(sz_index.head(5))
sz_index_data = []
for index, row in sz_index.iterrows():
sz_index_data.append((row['trade_date'], row['cur_open'], row['high'], row['low'], row['cur_close'], row['pre_close'], row['pct_chg'], row['amount']))
table_insert(sz_index, 'sz_index', sz_index_data)
# -------------------------------------------------------------------------------------------------------------
# tushare:银行拆借利率
# @retry(tries=-1, delay=5)
def on_shibor_rate():
print('on_shibor_rate函数开始执行')
shibor = pro.shibor(date=current, fields='date,on')
shibor = shibor.rename(columns={'date': 'trade_date', 'on': 'on_shibor'})
shibor['on_shibor'] = shibor['on_shibor'].apply(lambda x: round(x, 2))
shibor = shibor[['trade_date', 'on_shibor']]
print(shibor.head(5))
shibor_data = []
for index, row in shibor.iterrows():
shibor_data.append((row['trade_date'], row['on_shibor']))
table_insert(shibor, 'shibor_rate', shibor_data)
# -------------------------------------------------------------------------------------------------------------
# tushare:沪深股通汇总
# @retry(tries=-1, delay=5)
def hsgt_total():
print('hsgt_total函数开始执行')
hsgt = pro.moneyflow_hsgt(trade_date=current, fields='trade_date,hgt,sgt,north_money')
hsgt.fillna(0, inplace=True)
hsgt['hgt'] = hsgt['hgt'].apply(lambda x: round(x * 100, 1))
hsgt['sgt'] = hsgt['sgt'].apply(lambda x: round(x * 100, 1))
hsgt['north_money'] = hsgt['north_money'].apply(lambda x: round(x * 100, 1))
hsgt = hsgt[['trade_date', 'hgt', 'sgt', 'north_money']]
print(hsgt.head(5))
hsgt_data = []
for index, row in hsgt.iterrows():
hsgt_data.append((row['trade_date'], row['hgt'], row['sgt'], row['north_money']))
table_insert(hsgt, 'hsgt_fund', hsgt_data)
# -------------------------------------------------------------------------------------------------------------
# tushare:沪深股通买入前十
# @retry(tries=-1, delay=5)
def hsgt_top_detail():
print('hsgt_top_detail函数开始执行')
hsgt_top_detail = pd.DataFrame()
for offset in range(0, 6000, 3000):
data_1 = pro.hsgt_top10(trade_date=current, fields='trade_date,ts_code,amount,buy,sell', offset=offset, limit=3000)
hsgt_top_detail = hsgt_top_detail.append(data_1, ignore_index=True)
hsgt_top_detail = hsgt_top_detail.rename(columns={'ts_code': 'stk_code'})
hsgt_top_detail['stk_code'] = hsgt_top_detail['stk_code'].apply(lambda x: x[:6])
hsgt_top_detail['amount'] = hsgt_top_detail['amount'].apply(lambda x: round(x / 10000, 2))
hsgt_top_detail['buy'] = hsgt_top_detail['buy'].apply(lambda x: round(x / 10000, 2))
hsgt_top_detail['sell'] = hsgt_top_detail['sell'].apply(lambda x: round(x / 10000, 2))
hsgt_top_detail = hsgt_top_detail[['trade_date', 'stk_code', 'amount', 'buy', 'sell']]
print(hsgt_top_detail.head(5))
# 2、接口数据解析
hsgt_top_detail_data = []
for index, row in hsgt_top_detail.iterrows():
hsgt_top_detail_data.append((row['trade_date'], row['stk_code'], row['amount'], row['buy'], row['sell']))
table_insert(hsgt_top_detail, 'hsgt_top_detail', hsgt_top_detail_data)
# -------------------------------------------------------------------------------------------------------------
# tushare:日线行情、基础指标、涨跌停价格
# @retry(tries=-1, delay=5)
def stock_daily():
print('stock_daily函数开始执行')
frame_1 = pd.DataFrame()
for offset in range(0, 6000, 3000):
data_1 = pro.daily(trade_date=current, fields='ts_code,trade_date,open,high,low,close,pre_close,pct_chg,amount', offset=offset, limit=3000)
frame_1 = frame_1.append(data_1, ignore_index=True)
frame_2 = pd.DataFrame()
for offset in range(0, 6000, 3000):
data_2 = pro.daily_basic(trade_date=current, fields='ts_code,trade_date,turnover_rate_f,volume_ratio,pe_ttm,total_share,float_share', offset=offset, limit=3000)
frame_2 = frame_2.append(data_2, ignore_index=True)
frame_3 = pd.DataFrame()
for offset in range(0, 6000, 3000):
data_3 = pro.stk_limit(trade_date=current, fields='trade_date,ts_code,up_limit,down_limit', offset=offset, limit=3000)
frame_3 = frame_3.append(data_3, ignore_index=True)
# 连接list_1、list_2、list_3
frame_4 = pd.merge(frame_1, frame_2, how='left', on=['ts_code', 'trade_date'])
stock_daily = pd.merge(frame_4, frame_3, how='left', on=['ts_code', 'trade_date'])
stock_daily = stock_daily.rename(columns={'ts_code': 'stk_code', 'open': 'cur_open', 'close': 'cur_close', 'turnover_rate_f': 'change_hands'})
stock_daily.fillna(0, inplace=True)
stock_daily['stk_code'] = stock_daily['stk_code'].apply(lambda x: x[:6])
stock_daily['cur_open'] = stock_daily['cur_open'].apply(lambda x: round(x, 2))
stock_daily['high'] = stock_daily['high'].apply(lambda x: round(x, 2))
stock_daily['low'] = stock_daily['low'].apply(lambda x: round(x, 2))
stock_daily['cur_close'] = stock_daily['cur_close'].apply(lambda x: round(x, 2))
stock_daily['pre_close'] = stock_daily['pre_close'].apply(lambda x: round(x, 2))
stock_daily['pct_chg'] = stock_daily['pct_chg'].apply(lambda x: round(x, 2))
stock_daily['amount'] = stock_daily['amount'].apply(lambda x: round(x / 10), 2)
stock_daily['change_hands'] = stock_daily['change_hands'].apply(lambda x: round(x, 2))
stock_daily['volume_ratio'] = stock_daily['volume_ratio'].apply(lambda x: round(x, 2))
stock_daily['pe_ttm'] = stock_daily['pe_ttm'].apply(lambda x: round(x, 2))
stock_daily['total_share'] = stock_daily['total_share'].apply(lambda x: round(x, 2))
stock_daily['float_share'] = stock_daily['float_share'].apply(lambda x: round(x, 2))
stock_daily['up_limit'] = stock_daily['up_limit'].apply(lambda x: round(x, 2))
stock_daily['down_limit'] = stock_daily['down_limit'].apply(lambda x: round(x, 2))
stock_daily = stock_daily[['trade_date', 'stk_code', 'cur_open', 'high', 'low', 'cur_close', 'pre_close', 'pct_chg', 'amount', 'change_hands', 'volume_ratio', 'pe_ttm', 'total_share', 'float_share', 'up_limit', 'down_limit']]
print(stock_daily.head(5))
stock_daily_data = []
for index, row in stock_daily.iterrows():
stock_daily_data.append((row['trade_date'], row['stk_code'], row['cur_open'], row['high'], row['low'], row['cur_close'], row['pre_close'], row['pct_chg'],
row['amount'], row['change_hands'], row['volume_ratio'], row['pe_ttm'], row['total_share'], row['float_share'], row['up_limit'], row['down_limit']))
table_insert(stock_daily, 'stock_daily', stock_daily_data)
# -------------------------------------------------------------------------------------------------------------
# tushare:市场情绪数据计算
def scqx_detail(stock_daily):
print('scqx_detail函数开始执行')
company = 0 # 公司家数
up = 0 # 上涨家数
down = 0 # 下跌家数
up_limit = 0 # 涨停家数
down_limit = 0 # 跌停家数
zr_up_limit = 0 # 自然涨停家数
zr_down_limit = 0 # 自然跌停家数
up_d5 = 0 # 涨幅大于5%家数
down_d5 = 0 # 跌幅大于5%家数
high_open = 0 # 大幅高开家数4%
low_open = 0 # 大幅低开家数4%
zbs = 0 # 炸板
czt = 0 # 曾涨停
# 1、市场情绪数据计算
for index, row in stock_daily.iterrows():
company += 1
if row['pct_chg'] >= 0:
up += 1
if row['pct_chg'] < 0:
down += 1
if row['cur_close'] == row['up_limit']:
up_limit += 1
if row['cur_close'] == row['down_limit']:
down_limit += 1
if row['cur_close'] == row['up_limit'] and row['cur_open'] != row['up_limit']:
zr_up_limit += 1
if row['cur_close'] == row['down_limit'] and row['cur_open'] != row['down_limit']:
zr_down_limit += 1
if row['pct_chg'] >= 5:
up_d5 += 1
if row['pct_chg'] <= -5:
down_d5 += 1
if row['cur_open'] / row['pre_close'] > 1.04:
high_open += 1
if row['pre_close'] / row['cur_open'] > 1.04:
low_open += 1
if row['high'] == row['up_limit'] and row['cur_close'] != row['up_limit']:
zbs += 1
if row['high'] == row['up_limit']:
czt += 1
print(current, company, up, down, up_limit, down_limit, zr_up_limit, zr_down_limit, up_d5, down_d5, high_open, low_open, zbs, czt)
# 2、数据存储
conn = conn = pymysql.connect(host='localhost', user='root', passwd='123456', db='quant', charset='utf8mb4')
cursor = conn.cursor()
try:
szqx_sql = '''insert ignore into market_sentiment(trade_date,company,up,down,up_limit,down_limit,zr_up_limit,zr_down_limit,up_d5,down_d5,high_open,low_open,zbs,czt)
values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)''' % (current, company, up, down, up_limit, down_limit, zr_up_limit, zr_down_limit, up_d5, down_d5, high_open, low_open, zbs, czt)
cursor.execute(szqx_sql)
except Exception as error:
print('insert failed')
print(error)
conn.rollback()
else:
print('insert successful')
conn.commit()
cursor.close()
conn.close()
# -------------------------------------------------------------------------------------------------------------
# tushare:大单资金
# @retry(tries=-1, delay=5)
def big_moneyflow():
print('big_moneyflow函数开始执行')
big_money = pd.DataFrame()
for offset in range(0, 6000, 3000):
data_1 = pro.moneyflow(trade_date=current, fields='ts_code,trade_date,buy_lg_amount,sell_lg_amount,buy_elg_amount,sell_elg_amount', offset=offset, limit=3000)
big_money = big_money.append(data_1, ignore_index=True)
big_money = big_money.rename(columns={'ts_code': 'stk_code'})
big_money['stk_code'] = big_money['stk_code'].apply(lambda x: x[:6])
big_money = big_money[['trade_date', 'stk_code', 'buy_lg_amount', 'sell_lg_amount', 'buy_elg_amount', 'sell_elg_amount']]
print(big_money.head(5))
big_money_data = []
for index, row in big_money.iterrows():
big_money_data.append((row['trade_date'], row['stk_code'], row['buy_lg_amount'], row['sell_lg_amount'], row['buy_elg_amount'], row['sell_elg_amount']))
table_insert(big_money, 'big_moneyflow', big_money_data)
# -------------------------------------------------------------------------------------------------------------
# tushare:涨停统计,单词最多请求1000条
# @retry(tries=-1, delay=5)
def up_down_limit_detail():
print('up_down_limit_detail函数开始执行')
up_down_limit = pd.DataFrame()
for offset in range(0, 2000, 1000):
data_1 = pro.limit_list(trade_date=current, fields='trade_date,ts_code,fd_amount,first_time,last_time,open_times,strth,limit', offset=offset, limit=1000)
up_down_limit = up_down_limit.append(data_1, ignore_index=True)
up_down_limit = up_down_limit.rename(columns={'ts_code': 'stk_code', 'limit': 'ud_limit'})
up_down_limit['stk_code'] = up_down_limit['stk_code'].apply(lambda x: x[:6])
up_down_limit['fd_amount'] = up_down_limit['fd_amount'].apply(lambda x: round(x / 10000, 2))
up_down_limit['strth'] = up_down_limit['strth'].apply(lambda x: round(x, 2))
up_down_limit = up_down_limit[['trade_date', 'stk_code', 'fd_amount', 'first_time', 'last_time', 'open_times', 'strth', 'ud_limit']]
print(up_down_limit.head(5))
# 2、接口数据解析
up_down_limit_data = []
for index, row in up_down_limit.iterrows():
up_down_limit_data.append((row['trade_date'], row['stk_code'], row['fd_amount'], row['first_time'], row['last_time'], row['open_times'], row['strth'], row['ud_limit']))
table_insert(up_down_limit, 'up_down_limit_detail', up_down_limit_data)
# -------------------------------------------------------------------------------------------------------------
# tushare:融资融券汇总
# @retry(tries=-1, delay=5)
def margin_info():
print('margin_info函数开始执行')
yesterday = datetime.date.today() + datetime.timedelta(-1)
yesterday = str(yesterday).replace('-', '')
margin = pro.margin(trade_date=yesterday, fields='trade_date,exchange_id,rzye,rqye')
margin['rzye'] = margin['rzye'].apply(lambda x: round(x / 10000, 2))
margin['rqye'] = margin['rqye'].apply(lambda x: round(x / 10000, 2))
margin.fillna(0, inplace=True)
margin = margin[['trade_date', 'exchange_id', 'rzye', 'rqye']]
print(margin.head(5))
margin_data = []
for index, row in margin.iterrows():
margin_data.append((row['trade_date'], row['exchange_id'], row['rzye'], row['rqye']))
table_insert(margin, 'margin', margin_data)
# -------------------------------------------------------------------------------------------------------------
# tushare:融资融券明细
# @retry(tries=-1, delay=5)
def margin_detail():
print('margin_detail函数开始执行')
yesterday = datetime.date.today() + datetime.timedelta(-1)
yesterday = str(yesterday).replace('-', '')
margin_detail = pd.DataFrame()
for offset in range(0, 6000, 3000):
data_1 = df = pro.margin_detail(trade_date=yesterday, fields='trade_date,ts_code,name,rzye,rqye', offset=offset, limit=3000)
margin_detail = margin_detail.append(data_1, ignore_index=True)
print(margin_detail.head(5))
margin_detail = margin_detail.rename(columns={'ts_code': 'stk_code', 'name': 'stk_name'})
margin_detail['stk_code'] = margin_detail['stk_code'].apply(lambda x: x[:6])
margin_detail['rzye'] = margin_detail['rzye'].apply(lambda x: round(x / 10000, 2))
margin_detail['rqye'] = margin_detail['rqye'].apply(lambda x: round(x / 10000, 2))
margin_detail.fillna(0, inplace=True)
margin_detail = margin_detail[['trade_date', 'stk_code', 'stk_name', 'rzye', 'rqye']]
print(margin_detail.head(5))
margin_detail_data = []
for index, row in margin_detail.iterrows():
margin_detail_data.append((row['trade_date'], row['stk_code'], row['stk_name'], row['rzye'], row['rqye']))
table_insert(margin_detail, 'margin_detail', margin_detail_data)
# -------------------------------------------------------------------------------------------------------------
# tushare:股东人数
# @retry(tries=-1, delay=5)
def holder_number():
print('holder_number函数开始执行')
stock_list = pro.stock_basic(list_status='L', fields='ts_code,symbol,name')
code_list = stock_list['ts_code'].tolist()
holder_num = pd.DataFrame()
for offset in range(0, 60000, 6000):
number = pro.stk_holdernumber(start_date=current, end_date=current, fields='ts_code,end_date,holder_num', offset=offset)
holder_num = holder_num.append(number, ignore_index=True)
time.sleep(1)
holder_num = holder_num.rename(columns={'ts_code': 'stk_code'})
holder_num.fillna(0, inplace=True)
holder_num['stk_code'] = holder_num['stk_code'].apply(lambda x: x[:6])
holder_num = holder_num[['end_date', 'stk_code', 'holder_num']]
print(holder_num.head(5))
holder_num_data = []
for index, row in holder_num.iterrows():
holder_num_data.append((row['end_date'], row['stk_code'], row['holder_num']))
table_insert(holder_num, 'holder_number', holder_num_data)
# -------------------------------------------------------------------------------------------------------------
# 东方财富:个股盘口异动数据
def eastmoney_yd_spider(current):
print('eastmoney_yd_spider函数开始执行')
# 1、构造param
param_list = []
for page in range(0, 600):
param = {"pageindex": page, "pagesize": '64', "ut": '7eea3edcaed734bea9cbfc24409ed989', "dpt": 'wzchanges'}
param_list.append(param)
# 2、抓取网页数据
content_list = []
header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3676.400 QQBrowser/10.5.3738.400"}
url = "http://push2ex.eastmoney.com/getAllStockChanges?type=8201,8202,8193,4,32,64,8207,8209,8211,8213,8215,8204,8203,8194,8,16,128,8208,8210,8212,8214,8216"
for param in param_list:
content = json.loads(session.get(url=url, params=param, headers=header).text)
if content['data'] is None:
break
else:
content_list.append(content)
# 3、网页数据解析
content_list_data = []
for content in content_list:
allstock = content['data']['allstock']
for stock in allstock:
stk_code = stock['c'] # 股票代码
stk_name = stock['n'] # 股票名称
chg_time = stock['tm'] # 异动时间
chg_type = stock['t'] # 异动类型
if chg_type in ('8201', '8202', '8207', '8209', '8211', '8215', '8204', '8203', '8208', '8210', '8212', '8216'):
chg_value = stock['i'] * 100 # 异动值
elif chg_type in ('8193', '8194', '128', '64'):
chg_value = stock['i'] / 10000 # 异动值
else:
chg_value = stock['i'] # 异动值
content_list_data.append((current, stk_code, stk_name, chg_time, chg_type, chg_value))
# 4、网页数据存储
conn = pymysql.connect(host='localhost', user='root', passwd='123456', db='quant', charset='utf8mb4')
cursor = conn.cursor()
try:
content_list_sql = '''insert ignore into yd_detail(trade_date,stk_code,stk_name,chg_time,chg_type,chg_value) values(%s,%s,%s,%s,%s,%s)'''
cursor.executemany(content_list_sql, content_list_data)
except Exception as error:
print('insert failed')
print(error)
conn.rollback()
else:
print('insert successful!')
conn.commit()
cursor.close()
conn.close()
# -------------------------------------------------------------------------------------------------------------
# 开盘啦:龙虎榜风口概念数据
def fengkouKpl(current):
print('fengkouKpl函数开始执行')
current = current[:4] + '-' + current[4:6] + '-' + current[6:]
print(current)
# 1、抓取网页数据
url = 'https://pclhb.kaipanla.com/w1/api/index.php'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3314.0 Safari/537.36 SE 2.X MetaSr 1.0'}
data = {'c': 'LongHuBang', 'a': 'GetStockList', 'st': 300, 'Time': str(current), 'UserID': 399083, 'Token': '71aef0e806e61ad3169ddc9473e37886'}
html = json.loads(session.post(url=url, headers=headers, data=data).text)['list']
s = requests.session() # 参考文献https://www.jianshu.com/p/15b63ab310db
s.keep_alive = False
# 2、网页数据解析
code_list = []
fengkou_list = []
for j in html:
stk_code = j['ID']
stk_name = j['Name']
if len(j['FengKou']) == 0:
fengkou = '无'
else:
p = j['FengKou'].split(',')
for fengkou in p:
fengkou = fengkou
code_list.append(stk_code)
fengkou_list.append((current, stk_code, stk_name, fengkou))
print(fengkou_list)
# 3、网页数据存储
conn = conn = pymysql.connect(host='localhost', user='root', passwd='123456', db='quant', charset='utf8mb4')
cursor = conn.cursor()
try:
fengkou_list_sql = '''insert ignore into fengkou_concept(trade_date, stk_code, stk_name, fengkou) values( % s, % s, % s, % s)'''
cursor.executemany(fengkou_list_sql, fengkou_list)
except Exception as error:
print('insert failed')
print(error)
conn.rollback()
else:
print('insert successful!')
conn.commit()
cursor.close()
conn.close()
return code_list
# -------------------------------------------------------------------------------------------------------------
# 开盘啦:龙虎榜营业部标签数据
def departKpl(current, code_list):
print('departKpl函数开始执行')
current = current[:4] + '-' + current[4:6] + '-' + current[6:]
print(current)
# 1、抓取网页数据
html_list = []
url = 'https://pclhb.kaipanla.com/w1/api/index.php'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3314.0 Safari/537.36 SE 2.X MetaSr 1.0'}
for code in code_list:
data = {'c': 'Stock', 'a': 'GetNewOneStockInfo', 'StockID': code, 'Time': current, 'UserID': '399083', 'Token': '71aef0e806e61ad3169ddc9473e37886'}
html = json.loads(session.post(url=url, headers=headers, data=data).text)['List'][0]
list = html['BuyList'] + html['SellList']
s = requests.session()
s.keep_alive = False
html_list.append(list)
# 2、网页数据解析
depart_list = []
for depart in list:
depart_name = depart['Name']
try:
if depart_name == '沪股通专用':
tag = '沪股通'
classify = 5
elif depart_name == '深股通专用':
tag = '深股通'
classify = 6
elif depart_name == '机构专用':
tag = '机构'
classify = 4
else:
tag = depart['GroupIcon'][0]
classify = depart['YouZiIcon']
except:
tag = '无'
classify = depart['YouZiIcon']
depart_list.append((current, depart_name, tag, classify))
new_depart_list = set(depart_list)
# 3、网页数据存储
conn = pymysql.connect(host='localhost', user='root', passwd='123456', db='quant', charset='utf8mb4')
cursor = conn.cursor()
try:
new_depart_list_sql = '''insert ignore into depart_detail(trade_date, depart_name, tag, classify) values( % s, % s, % s, % s)'''
cursor.executemany(new_depart_list_sql, new_depart_list)
except Exception as error:
print('insert failed')
print(error)
conn.rollback()
else:
print('insert successful!')
conn.commit()
cursor.close()
conn.close()
# -------------------------------------------------------------------------------------------------------------
# 开盘啦:精选概念
# @retry(tries=-1, delay=5)
def kpl_select_concept_spider(code, current):
print('kpl_select_concept_spider函数开始执行')
current = current[:4] + '-' + current[4:6] + '-' + current[6:]
# 1、网页数据抓取
url = 'https://pchq.kaipanla.com/w1/api/index.php'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3314.0 Safari/537.36 SE 2.X MetaSr 1.0'}
data = {'c': 'PCArrangeData',
'a': 'GetHQPlate',
'StockID': code[:6],
'Day': current,
'time': '15:00',
'SelType': '1, 2, 3, 8, 9, 5, 6, 7',
'UserID': 399083,
'Token': '71aef0e806e61ad3169ddc9473e37886'}
session = requests.Session()
html = session.post(url=url, data=data, headers=headers).text
time.sleep(1)
# 2、网页数据解析
tag, select_concept = [], []
stk_code = json.loads(html)['trend']['code']
stk_name = json.loads(html)['pankou']['name']
stock_tag = json.loads(html)['pankou']['tag']
if stock_tag is False:
pass
else:
tag.append((stk_code, stk_name, stock_tag))
cp_list = json.loads(html)['stockplate']
for cp in cp_list:
concept = cp[0]
select_concept.append((stk_code, stk_name, concept))
# 3、网页数据存储
conn = conn = pymysql.connect(host='localhost', user='root', passwd='123456', db='quant', charset='utf8mb4')
cursor = conn.cursor()
try:
tag_sql = '''insert ignore into stock_tag(stk_code,stk_name,stock_tag) values(%s,%s,%s)'''
cursor.executemany(tag_sql, tag)
select_concept_sql = '''insert ignore into concept_info(stk_code,stk_name,concept) values(%s,%s,%s)'''
cursor.executemany(select_concept_sql, select_concept)
except Exception as error:
print('insert failed')
print(error)
conn.rollback()
else:
print('insert successful')
conn.commit()
cursor.close()
conn.close()
# -------------------------------------------------------------------------------------------------------------
# 网易:长期阶段涨幅数据
def wangyi_jdzf():
print('wangyi_jdzf函数开始执行')
# 1、网页数据抓取
html_list = []
url = 'http://quotes.money.163.com/hs/realtimedata/service/rank.php?'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3314.0 Safari/537.36 SE 2.X MetaSr 1.0'}
d = datetime.datetime.now()
req = str(d.weekday()) + str(d.hour) + str(d.minute)
for page in range(1, 1000):
param = {
'host': '/hs/realtimedata/service/rank.php',
'page': page,
'query': 'LONG_PERIOD_RANK:_exists_',
'fields': 'RN,CODE,SYMBOL,NAME,PRICE,LONG_PERIOD_RANK,PERCENT',
'sort': 'LONG_PERIOD_RANK.MONTH_PERCENT',
'order': 'desc',
'count': 25,
'type': 'query',
'callback': 'callback_51322721',
'req': req
}
str1 = 'callback_51322721('
str2 = ']})'
html = session.get(url=url, headers=headers, params=param).text
html = html.replace(str1, '')
html = html.replace(str2, ']}')
html = (json.loads(html))['list']
if len(html) == 0:
break
else:
html_list.append(html)
# 2、网页数据解析
jdzf_list = []
for p in html_list:
for j in p:
print(j)
stk_code = j['SYMBOL']
stk_name = j['NAME']
cur_close = j['PRICE']
pct_chg = j['PERCENT'] * 100
print(pct_chg)
try:
w_pct_chg = round(j['LONG_PERIOD_RANK']['WEEK_PERCENT'] * 100, 2)
except Exception as error:
w_pct_chg = 0
try:
m_pct_chg = round(j['LONG_PERIOD_RANK']['MONTH_PERCENT'] * 100, 2)
except Exception as error:
m_pct_chg = 0
try:
q_pct_chg = round(j['LONG_PERIOD_RANK']['QUARTER_PERCENT'] * 100, 2)
except Exception as error:
q_pct_chg = 0
try:
hy_pct_chg = round(j['LONG_PERIOD_RANK']['HALF_YEAR_PERCENT'] * 100, 2)
except Exception as error:
hy_pct_chg = 0
try:
y_pct_chg = round(j['LONG_PERIOD_RANK']['YEAR_PERCENT'] * 100, 2)
except Exception as error:
y_pct_chg = 0
jdzf_list.append((stk_code, stk_name, cur_close, pct_chg, w_pct_chg, m_pct_chg, q_pct_chg, hy_pct_chg, y_pct_chg))
# 3、网页数据存储
conn = pymysql.connect(host='localhost', user='root', passwd='123456', db='quant', charset='utf8mb4')
cursor = conn.cursor()
try:
cursor.execute('''delete from stage_increase''')
jdzf_list_sql = '''insert ignore into stage_increase(stk_code,stk_name,cur_close,pct_chg,w_pct_chg,m_pct_chg,q_pct_chg,hy_pct_chg,y_pct_chg) values(%s,%s,%s,%s,%s,%s,%s,%s,%s)'''
cursor.executemany(jdzf_list_sql, jdzf_list)
except Exception as error:
print('insert failed')
print(error)
conn.rollback()
else:
print('insert successful')
conn.commit()
cursor.close()
conn.close()
# -------------------------------------------------------------------------------------------------------------
# 网易:连续上涨数据
def wangyi_lxsz():
print('wangyi_lxsz函数开始执行')
# 1、网页数据抓取
html_list = []
url = 'http://quotes.money.163.com/hs/realtimedata/service/marketIndexes.php?'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3314.0 Safari/537.36 SE 2.X MetaSr 1.0'}
d = datetime.datetime.now()
req = str(d.weekday()) + str(d.hour) + str(d.minute)
for page in range(1, 1000):
param = {
'host': '/hs/realtimedata/service/marketIndexes.php',
'page': page,
'query': 'CONTINUOUS_UPDOWN.RIGHT_NOW:int_1',
'fields': 'CONTINUOUS_UPDOWN,CODE,RN,SYMBOL,NAME,TYPE,PRICE,PERCENT',
'sort': 'CONTINUOUS_UPDOWN.DAYS',
'order': 'desc',
'count': 25,
'type': 'query',
'callback': 'callback_1342448884',
'req': req
}
str1 = 'callback_1342448884('
str2 = ']});'
html = session.get(url=url, headers=headers, params=param).text
html = html.replace(str1, '')
html = html.replace(str2, ']}')
html = (json.loads(html))['list']
if len(html) == 0:
break
else:
html_list.append(html)
# 2、网页数据解析
lx_up_days_data = []
for p in html_list:
for j in p:
stk_code = j['SYMBOL']
stk_name = j['NAME']
cur_close = j['PRICE']
pct_chg = j['PERCENT']
up_days = j['CONTINUOUS_UPDOWN']['DAYS']
lx_up_days_data.append((current, stk_code, stk_name, cur_close, pct_chg, up_days))
# 3、网页数据存储
conn = pymysql.connect(host='localhost', user='root', passwd='123456', db='quant', charset='utf8mb4')
cursor = conn.cursor()
try:
lx_up_days_sql = '''insert ignore into continuous_up_day(trade_date,stk_code,stk_name,cur_close,pct_chg,up_days) values(%s,%s,%s,%s,%s,%s)'''
cursor.executemany(lx_up_days_sql, lx_up_days_data)
except Exception as error:
print('insert failed')
print(error)
conn.rollback()
else:
print('insert successful')
conn.commit()
cursor.close()
conn.close()
# -------------------------------------------------------------------------------------------------------------
# 网易:连续下跌数据
def wangyi_lxxd():
print('wangyi_lxxd函数开始执行')
# 1、网页数据抓取
html_list = []
url = 'http://quotes.money.163.com/hs/realtimedata/service/marketIndexes.php?'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3314.0 Safari/537.36 SE 2.X MetaSr 1.0'}
d = datetime.datetime.now()
req = str(d.weekday()) + str(d.hour) + str(d.minute)
for page in range(1, 1000):
param = {
'host': '/hs/realtimedata/service/marketIndexes.php',
'page': page,
'query': 'CONTINUOUS_UPDOWN.RIGHT_NOW:int_-1',
'fields': 'CONTINUOUS_UPDOWN,CODE,RN,SYMBOL,NAME,TYPE,PRICE,PERCENT',
'sort': 'CONTINUOUS_UPDOWN.DAYS',
'order': 'desc',
'count': 25,
'type': 'query',
'callback': 'callback_1536277048',
'req': req
}
str1 = 'callback_1536277048('
str2 = ']});'
html = session.get(url=url, headers=headers, params=param).text
html = html.replace(str1, '')
html = html.replace(str2, ']}')
html = (json.loads(html))['list']
if len(html) == 0:
break
else:
html_list.append(html)
# 2、网页数据解析
lx_down_days_data = []
for p in html_list:
for j in p:
stk_code = j['SYMBOL']
stk_name = j['NAME']
cur_close = j['PRICE']
pct_chg = j['PERCENT']
down_days = j['CONTINUOUS_UPDOWN']['DAYS']
lx_down_days_data.append((current, stk_code, stk_name, cur_close, pct_chg, down_days))
# 3、网页数据存储
conn = pymysql.connect(host='localhost', user='root', passwd='123456', db='quant', charset='utf8mb4')
cursor = conn.cursor()
try:
lx_down_days_sql = '''insert ignore into continuous_down_day(trade_date,stk_code,stk_name,cur_close,pct_chg,down_days) values(%s,%s,%s,%s,%s,%s)'''
cursor.executemany(lx_down_days_sql, lx_down_days_data)
except Exception as error:
print('insert failed')
print(error)
conn.rollback()
else:
print('insert successful')
conn.commit()
cursor.close()
conn.close()
# -------------------------------------------------------------------------------------------------------------
# jquant:竞价明细
# @retry(tries=-1, delay=5)
def stock_bidding(current):
print('stock_bidding函数开始执行')
current = current[:4] + '-' + current[4:6] + '-' + current[6:]
stock_list = (get_all_securities(types=['stock'], date=None).index).tolist()
# 1、接口数据请求
stock_bidding = pd.DataFrame()
for stk in stock_list:
data_1 = get_call_auction(security=stk, start_date=current, end_date=current, fields=['time', 'current', 'money'])
stock_bidding = stock_bidding.append(data_1, ignore_index=True)
stock_bidding = stock_bidding.rename(columns={'code': 'stk_code', 'time': 'trade_date', 'current': 'open_price', 'money': 'amount'})
stock_bidding = stock_bidding[['trade_date', 'stk_code', 'open_price', 'amount']]
stock_bidding.fillna(0, inplace=True)
stock_bidding['trade_date'] = stock_bidding['trade_date'].apply(lambda x: (str(x).replace('-', ''))[:8])
stock_bidding['stk_code'] = stock_bidding['stk_code'].apply(lambda x: x[:6])
stock_bidding['amount'] = stock_bidding['amount'].apply(lambda x: round(x / 10000, 2))
stock_bidding = [['trade_date', 'stk_code', 'open_price', 'amount']]
print(stock_bidding.head(5))
# 2、接口数据解析
stock_bidding_data = []
for index, row in stock_bidding.iterrows():
stock_bidding_data.append((row['trade_date'], row['stk_code'], row['open_price'], row['amount']))
table_insert(stock_bidding, 'stock_bidding', stock_bidding_data)
# -------------------------------------------------------------------------------------------------------------
# jquant:龙虎榜明细
# @retry(tries=-1, delay=5)
def top_inst_info(current):
print('top_inst_info函数开始执行')
current = current[:4] + '-' + current[4:6] + '-' + current[6:]
# 1、接口数据请求
top_inst = get_billboard_list(stock_list=None, start_date=current, end_date=current)
top_inst = top_inst[['day', 'code', 'direction', 'sales_depart_name', 'rank', 'buy_value', 'sell_value', 'net_value', 'amount']]
top_inst = top_inst.rename(columns={'code': 'ts_code', 'day': 'trade_date', 'sales_depart_name': 'depart_name'})
top_inst['ts_code'] = top_inst['ts_code'].apply(lambda x: x[:6])
top_inst['depart_name'] = top_inst['depart_name'].fillna(value='无')
top_inst['depart_name'] = top_inst['depart_name'].apply(lambda x: x.replace('证券营业部', ''))
top_inst['depart_name'] = top_inst['depart_name'].apply(lambda x: x.replace('股份有限公司', ''))
top_inst['depart_name'] = top_inst['depart_name'].apply(lambda x: x.replace('有限责任公司', ''))
top_inst['depart_name'] = top_inst['depart_name'].apply(lambda x: x.replace('有限公司', ''))
top_inst['buy_value'] = top_inst['buy_value'].fillna(value=0)
top_inst['buy_value'] = top_inst['buy_value'].apply(lambda x: round(x / 10000, 1))
top_inst['sell_value'] = top_inst['sell_value'].fillna(value=0)
top_inst['sell_value'] = top_inst['sell_value'].apply(lambda x: round(x / 10000, 1))
top_inst['net_value'] = top_inst['net_value'].fillna(value=0)
top_inst['net_value'] = top_inst['net_value'].apply(lambda x: round(x / 10000, 1))
top_inst['amount'] = top_inst['amount'].fillna(value=0)
top_inst['amount'] = top_inst['amount'].apply(lambda x: round(x / 10000, 1))
top_inst = top_inst[['trade_date', 'ts_code', 'direction', 'depart_name', 'rank', 'buy_value', 'sell_value', 'net_value', 'amount']]
print(top_inst.head(5))
# 2、接口数据解析
top_inst_data = []
for index, row in top_inst.iterrows():
top_inst_data.append((row['trade_date'], row['ts_code'], row['direction'], row['depart_name'], row['rank'], row['buy_value'], row['sell_value'], row['net_value'], row['amount']))
table_insert(top_inst, 'top_inst_detail', top_inst_data)
# -------------------------------------------------------------------------------------------------------------
# 数据库数据清洗
def data_clear():
pass
print('data_clear函数开始执行')
# -------------------------------------------------------------------------------------------------------------
if __name__ == '__main__':
pro = ts.pro_api('ac16b470869c5d82db5033ae9288f77b282d2b5519507d6d2c72fdd7')
auth('18829345691', '345691')
is_auth = is_auth()
t1 = time.time()
current = time.strftime('%Y%m%d', time.localtime())
current = '20200402'
list = ['20200206', '20200207', '20200210', '20200211', '20200212', '20200213', '20200214', '20200217', '20200218', '20200219', '20200220', '20200221', '20200224', '20200225', '20200226', '20200227', '20200228', '20200302', '20200303', '20200304', '20200305', '20200306', '20200309', '20200310', '20200311', '20200312', '20200313', '20200316', '20200317', '20200318',
'20200319', '20200320', '20200323', '20200324', '20200325', '20200326', '20200327', '20200330', '20200331']
for current in list:
# tushare接口
stock_list = stock_list()
cept_id = concept_classify()
sz_index_info()
on_shibor_rate()
hsgt_total()
hsgt_top_detail()
stock_daily = stock_daily()
scqx_detail(stock_daily)
big_moneyflow()
up_down_limit_detail()
margin_info()
margin_detail()
session = requests.Session()
# 东财爬虫
eastmoney_yd_spider()
# 开盘啦爬虫
code_list = fengkouKpl(current)
departKpl(current, code_list)
conn = Redis(host='127.0.0.1', port=6379)
pool = Pool(8)
for code in stock_list:
ex = conn.sadd('code', code)
if ex == 1:
print('数据没有被爬取过,可以进行数据的爬取')
try:
pool.apply_async(func=kpl_select_concept_spider, args=(code, current))
except Exception as error:
print(error)
else:
print('数据还没有更新,暂无新数据可爬取!')
pool.close()
pool.join()
# 网易爬虫
wangyi_jdzf()
wangyi_lxsz()
wangyi_lxxd()
# 聚宽接口
stock_bidding(current)
top_inst_info(current)
# tushare接口,耗时较长
holder_number()
concept_detail(cept_id)
t2 = time.time()
print('本次共耗费%.2f' % (t2 - t1))