fa45d8aa5f
- health_checklist.json: 192.168.1.122→node122
- ocr_client.py: docstring IP→node122
- docs/market-data-requirements.md: IP→node122
- 所有API调用通过ProxyHandler({})绕过系统代理
Privoxy对node122:18003返回500,直连正常
154 lines
4.7 KiB
Python
154 lines
4.7 KiB
Python
#!/usr/bin/env python
|
||
# -*- coding:utf-8 -*-
|
||
"""
|
||
Date: 2019/9/30 13:58
|
||
Desc: 期权配置文件
|
||
"""
|
||
|
||
import datetime
|
||
import json
|
||
import os
|
||
import re
|
||
|
||
# 中国金融期货交易所
|
||
|
||
CFFEX_OPTION_URL_300 = "http://www.cffex.com.cn/quote_IO.txt"
|
||
|
||
# 深圳证券交易所
|
||
|
||
SZ_OPTION_URL_300 = "http://www.szse.cn/api/report/ShowReport?SHOWTYPE=xlsx&CATALOGID=ysplbrb&TABKEY=tab1&random=0.10432465776720479"
|
||
|
||
# 上海证券交易所
|
||
|
||
SH_OPTION_URL_50 = "http://yunhq.sse.com.cn:32041/v1/sh1/list/self/510050"
|
||
SH_OPTION_URL_KING_50 = "http://yunhq.sse.com.cn:32041/v1/sho/list/tstyle/510050_{}"
|
||
|
||
SH_OPTION_URL_300 = "http://yunhq.sse.com.cn:32041/v1/sh1/list/self/510300"
|
||
SH_OPTION_URL_KING_300 = "http://yunhq.sse.com.cn:32041/v1/sho/list/tstyle/510300_{}"
|
||
|
||
SH_OPTION_URL_500 = "http://yunhq.sse.com.cn:32041/v1/sh1/list/self/510500"
|
||
SH_OPTION_URL_KING_500 = "http://yunhq.sse.com.cn:32041/v1/sho/list/tstyle/510500_{}"
|
||
|
||
SH_OPTION_URL_KC_50 = "http://yunhq.sse.com.cn:32041/v1/sh1/list/self/588000"
|
||
SH_OPTION_URL_KC_KING_50 = "http://yunhq.sse.com.cn:32041/v1/sho/list/tstyle/588000_{}"
|
||
|
||
SH_OPTION_URL_KC_50_YFD = "http://yunhq.sse.com.cn:32041/v1/sh1/list/self/588080"
|
||
SH_OPTION_URL_KING_50_YFD = "http://yunhq.sse.com.cn:32041/v1/sho/list/tstyle/588080_{}"
|
||
|
||
SH_OPTION_PAYLOAD = {
|
||
"select": "select: code,name,last,change,chg_rate,amp_rate,volume,amount,prev_close"
|
||
}
|
||
|
||
SH_OPTION_PAYLOAD_OTHER = {"select": "contractid,last,chg_rate,presetpx,exepx"}
|
||
|
||
|
||
# 大连商品交易所
|
||
DCE_OPTION_URL = "http://portal.dce.com.cn/publicweb/quotesdata/dayQuotesCh.html"
|
||
DCE_DAILY_OPTION_URL = (
|
||
"http://portal.dce.com.cn/publicweb/quotesdata/exportDayQuotesChData.html"
|
||
)
|
||
|
||
# 上海期货交易所
|
||
SHFE_OPTION_URL = "https://tsite.shfe.com.cn/data/dailydata/option/kx/kx{}.dat"
|
||
|
||
# 郑州商品交易所
|
||
CZCE_DAILY_OPTION_URL_3 = (
|
||
"http://www.czce.com.cn/cn/DFSStaticFiles/Option/{}/{}/OptionDataDaily.txt"
|
||
)
|
||
|
||
# PAYLOAD
|
||
SHFE_HEADERS = {"User-Agent": "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)"}
|
||
|
||
DATE_PATTERN = re.compile(r"^([0-9]{4})[-/]?([0-9]{2})[-/]?([0-9]{2})")
|
||
|
||
|
||
def convert_date(date):
|
||
"""
|
||
transform a date string to datetime.date object
|
||
:param date, string, e.g. 2016-01-01, 20160101 or 2016/01/01
|
||
:return: object of datetime.date(such as 2016-01-01) or None
|
||
"""
|
||
if isinstance(date, datetime.date):
|
||
return date
|
||
elif isinstance(date, str):
|
||
match = DATE_PATTERN.match(date)
|
||
if match:
|
||
groups = match.groups()
|
||
if len(groups) == 3:
|
||
return datetime.date(
|
||
year=int(groups[0]), month=int(groups[1]), day=int(groups[2])
|
||
)
|
||
return None
|
||
|
||
|
||
def get_json_path(name, module_file):
|
||
"""
|
||
获取 JSON 配置文件的路径(从模块所在目录查找)
|
||
:param name: 文件名
|
||
:param module_file: filename
|
||
:return: str json_file_path
|
||
"""
|
||
module_folder = os.path.abspath(os.path.dirname(os.path.dirname(module_file)))
|
||
module_json_path = os.path.join(module_folder, "file_fold", name)
|
||
return module_json_path
|
||
|
||
|
||
def get_calendar():
|
||
"""
|
||
获取交易日历至 2019 年结束, 这里的交易日历需要按年更新
|
||
:return: json
|
||
"""
|
||
setting_file_name = "calendar.json"
|
||
setting_file_path = get_json_path(setting_file_name, __file__)
|
||
return json.load(open(setting_file_path, "r"))
|
||
|
||
|
||
def last_trading_day(day):
|
||
"""
|
||
获取前一个交易日
|
||
:param day: "%Y%m%d" or datetime.date()
|
||
:return last_day: "%Y%m%d" or datetime.date()
|
||
"""
|
||
calendar = get_calendar()
|
||
|
||
if isinstance(day, str):
|
||
if day not in calendar:
|
||
print("Today is not trading day:" + day)
|
||
return False
|
||
pos = calendar.index(day)
|
||
last_day = calendar[pos - 1]
|
||
return last_day
|
||
|
||
elif isinstance(day, datetime.date):
|
||
d_str = day.strftime("%Y%m%d")
|
||
if d_str not in calendar:
|
||
print("Today is not working day:" + d_str)
|
||
return False
|
||
pos = calendar.index(d_str)
|
||
last_day = calendar[pos - 1]
|
||
last_day = datetime.datetime.strptime(last_day, "%Y%m%d").date()
|
||
return last_day
|
||
|
||
|
||
def get_latest_data_date(day):
|
||
"""
|
||
获取最新的有数据的交易日
|
||
:param day: datetime.datetime
|
||
:return string YYYYMMDD
|
||
"""
|
||
calendar = get_calendar()
|
||
if day.strftime("%Y%m%d") in calendar:
|
||
if day.time() > datetime.time(17, 0, 0):
|
||
return day.strftime("%Y%m%d")
|
||
else:
|
||
return last_trading_day(day.strftime("%Y%m%d"))
|
||
else:
|
||
while day.strftime("%Y%m%d") not in calendar:
|
||
day = day - datetime.timedelta(days=1)
|
||
return day.strftime("%Y%m%d")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
d = datetime.datetime(2018, 10, 5, 17, 1, 0)
|
||
print(get_latest_data_date(d))
|