chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,242 @@
|
||||
#!/usr/local/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# apk add py-mysqldb or
|
||||
|
||||
import platform
|
||||
import datetime
|
||||
import time
|
||||
import sys
|
||||
import os
|
||||
import MySQLdb
|
||||
from sqlalchemy import create_engine
|
||||
from sqlalchemy.types import NVARCHAR
|
||||
from sqlalchemy import inspect
|
||||
import pandas as pd
|
||||
import traceback
|
||||
import akshare as ak
|
||||
|
||||
# 使用环境变量获得数据库。兼容开发模式可docker模式。
|
||||
MYSQL_HOST = os.environ.get('MYSQL_HOST') if (os.environ.get('MYSQL_HOST') != None) else "mysqldb"
|
||||
MYSQL_USER = os.environ.get('MYSQL_USER') if (os.environ.get('MYSQL_USER') != None) else "root"
|
||||
MYSQL_PWD = os.environ.get('MYSQL_PWD') if (os.environ.get('MYSQL_PWD') != None) else "mysqldb"
|
||||
MYSQL_DB = os.environ.get('MYSQL_DB') if (os.environ.get('MYSQL_DB') != None) else "stock_data"
|
||||
MYSQL_PORT = os.environ.get('MYSQL_PORT') if (os.environ.get('MYSQL_PORT') != None) else "3306"
|
||||
|
||||
print("MYSQL_HOST :", MYSQL_HOST, ",MYSQL_USER :", MYSQL_USER, ",MYSQL_DB :", MYSQL_DB)
|
||||
MYSQL_CONN_URL = "mysql+mysqldb://" + MYSQL_USER + ":" + MYSQL_PWD + "@" + MYSQL_HOST + ":" + MYSQL_PORT + "/" + MYSQL_DB + "?charset=utf8mb4"
|
||||
print("MYSQL_CONN_URL :", MYSQL_CONN_URL)
|
||||
|
||||
__version__ = "2.0.0"
|
||||
# 每次发布时候更新。
|
||||
|
||||
# https://docs.sqlalchemy.org/en/20/errors.html#error-e3q8
|
||||
#
|
||||
def engine():
|
||||
engine = create_engine(MYSQL_CONN_URL, pool_size=10, max_overflow=20)
|
||||
#encoding='utf8', convert_unicode=True)
|
||||
return engine
|
||||
|
||||
def engine_to_db(to_db):
|
||||
MYSQL_CONN_URL_NEW = "mysql+mysqldb://" + MYSQL_USER + ":" + MYSQL_PWD + "@" + MYSQL_HOST + ":" + MYSQL_PORT + "/" + to_db + "?charset=utf8mb4"
|
||||
engine = create_engine(MYSQL_CONN_URL_NEW, pool_size=10, max_overflow=20)
|
||||
#encoding='utf8', convert_unicode=True)
|
||||
return engine
|
||||
|
||||
# 通过数据库链接 engine。
|
||||
def conn():
|
||||
try:
|
||||
db = MySQLdb.connect(MYSQL_HOST, MYSQL_USER, MYSQL_PWD, MYSQL_DB, charset="utf8")
|
||||
# db.autocommit = True
|
||||
except Exception as e:
|
||||
print("conn error :", e)
|
||||
db.autocommit(on=True)
|
||||
return db.cursor()
|
||||
|
||||
|
||||
# 定义通用方法函数,插入数据库表,并创建数据库主键,保证重跑数据的时候索引唯一。
|
||||
def insert_db(data, table_name, write_index, primary_keys):
|
||||
# 插入默认的数据库。
|
||||
insert_other_db(MYSQL_DB, data, table_name, write_index, primary_keys)
|
||||
|
||||
|
||||
# 增加一个插入到其他数据库的方法。
|
||||
def insert_other_db(to_db, data, table_name, write_index, primary_keys):
|
||||
# 定义engine
|
||||
engine_mysql = engine_to_db(to_db)
|
||||
# 使用 http://docs.sqlalchemy.org/en/latest/core/reflection.html
|
||||
# 使用检查检查数据库表是否有主键。
|
||||
insp = inspect(engine_mysql)
|
||||
col_name_list = data.columns.tolist()
|
||||
# 如果有索引,把索引增加到varchar上面。
|
||||
if write_index:
|
||||
# 插入到第一个位置:
|
||||
col_name_list.insert(0, data.index.name)
|
||||
print(col_name_list)
|
||||
data.to_sql(name=table_name, con=engine_mysql, schema=to_db, if_exists='append',
|
||||
dtype={col_name: NVARCHAR(length=255) for col_name in col_name_list}, index=write_index)
|
||||
|
||||
# print(insp.get_pk_constraint(table_name))
|
||||
# print()
|
||||
# print(type(insp))
|
||||
# 判断是否存在主键
|
||||
if insp.get_pk_constraint(table_name)['constrained_columns'] == []:
|
||||
with engine_mysql.connect() as con:
|
||||
# 执行数据库插入数据。
|
||||
try:
|
||||
con.execute('ALTER TABLE `%s` ADD PRIMARY KEY (%s);' % (table_name, primary_keys))
|
||||
except Exception as e:
|
||||
print("################## ADD PRIMARY KEY ERROR :", e)
|
||||
|
||||
|
||||
|
||||
|
||||
# 插入数据。
|
||||
def insert(sql, params=()):
|
||||
with conn() as db:
|
||||
print("insert sql:" + sql)
|
||||
try:
|
||||
db.execute(sql, params)
|
||||
except Exception as e:
|
||||
print("error :", e)
|
||||
|
||||
|
||||
# 查询数据
|
||||
def select(sql, params=()):
|
||||
with conn() as db:
|
||||
print("select sql:" + sql)
|
||||
try:
|
||||
db.execute(sql, params)
|
||||
except Exception as e:
|
||||
print("error :", e)
|
||||
result = db.fetchall()
|
||||
return result
|
||||
|
||||
|
||||
# 计算数量
|
||||
def select_count(sql, params=()):
|
||||
with conn() as db:
|
||||
print("select sql:" + sql)
|
||||
try:
|
||||
db.execute(sql, params)
|
||||
except Exception as e:
|
||||
print("error :", e)
|
||||
result = db.fetchall()
|
||||
# 只有一个数组中的第一个数据
|
||||
if len(result) == 1:
|
||||
return int(result[0][0])
|
||||
else:
|
||||
return 0
|
||||
|
||||
|
||||
# 通用函数。获得日期参数。
|
||||
def run_with_args(run_fun):
|
||||
tmp_datetime_show = datetime.datetime.now() # 修改成默认是当日执行 + datetime.timedelta()
|
||||
tmp_hour_int = int(tmp_datetime_show.strftime("%H"))
|
||||
if tmp_hour_int < 12 :
|
||||
# 判断如果是每天 中午 12 点之前运行,跑昨天的数据。
|
||||
tmp_datetime_show = (tmp_datetime_show + datetime.timedelta(days=-1))
|
||||
tmp_datetime_str = tmp_datetime_show.strftime("%Y-%m-%d %H:%M:%S.%f")
|
||||
print("\n######################### hour_int %d " % tmp_hour_int)
|
||||
str_db = "MYSQL_HOST :" + MYSQL_HOST + ", MYSQL_USER :" + MYSQL_USER + ", MYSQL_DB :" + MYSQL_DB
|
||||
print("\n######################### " + str_db + " ######################### ")
|
||||
print("\n######################### begin run %s %s #########################" % (run_fun, tmp_datetime_str))
|
||||
start = time.time()
|
||||
# 要支持数据重跑机制,将日期传入。循环次数
|
||||
if len(sys.argv) == 3:
|
||||
# python xxx.py 2017-07-01 10
|
||||
tmp_year, tmp_month, tmp_day = sys.argv[1].split("-")
|
||||
loop = int(sys.argv[2])
|
||||
tmp_datetime = datetime.datetime(int(tmp_year), int(tmp_month), int(tmp_day))
|
||||
for i in range(0, loop):
|
||||
# 循环插入多次数据,重复跑历史数据使用。
|
||||
# time.sleep(5)
|
||||
tmp_datetime_new = tmp_datetime + datetime.timedelta(days=i)
|
||||
try:
|
||||
run_fun(tmp_datetime_new)
|
||||
except Exception as e:
|
||||
print("error :", e)
|
||||
traceback.print_exc()
|
||||
elif len(sys.argv) == 2:
|
||||
# python xxx.py 2017-07-01
|
||||
tmp_year, tmp_month, tmp_day = sys.argv[1].split("-")
|
||||
tmp_datetime = datetime.datetime(int(tmp_year), int(tmp_month), int(tmp_day))
|
||||
try:
|
||||
run_fun(tmp_datetime)
|
||||
except Exception as e:
|
||||
print("error :", e)
|
||||
traceback.print_exc()
|
||||
else:
|
||||
# tmp_datetime = datetime.datetime.now() + datetime.timedelta(days=-1)
|
||||
try:
|
||||
run_fun(tmp_datetime_show) # 使用当前时间
|
||||
except Exception as e:
|
||||
print("error :", e)
|
||||
traceback.print_exc()
|
||||
print("######################### finish %s , use time: %s #########################" % (
|
||||
tmp_datetime_str, time.time() - start))
|
||||
|
||||
|
||||
# 设置基础目录,每次加载使用。
|
||||
bash_stock_tmp = "/data/cache/hist_data_cache/%s/%s/"
|
||||
if not os.path.exists(bash_stock_tmp):
|
||||
os.makedirs(bash_stock_tmp) # 创建多个文件夹结构。
|
||||
print("######################### init tmp dir #########################")
|
||||
|
||||
|
||||
# 增加读取股票缓存方法。加快处理速度。
|
||||
def get_hist_data_cache(code, date_start, date_end):
|
||||
cache_dir = bash_stock_tmp % (date_end[0:7], date_end)
|
||||
# 如果没有文件夹创建一个。月文件夹和日文件夹。方便删除。
|
||||
# print("cache_dir:", cache_dir)
|
||||
if not os.path.exists(cache_dir):
|
||||
os.makedirs(cache_dir)
|
||||
cache_file = cache_dir + "%s^%s.gzip.pickle" % (date_end, code)
|
||||
# 如果缓存存在就直接返回缓存数据。压缩方式。
|
||||
if os.path.isfile(cache_file):
|
||||
print("######### read from cache #########", cache_file)
|
||||
return pd.read_pickle(cache_file, compression="gzip")
|
||||
else:
|
||||
# https://akshare.akfamily.xyz/data/index/index.html#id4
|
||||
# 获取历史行情,em
|
||||
#stock = ak.stock_zh_a_hist(symbol= code, start_date=date_start,
|
||||
# end_date=date_end, adjust="")
|
||||
code = gp_type_szsh(code)+ code
|
||||
print("######### get data, write cache #########", code, date_start, date_end)
|
||||
|
||||
stock = ak.stock_zh_index_daily_em(symbol= code,
|
||||
start_date=date_start.replace("-", ""), end_date=date_end.replace("-", ""))
|
||||
print(stock)
|
||||
if stock is None or stock.empty:
|
||||
return None
|
||||
|
||||
stock.columns = ['date', 'open', 'close', 'high', 'low', 'volume', 'amount']
|
||||
# 数据返回的是带 0 列是索引,第一列是 date 日期
|
||||
# date open close high low volume amount
|
||||
# 0 2024-09-20 9.81 9.90 9.90 9.78 797297 7.851212e+08
|
||||
|
||||
stock.set_index('date', inplace=True)
|
||||
#stock = stock.sort_index(0) # 将数据按照日期排序下。
|
||||
print(stock)
|
||||
stock.to_pickle(cache_file, compression="gzip")
|
||||
return stock
|
||||
|
||||
|
||||
# 沪市股票包含上证主板和科创板和B股:沪市主板股票代码是60开头、科创板股票代码是688开头、B股代码900开头。
|
||||
# 深市股票包含主板、中小板、创业板和B股:深市主板股票代码是000开头、中小板股票代码002开头、创业板300开头、B股代码200开头
|
||||
# print(gp_type_szsh('002340'))
|
||||
#
|
||||
def gp_type_szsh(gp):
|
||||
if gp.find('60',0,3)==0:
|
||||
gp_type='sh'
|
||||
elif gp.find('688',0,4)==0:
|
||||
gp_type='sh'
|
||||
elif gp.find('900',0,4)==0:
|
||||
gp_type='sh'
|
||||
elif gp.find('00',0,3)==0:
|
||||
gp_type='sz'
|
||||
elif gp.find('300',0,4)==0:
|
||||
gp_type='sz'
|
||||
elif gp.find('200',0,4)==0:
|
||||
gp_type='sz'
|
||||
return gp_type
|
||||
@@ -0,0 +1,196 @@
|
||||
#!/usr/local/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
class StockWebData:
|
||||
def __init__(self, mode, type, name, table_name, columns, column_names, primary_key, order_by):
|
||||
self.mode = mode # 模式,query,editor 查询和编辑模式
|
||||
self.type = type
|
||||
self.name = name
|
||||
self.table_name = table_name
|
||||
self.columns = columns
|
||||
self.column_names = column_names
|
||||
self.primary_key = primary_key
|
||||
self.order_by = order_by
|
||||
if mode == "query":
|
||||
self.url = "/stock/data?table_name=" + self.table_name
|
||||
elif mode == "editor":
|
||||
self.url = "/data/editor?table_name=" + self.table_name
|
||||
|
||||
|
||||
STOCK_WEB_DATA_LIST = []
|
||||
|
||||
|
||||
# https://www.akshare.xyz/zh_CN/latest/data/stock/stock.html#id1
|
||||
# 限量: 单次返回所有 A 股上市公司的实时行情数据
|
||||
STOCK_WEB_DATA_LIST.append(
|
||||
StockWebData(
|
||||
mode="query",
|
||||
type="1,股票基本数据",
|
||||
name="每日股票数据-东财",
|
||||
table_name="stock_zh_a_spot_em",
|
||||
columns= ['date', 'code', 'name', 'last_price', 'change_percent', 'change_amount',
|
||||
'volume', 'turnover', 'amplitude', 'high', 'low', 'open', 'closed', 'volume_ratio',
|
||||
'turnover_rate', 'pe_ratio','pb_ratio', 'market_cap','circulating_market_cap','rise_speed',
|
||||
'change_5min', 'change_ercent_60day','ytd_change_percent'] ,
|
||||
column_names=['日期','代码','名称','最新价','涨跌幅','涨跌额','成交量','成交额',
|
||||
'振幅','最高','最低','今开','昨收','量比','换手率','动态市盈率',
|
||||
'市净率', '总市值', '流通市值', '涨速', '5分钟涨跌', '60日涨跌幅', '年初至今涨跌幅'],
|
||||
primary_key=[],
|
||||
order_by=" code asc "
|
||||
)
|
||||
)
|
||||
|
||||
STOCK_WEB_DATA_LIST.append(
|
||||
StockWebData(
|
||||
mode="query",
|
||||
type="1,股票基本数据",
|
||||
name="龙虎榜-个股上榜-新浪",
|
||||
table_name="stock_lhb_ggtj_sina",
|
||||
columns= ['date','code','name','ranking_times','sum_buy','sum_sell','net_amount','buy_seat','sell_seat'],
|
||||
column_names=['日期','代码', '名称', '上榜次数', '累积购买额', '累积卖出额', '净额', '买入席位数', '卖出席位数'],
|
||||
primary_key=[],
|
||||
order_by=" code asc "
|
||||
)
|
||||
)
|
||||
|
||||
STOCK_WEB_DATA_LIST.append(
|
||||
StockWebData(
|
||||
mode="query",
|
||||
type="1,股票基本数据",
|
||||
name="数据中心-大宗交易",
|
||||
table_name="stock_dzjy_mrtj",
|
||||
columns= ['date', 'code', 'name', 'quote_change', 'close_price', 'average_price',
|
||||
'overflow_rate', 'trade_number', 'sum_volume', 'sum_turnover',
|
||||
'turnover_market_rate'],
|
||||
column_names=['日期', '代码', '名称', '涨跌幅', '收盘价', '成交均价',
|
||||
'折溢率', '成交笔数', '成交总量', '成交总额',
|
||||
'成交总额/流通市值'],
|
||||
primary_key=[],
|
||||
order_by=" code asc "
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
|
||||
# 每日股票指标lite猜想买入。
|
||||
STOCK_WEB_DATA_LIST.append(
|
||||
StockWebData(
|
||||
mode="query",
|
||||
type="2,每日数据猜想",
|
||||
name="股票指标lite猜想买入",
|
||||
table_name="guess_indicators_lite_buy_daily",
|
||||
# columns=['date', 'code', 'name', 'latest_price', 'quote_change', 'ups_downs', 'volume', 'turnover',
|
||||
# 'amplitude', 'high', 'low', 'open', 'closed', 'volume_ratio', 'turnover_rate', 'pe_dynamic', 'pb',
|
||||
# 'kdjj', 'rsi_6', 'cci'],
|
||||
# column_names=['日期', '代码', '名称', '最新价', '涨跌幅', '涨跌额', '成交量', '成交额',
|
||||
# '振幅', '最高', '最低', '今开', '昨收', '量比', '换手率', '动态市盈率', '市净率',
|
||||
# 'kdjj', 'rsi_6', 'cci'],
|
||||
columns= ['date', 'code', 'name', 'last_price', 'change_percent', 'change_amount',
|
||||
'volume', 'turnover', 'amplitude', 'high', 'low', 'open', 'closed', 'volume_ratio',
|
||||
'turnover_rate', 'pe_ratio','pb_ratio', 'market_cap','circulating_market_cap','rise_speed',
|
||||
'change_5min', 'change_ercent_60day','ytd_change_percent',
|
||||
'boll', 'boll_lb', 'boll_ub', 'kdjd', 'kdjj', 'kdjk', 'macd', 'macdh',
|
||||
'macds', 'pdi','trix', 'trix_9_sma', 'vr', 'vr_6_sma', 'wr_10', 'wr_6'] ,
|
||||
# 中文说明前面和 1 数据一致。
|
||||
column_names=['日期','代码','名称','最新价','涨跌幅','涨跌额','成交量','成交额',
|
||||
'振幅','最高','最低','今开','昨收','量比','换手率','动态市盈率',
|
||||
'市净率', '总市值', '流通市值', '涨速', '5分钟涨跌', '60日涨跌幅',
|
||||
'年初至今涨跌幅',
|
||||
'boll', 'boll_lb', 'boll_ub',
|
||||
'kdjd', 'kdjj', 'kdjk', 'macd', 'macdh', 'macds', 'pdi',
|
||||
'trix', 'trix_9_sma', 'vr', 'vr_6_sma', 'wr_10', 'wr_6'],
|
||||
primary_key=[],
|
||||
order_by=" buy_date desc "
|
||||
)
|
||||
)
|
||||
|
||||
# 每日股票指标lite猜想卖出。
|
||||
STOCK_WEB_DATA_LIST.append(
|
||||
StockWebData(
|
||||
mode="query",
|
||||
type="2,每日数据猜想",
|
||||
name="股票指标lite猜想卖出",
|
||||
table_name="guess_indicators_lite_sell_daily",
|
||||
# columns=['date', 'code', 'name', 'latest_price', 'quote_change', 'ups_downs', 'volume', 'turnover',
|
||||
# 'amplitude', 'high', 'low', 'open', 'closed', 'volume_ratio', 'turnover_rate', 'pe_dynamic', 'pb',
|
||||
# 'kdjj', 'rsi_6', 'cci'],
|
||||
# column_names=['日期', '代码', '名称', '最新价', '涨跌幅', '涨跌额', '成交量', '成交额',
|
||||
# '振幅', '最高', '最低', '今开', '昨收', '量比', '换手率', '动态市盈率', '市净率',
|
||||
# 'kdjj', 'rsi_6', 'cci'],
|
||||
columns= ['date', 'code', 'name', 'last_price', 'change_percent', 'change_amount',
|
||||
'volume', 'turnover', 'amplitude', 'high', 'low', 'open', 'closed', 'volume_ratio',
|
||||
'turnover_rate', 'pe_ratio','pb_ratio', 'market_cap','circulating_market_cap','rise_speed',
|
||||
'change_5min', 'change_ercent_60day','ytd_change_percent',
|
||||
'boll', 'boll_lb', 'boll_ub', 'kdjd', 'kdjj', 'kdjk', 'macd', 'macdh',
|
||||
'macds', 'pdi','trix', 'trix_9_sma', 'vr', 'vr_6_sma', 'wr_10', 'wr_6'] ,
|
||||
# 中文说明前面和 1 数据一致。
|
||||
column_names=['日期','代码','名称','最新价','涨跌幅','涨跌额','成交量','成交额',
|
||||
'振幅','最高','最低','今开','昨收','量比','换手率','动态市盈率',
|
||||
'市净率', '总市值', '流通市值', '涨速', '5分钟涨跌', '60日涨跌幅',
|
||||
'年初至今涨跌幅',
|
||||
'boll', 'boll_lb', 'boll_ub',
|
||||
'kdjd', 'kdjj', 'kdjk', 'macd', 'macdh', 'macds', 'pdi',
|
||||
'trix', 'trix_9_sma', 'vr', 'vr_6_sma', 'wr_10', 'wr_6'],
|
||||
primary_key=[],
|
||||
order_by=" buy_date desc "
|
||||
)
|
||||
)
|
||||
|
||||
# 每日股票指标lite猜想。
|
||||
STOCK_WEB_DATA_LIST.append(
|
||||
StockWebData(
|
||||
mode="query",
|
||||
type="2,每日数据猜想",
|
||||
name="股票指标猜想原始数据",
|
||||
table_name="guess_indicators_daily",
|
||||
|
||||
columns= ['date', 'code', 'name', 'last_price', 'change_percent', 'change_amount',
|
||||
'volume', 'turnover', 'amplitude', 'high', 'low', 'open', 'closed', 'volume_ratio',
|
||||
'turnover_rate', 'pe_ratio','pb_ratio', 'market_cap','circulating_market_cap','rise_speed',
|
||||
'change_5min', 'change_ercent_60day','ytd_change_percent',
|
||||
'boll', 'boll_lb', 'boll_ub', 'kdjd', 'kdjj', 'kdjk', 'macd', 'macdh',
|
||||
'macds', 'pdi','trix', 'trix_9_sma', 'vr', 'vr_6_sma', 'wr_10', 'wr_6'] ,
|
||||
# 中文说明前面和 1 数据一致。
|
||||
column_names=['日期','代码','名称','最新价','涨跌幅','涨跌额','成交量','成交额',
|
||||
'振幅','最高','最低','今开','昨收','量比','换手率','动态市盈率',
|
||||
'市净率', '总市值', '流通市值', '涨速', '5分钟涨跌', '60日涨跌幅',
|
||||
'年初至今涨跌幅',
|
||||
'boll', 'boll_lb', 'boll_ub',
|
||||
'kdjd', 'kdjj', 'kdjk', 'macd', 'macdh', 'macds', 'pdi',
|
||||
'trix', 'trix_9_sma', 'vr', 'vr_6_sma', 'wr_10', 'wr_6'],
|
||||
|
||||
# columns=['date','code','name','latest_price','quote_change','ups_downs',
|
||||
# 'adx', 'adxr', 'boll', 'boll_lb', 'boll_ub', 'cci', 'cci_20', 'close_-1_r',
|
||||
# 'close_-2_r', 'code', 'cr', 'cr-ma1', 'cr-ma2', 'cr-ma3', 'date', 'dma', 'dx',
|
||||
# 'kdjd', 'kdjj', 'kdjk', 'macd', 'macdh', 'macds', 'mdi', 'pdi',
|
||||
# 'rsi_12', 'rsi_6', 'trix', 'trix_9_sma', 'vr', 'vr_6_sma', 'wr_10', 'wr_6'],
|
||||
# column_names=['日期','代码','名称','最新价','涨跌幅','涨跌额',
|
||||
# 'adx', 'adxr', 'boll', 'boll_lb', 'boll_ub', 'cci', 'cci_20', 'close_-1_r',
|
||||
# 'close_-2_r', 'code', 'cr', 'cr-ma1', 'cr-ma2', 'cr-ma3', 'date', 'dma', 'dx',
|
||||
# 'kdjd', 'kdjj', 'kdjk', 'macd', 'macdh', 'macds', 'mdi', 'pdi',
|
||||
# 'rsi_12', 'rsi_6', 'trix', 'trix_9_sma', 'vr', 'vr_6_sma', 'wr_10', 'wr_6'],
|
||||
|
||||
primary_key=[],
|
||||
order_by=' date desc '
|
||||
)
|
||||
)
|
||||
|
||||
# "code", "name: pchange", "amount", "buy", "bratio", "sell", "sratio", "reason", "date"
|
||||
# 代码 名称 当日涨跌幅 龙虎榜成交额(万) 买入额(万) 买入占总成交比例 卖出额(万) 卖出占总成交比例 上榜原因 日期
|
||||
|
||||
|
||||
STOCK_WEB_DATA_MAP = {}
|
||||
WEB_EASTMONEY_URL = "http://quote.eastmoney.com/%s.html"
|
||||
# 再拼接成Map使用。
|
||||
for tmp in STOCK_WEB_DATA_LIST:
|
||||
# try:
|
||||
# # 增加columns 字段中的【查看股票】
|
||||
# tmp_idx = tmp.columns.index("code")
|
||||
# tmp.column_names.insert(tmp_idx + 1, "查看股票")
|
||||
# except Exception as e:
|
||||
# print("error :", e)
|
||||
|
||||
STOCK_WEB_DATA_MAP[tmp.table_name] = tmp
|
||||
|
||||
if len(tmp.columns) != len(tmp.column_names):
|
||||
print(u"error:", tmp.table_name, ",columns:", len(tmp.columns), ",column_names:", len(tmp.column_names))
|
||||
@@ -0,0 +1,358 @@
|
||||
#!/usr/local/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
class StockWebData:
|
||||
def __init__(self, mode, type, name, table_name, columns, column_names, primary_key, order_by):
|
||||
self.mode = mode # 模式,query,editor 查询和编辑模式
|
||||
self.type = type
|
||||
self.name = name
|
||||
self.table_name = table_name
|
||||
self.columns = columns
|
||||
self.column_names = column_names
|
||||
self.primary_key = primary_key
|
||||
self.order_by = order_by
|
||||
if mode == "query":
|
||||
self.url = "/stock/data?table_name=" + self.table_name
|
||||
elif mode == "editor":
|
||||
self.url = "/data/editor?table_name=" + self.table_name
|
||||
|
||||
|
||||
STOCK_WEB_DATA_LIST = []
|
||||
|
||||
STOCK_WEB_DATA_LIST.append(
|
||||
StockWebData(
|
||||
mode="query",
|
||||
type="宏观经济数据",
|
||||
name="存款利率",
|
||||
table_name="ts_deposit_rate",
|
||||
columns=["date", "deposit_type", "rate"],
|
||||
column_names=["日期", "存款类型", "存款利率"],
|
||||
primary_key=[],
|
||||
order_by=" date desc "
|
||||
)
|
||||
)
|
||||
|
||||
STOCK_WEB_DATA_LIST.append(
|
||||
StockWebData(
|
||||
mode="query",
|
||||
type="宏观经济数据",
|
||||
name="贷款利率",
|
||||
table_name="ts_loan_rate",
|
||||
columns=["date", "loan_type", "rate"],
|
||||
column_names=["日期", "贷款类型", "存款利率"],
|
||||
primary_key=[],
|
||||
order_by=" date desc "
|
||||
)
|
||||
)
|
||||
|
||||
STOCK_WEB_DATA_LIST.append(
|
||||
StockWebData(
|
||||
mode="query",
|
||||
type="宏观经济数据",
|
||||
name="存款准备金率",
|
||||
table_name="ts_rrr",
|
||||
columns=["date", "before", "now", "changed"],
|
||||
column_names=["变动日期", "调整前存款准备金率(%)", "调整后存款准备金率(%)", "调整幅度(%)"],
|
||||
primary_key=[],
|
||||
order_by=" date desc "
|
||||
)
|
||||
)
|
||||
|
||||
STOCK_WEB_DATA_LIST.append(
|
||||
StockWebData(
|
||||
mode="query",
|
||||
type="宏观经济数据",
|
||||
name="货币供应量",
|
||||
table_name="ts_money_supply",
|
||||
columns=["month", "m2", "m2_yoy", "m1", "m1_yoy", "m0", "m0_yoy", "cd", "cd_yoy", "qm", "qm_yoy", "ftd",
|
||||
"ftd_yoy", "sd", "sd_yoy", "rests", "rests_yoy"],
|
||||
column_names=["统计时间", "货币和准货币(广义货币M2)(亿元)", "货币和准货币(广义货币M2)同比增长(%)",
|
||||
"货币(狭义货币M1)(亿元)", "货币(狭义货币M1)同比增长(%)",
|
||||
"流通中现金(M0)(亿元)", "流通中现金(M0)同比增长(%)",
|
||||
"活期存款(亿元)", "活期存款同比增长(%)",
|
||||
"准货币(亿元)", "准货币同比增长(%)",
|
||||
"定期存款(亿元)", "定期存款同比增长(%)",
|
||||
"储蓄存款(亿元)", "储蓄存款同比增长(%)",
|
||||
"其他存款(亿元)", "其他存款同比增长(%)"
|
||||
],
|
||||
primary_key=[],
|
||||
order_by=" month desc "
|
||||
)
|
||||
)
|
||||
|
||||
# http://tushare.org/fundamental.html
|
||||
# 参考官网网站的文档,是最全的。
|
||||
STOCK_WEB_DATA_LIST.append(
|
||||
StockWebData(
|
||||
mode="query",
|
||||
type="基本面数据",
|
||||
name="股票列表",
|
||||
table_name="ts_stock_basics",
|
||||
columns=["code", "name", "industry", "area", "pe", "outstanding", "totals", "totalAssets", "liquidAssets",
|
||||
"fixedAssets", "reserved", "reservedPerShare", "esp", "bvps", "pb", "timeToMarket",
|
||||
"undp", "perundp", "rev", "profit", "gpr", "npr", "holders"],
|
||||
column_names=["代码", "名称", "所属行业", "地区", "市盈率", "流通股本(亿)", "总股本(亿)", "总资产(万)", "流动资产",
|
||||
"固定资产", "公积金", "每股公积金", "每股收益", "每股净资", "市净率", "上市日期", "未分利润",
|
||||
"每股未分配", "收入同比(%)", "利润同比(%)", "毛利率(%)", "净利润率(%)", "股东人数"
|
||||
],
|
||||
primary_key=[],
|
||||
order_by=" code asc "
|
||||
)
|
||||
)
|
||||
|
||||
# 业绩报告(主表)
|
||||
STOCK_WEB_DATA_LIST.append(
|
||||
StockWebData(
|
||||
mode="query",
|
||||
type="基本面数据",
|
||||
name="业绩报告(主表)",
|
||||
table_name="ts_report_data",
|
||||
columns=["quarter", "code", "name", "eps", "eps_yoy", "bvps", "roe", "epcf", "net_profits",
|
||||
"profits_yoy", "distrib", "report_date"],
|
||||
column_names=["季度", "代码", "名称", "每股收益", "每股收益同比(%)", "每股净资产", "净资产收益率(%)", "每股现金流量(元)", ",净利润(万元)",
|
||||
"净利润同比(%)", "分配方案", "发布日期"
|
||||
],
|
||||
primary_key=[],
|
||||
order_by=" quarter desc "
|
||||
)
|
||||
)
|
||||
|
||||
# 盈利能力
|
||||
STOCK_WEB_DATA_LIST.append(
|
||||
StockWebData(
|
||||
mode="query",
|
||||
type="基本面数据",
|
||||
name="盈利能力",
|
||||
table_name="ts_profit_data",
|
||||
columns=["quarter", "code", "name", "roe", "net_profit_ratio", "gross_profit_rate",
|
||||
"net_profits", "eps", "business_income", "bips"],
|
||||
column_names=["季度", "代码", "名称", "净资产收益率(%)", "净利率(%)", "毛利率(%)", "净利润(万元)",
|
||||
"每股收益", "营业收入(百万元)", "每股主营业务收入(元)"],
|
||||
primary_key=[],
|
||||
order_by=" quarter desc "
|
||||
)
|
||||
)
|
||||
|
||||
STOCK_WEB_DATA_LIST.append(
|
||||
StockWebData(
|
||||
mode="query",
|
||||
type="基本面数据",
|
||||
name="营运能力",
|
||||
table_name="ts_operation_data",
|
||||
columns=["quarter", "code", "name", "arturnover", "arturndays",
|
||||
"inventory_turnover", "inventory_days", "currentasset_turnover", "currentasset_days"],
|
||||
column_names=["季度", "代码", "名称", "应收账款周转率(次)", "应收账款周转天数(天)", "存货周转率(次)", "存货周转天数(天)",
|
||||
"流动资产周转率(次)", "流动资产周转天数(天)"
|
||||
],
|
||||
primary_key=[],
|
||||
order_by=" quarter desc "
|
||||
)
|
||||
)
|
||||
|
||||
STOCK_WEB_DATA_LIST.append(
|
||||
StockWebData(
|
||||
mode="query",
|
||||
type="基本面数据",
|
||||
name="成长能力",
|
||||
table_name="ts_growth_data",
|
||||
columns=["quarter", "code", "name", "mbrg", "nprg", "nav", "targ", "epsg", "seg"],
|
||||
column_names=["季度", "代码", "名称", "主营业务收入增长率(%)", "净利润增长率(%)", "净资产增长率", "总资产增长率",
|
||||
"每股收益增长率", "股东权益增长率"],
|
||||
primary_key=[],
|
||||
order_by=" quarter desc "
|
||||
)
|
||||
)
|
||||
|
||||
# "code", "name: pchange", "amount", "buy", "bratio", "sell", "sratio", "reason", "date"
|
||||
# 代码 名称 当日涨跌幅 龙虎榜成交额(万) 买入额(万) 买入占总成交比例 卖出额(万) 卖出占总成交比例 上榜原因 日期
|
||||
|
||||
|
||||
STOCK_WEB_DATA_LIST.append(
|
||||
StockWebData(
|
||||
mode="query",
|
||||
type="每日数据",
|
||||
name="龙虎榜",
|
||||
table_name="ts_top_list",
|
||||
columns=["date", "code", "name", "pchange", "amount", "buy", "bratio", "sell", "sratio", "reason"],
|
||||
column_names=["日期", "代码", "名称", "当日涨跌幅", "龙虎榜成交额(万)", "买入额(万)", "买入占总成交比例", "卖出额(万)",
|
||||
"卖出占总成交比例", "上榜原因"],
|
||||
primary_key=[],
|
||||
order_by=" date desc "
|
||||
)
|
||||
)
|
||||
# 实时行情
|
||||
STOCK_WEB_DATA_LIST.append(
|
||||
StockWebData(
|
||||
mode="query",
|
||||
type="每日数据",
|
||||
name="每日股票数据",
|
||||
table_name="ts_today_all",
|
||||
columns=["date", "code", "name", "changepercent", "trade", "open", "high", "low", "settlement", "volume",
|
||||
"turnoverratio", "amount", "per", "pb", "mktcap", "nmc"],
|
||||
column_names=["日期", "代码", "名称", "涨跌幅", "现价", "开盘价", "最高价", "最低价", "昨日收盘价", "成交量",
|
||||
"换手率", "成交金额", "市盈率", "市净率", "总市值", "流通市值"],
|
||||
primary_key=[],
|
||||
order_by=" date desc "
|
||||
)
|
||||
)
|
||||
# 大盘指数行情列表
|
||||
STOCK_WEB_DATA_LIST.append(
|
||||
StockWebData(
|
||||
mode="query",
|
||||
type="每日数据",
|
||||
name="每日大盘指数行情",
|
||||
table_name="ts_index_all",
|
||||
columns=["date", "code", "name", "change", "open", "preclose", "close", "high", "low", "volume", "amount"],
|
||||
column_names=["日期", "代码", "名称", "涨跌幅", "开盘点位", "昨日收盘点位", "收盘点位", "最高点位", "最低点位", "成交量(手)", "成交金额(亿元)"],
|
||||
primary_key=[],
|
||||
order_by=" date desc "
|
||||
)
|
||||
)
|
||||
|
||||
# 每日波峰波谷猜想
|
||||
STOCK_WEB_DATA_LIST.append(
|
||||
StockWebData(
|
||||
mode="query",
|
||||
type="每日数据猜想",
|
||||
name="每日波峰波谷猜想",
|
||||
table_name="guess_period_daily",
|
||||
columns=["date", "code", "name", "wave_base", "wave_crest", "wave_mean", "up_rate",
|
||||
"changepercent", "trade", "open", "high", "low", "settlement", "volume",
|
||||
"turnoverratio", "amount", "per", "pb", "mktcap", "nmc"],
|
||||
column_names=["日期", "代码", "名称", "5波峰平均", "5波谷平均", "价格平均", "上涨率猜想%",
|
||||
"涨跌幅", "现价", "开盘价", "最高价", "最低价", "昨日收盘价", "成交量",
|
||||
"换手率", "成交金额", "市盈率", "市净率", "总市值", "流通市值"],
|
||||
primary_key=[],
|
||||
order_by=" date desc "
|
||||
)
|
||||
)
|
||||
|
||||
# 每日收益率猜想。
|
||||
STOCK_WEB_DATA_LIST.append(
|
||||
StockWebData(
|
||||
mode="query",
|
||||
type="每日数据猜想",
|
||||
name="每日收益率猜想",
|
||||
table_name="guess_return_daily",
|
||||
columns=["date", "code", "name",
|
||||
"5d", "10d", "20d", "60d", "5-10d", "5-20d", "mov_vol", "return",
|
||||
"changepercent", "trade", "open", "high", "low", "settlement", "volume",
|
||||
"turnoverratio", "amount", "per", "pb", "mktcap", "nmc"],
|
||||
column_names=["日期", "代码", "名称",
|
||||
"5周线", "10半月线", "20月线", "60季度线", "5-10日差%", "5-20日差%", "收益", "收益率移动标准差",
|
||||
"涨跌幅", "现价", "开盘价", "最高价", "最低价", "昨日收盘价", "成交量",
|
||||
"换手率", "成交金额", "市盈率", "市净率", "总市值", "流通市值"],
|
||||
primary_key=[],
|
||||
order_by=" date desc "
|
||||
)
|
||||
)
|
||||
|
||||
# 每日股票指标lite猜想。
|
||||
STOCK_WEB_DATA_LIST.append(
|
||||
StockWebData(
|
||||
mode="query",
|
||||
type="每日数据猜想",
|
||||
name="每日股票指标lite猜想",
|
||||
table_name="guess_indicators_lite_daily",
|
||||
columns=["date", "code", "name", "changepercent", "trade", "open", "high", "low", "settlement", "volume",
|
||||
"turnoverratio", "amount", "per", "pb", "mktcap", "nmc",
|
||||
"kdjj", "rsi_6", "cci"],
|
||||
column_names=["日期", "代码", "名称",
|
||||
"涨跌幅", "现价", "开盘价", "最高价", "最低价", "昨日收盘价", "成交量",
|
||||
"换手率", "成交金额", "市盈率", "市净率", "总市值", "流通市值",
|
||||
"kdjj", "rsi_6", "cci"],
|
||||
primary_key=[],
|
||||
order_by=" date desc "
|
||||
)
|
||||
)
|
||||
|
||||
# 每日股票指标lite猜想买入。
|
||||
STOCK_WEB_DATA_LIST.append(
|
||||
StockWebData(
|
||||
mode="query",
|
||||
type="每日数据猜想",
|
||||
name="每日股票指标lite猜想买入",
|
||||
table_name="guess_indicators_lite_buy_daily",
|
||||
columns=["buy_date", "code", "name", "changepercent", "trade", "turnoverratio", "pb",
|
||||
"kdjj", "rsi_6", "cci", "wave_base", "wave_crest", "wave_mean", "up_rate", "buy", "sell",
|
||||
"today_trade", "income"],
|
||||
column_names=["购买日期", "代码", "名称", "涨跌幅", "现价", "换手率%", "市净率%",
|
||||
"买入kdjj", "买入rsi_6", "买入cci", "波谷", "波峰", "波平均", "上涨率%", "买入", "卖出", "今日价格", "收益"],
|
||||
primary_key=[],
|
||||
order_by=" buy_date desc "
|
||||
)
|
||||
)
|
||||
|
||||
# 每日股票指标lite猜想卖出。
|
||||
STOCK_WEB_DATA_LIST.append(
|
||||
StockWebData(
|
||||
mode="query",
|
||||
type="每日数据猜想",
|
||||
name="每日股票指标lite猜想卖出",
|
||||
table_name="guess_indicators_lite_sell_daily",
|
||||
columns=["date", "buy_date", "code", "name", "changepercent", "trade", "turnoverratio", "pb",
|
||||
"kdjj", "rsi_6", "cci", "wave_base", "wave_crest", "wave_mean", "up_rate", "buy", "sell",
|
||||
"today_trade", "income", "sell_cci", "sell_kdjj", "sell_rsi_6"],
|
||||
column_names=["日期", "购买日期", "代码", "名称", "涨跌幅", "现价", "换手率%", "市净率%",
|
||||
"买入kdjj", "买入rsi_6", "买入cci", "波谷", "波峰", "波平均", "上涨率%", "买入", "卖出", "今日价格", "收益",
|
||||
"卖出kdjj", "卖出rsi_6", "卖出cci", ],
|
||||
primary_key=[],
|
||||
order_by=" buy_date desc "
|
||||
)
|
||||
)
|
||||
|
||||
# 每日股票指标猜想。
|
||||
STOCK_WEB_DATA_LIST.append(
|
||||
StockWebData(
|
||||
mode="query",
|
||||
type="每日数据猜想",
|
||||
name="每日股票指标All猜想",
|
||||
table_name="guess_indicators_daily",
|
||||
columns=["date", "code", "name", "changepercent", "trade", "open", "high", "low", "settlement", "volume",
|
||||
"turnoverratio", "amount", "per", "pb", "mktcap", "nmc",
|
||||
'adx', 'adxr', 'boll', 'boll_lb', 'boll_ub', 'cci', 'cci_20', 'close_-1_r',
|
||||
'close_-2_r', 'code', 'cr', 'cr-ma1', 'cr-ma2', 'cr-ma3', 'date', 'dma', 'dx',
|
||||
'kdjd', 'kdjj', 'kdjk', 'macd', 'macdh', 'macds', 'mdi', 'pdi',
|
||||
'rsi_12', 'rsi_6', 'trix', 'trix_9_sma', 'vr', 'vr_6_sma', 'wr_10', 'wr_6'],
|
||||
column_names=["日期", "代码", "名称",
|
||||
"涨跌幅", "现价", "开盘价", "最高价", "最低价", "昨日收盘价", "成交量",
|
||||
"换手率", "成交金额", "市盈率", "市净率", "总市值", "流通市值",
|
||||
'adx', 'adxr', 'boll', 'boll_lb', 'boll_ub', 'cci', 'cci_20', 'close_-1_r',
|
||||
'close_-2_r', 'code', 'cr', 'cr-ma1', 'cr-ma2', 'cr-ma3', 'date', 'dma', 'dx',
|
||||
'kdjd', 'kdjj', 'kdjk', 'macd', 'macdh', 'macds', 'mdi', 'pdi',
|
||||
'rsi_12', 'rsi_6', 'trix', 'trix_9_sma', 'vr', 'vr_6_sma', 'wr_10', 'wr_6'],
|
||||
primary_key=[],
|
||||
order_by=" date desc "
|
||||
)
|
||||
)
|
||||
|
||||
STOCK_WEB_DATA_LIST.append(
|
||||
StockWebData(
|
||||
mode="query",
|
||||
type="每日数据Keras猜想",
|
||||
name="每日股票数据Keras猜想",
|
||||
table_name="guess_sklearn_ma_daily",
|
||||
columns=["date", "code", "name", "changepercent", "trade", "open", "high", "low", "settlement", "volume",
|
||||
"turnoverratio", "next_close", "sklearn_score", "up_rate"],
|
||||
column_names=["日期", "代码", "名称", "涨跌幅", "现价", "开盘价", "最高价", "最低价", "昨日收盘价", "成交量",
|
||||
"换手率", "预测收盘价", "sk概率", "预测上涨率"],
|
||||
primary_key=[],
|
||||
order_by=" date desc "
|
||||
)
|
||||
)
|
||||
|
||||
STOCK_WEB_DATA_MAP = {}
|
||||
WEB_EASTMONEY_URL = "http://quote.eastmoney.com/%s.html"
|
||||
# 再拼接成Map使用。
|
||||
for tmp in STOCK_WEB_DATA_LIST:
|
||||
try:
|
||||
# 增加columns 字段中的【东方财富】
|
||||
tmp_idx = tmp.columns.index("code")
|
||||
tmp.column_names.insert(tmp_idx + 1, "东方财富")
|
||||
except Exception as e:
|
||||
print("error :", e)
|
||||
|
||||
STOCK_WEB_DATA_MAP[tmp.table_name] = tmp
|
||||
|
||||
if len(tmp.columns) != len(tmp.column_names):
|
||||
print(u"error:", tmp.table_name, ",columns:", len(tmp.columns), ",column_names:", len(tmp.column_names))
|
||||
Reference in New Issue
Block a user