diff --git a/__pycache__/Ashare.cpython-36.pyc b/__pycache__/Ashare.cpython-36.pyc new file mode 100644 index 0000000..fda365e Binary files /dev/null and b/__pycache__/Ashare.cpython-36.pyc differ diff --git a/daily.py b/daily.py new file mode 100644 index 0000000..8305d26 --- /dev/null +++ b/daily.py @@ -0,0 +1,13 @@ +from Ashare import * + +df=get_price('sh000001',frequency='1d',count=10) +print('上证\n',df) + +df=get_price('sh601012',frequency='1d',count=10) +print('LONGJI\n',df) + +df=get_price('sh600438',frequency='1d',count=10) +print('TONGWEI\n',df) + +df=get_price('sz300274',frequency='1d',count=10) +print('sunshine\n',df) \ No newline at end of file diff --git a/insert_detail.py b/insert_detail.py new file mode 100644 index 0000000..83bf093 --- /dev/null +++ b/insert_detail.py @@ -0,0 +1,81 @@ +#!/usr/bin/evn python + +import sys +import MySQLdb +import time +import warnings + +warnings.filterwarnings("ignore") + +class Insertion(object): + + default_charset = 'utf8' + + db_server_host = "10.2.4.31" + db_user = "rd_dis_all" + db_passwd = "edAOgKmF6yFMpFmM" + + + db_name = "disconf" + table_op_price = "env" + + def __init__(self): + # 分页条数 + self.page_size = 100 + self.default_app_name = '' if len(sys.argv) == 1 else sys.argv[1] + + + # 比较逻辑 + def diff(self): + # connection + default_conn = MySQLdb.connect( + host = self.db_server_host, + user = self.db_user, + passwd = self.db_passwd, + db = self.db_name, + charset = self.default_charset + ) + + # 游标 + default_cursor = default_conn.cursor() + + default_cursor.execute("select code, price from " + self.disconf_table_env) + result_set = default_cursor.fetchall() + for item in result_set: + try: + print("diff logic") + except Exception as e: + print(e) + time.sleep(5) + + + # 插入记录表 + def insert(self, code, price): + # connection + default_conn = MySQLdb.connect( + host = self.db_server_host, + user = self.db_user, + passwd = self.db_passwd, + db = self.db_name, + charset = self.default_charset + ) + + # 游标 + default_cursor = default_conn.cursor() + try: + print("------开始插入------") + missconf_insert_config_sql = "INSERT INTO `config` (`code`, `price`) VALUES (" + str(code) + "," + str(price) + "')" + print("missconf_insert_config_sql:", missconf_insert_config_sql) + default_cursor.execute(missconf_insert_config_sql) + default_conn.commit() + except Exception as e: + print (e) + time.sleep(5) + default_cursor = default_conn.cursor() + + default_cursor.close() + default_conn.close() + +if __name__ == '__main__': + configMigration = Insertion() + configMigration.migrationConfig() \ No newline at end of file diff --git a/super-level-2.py b/super-level-2.py new file mode 100644 index 0000000..ec3cad6 --- /dev/null +++ b/super-level-2.py @@ -0,0 +1,77 @@ +import requests + +hk_sina_stock_list_url = "http://vip.stock.finance.sina.com.cn/quotes_service/api/json_v2.php/Market_Center.getHKStockData" +hk_sina_stock_dict_payload = { + "page": "1", + "num": "3000", + "sort": "symbol", + "asc": "1", + "node": "qbgg_hk", + "_s_r_a": "page" +} + +def sina_hk_real(): + """ + 新浪财经-港股的所有港股的实时行情数据 + http://vip.stock.finance.sina.com.cn/mkt/#qbgg_hk + :return: 实时行情数据 + :rtype: [] + """ + res = requests.get(hk_sina_stock_list_url, params=hk_sina_stock_dict_payload) + if res.status_code != 200: + logging.error(f"sina_hk_real/status_code:{res.status_code}/text:{res.text}") + return [] + else: + try: + data_json = res.json() + """ + {'symbol': '00021', # 港股代码 + 'name': '大中华地产控股', # 中文名称 + 'engname': 'GREAT CHI PPT', # 英文名称 + 'tradetype': 'EQTY', # 交易类型 + 'lasttrade': '0.000', # 最新价 + 'prevclose': '0.118', # 前一个交易日收盘价 + 'open': '0.000', # 开盘价 + 'high': '0.000', # 最高价 + 'low': '0.000', # 最低价 + 'volume': '0', # 成交量(万) + 'currentvolume': '0', # 每手股数 + 'amount': '0', # 成交额(万) + 'ticktime': '2022-04-08 10:54:17', # 当前数据时间戳 + 'buy': '0.115', # 买一 + 'sell': '0.120', # 卖一 + 'high_52week': '0.247', # 52周最高价 + 'low_52week': '0.110', # 52周最低价 + 'eps': '-0.003', # 每股收益 + 'dividend': None, # 股息 + 'stocks_sum': '3975233406', + 'pricechange': '0.000', # 涨跌额 + 'changepercent': '0.0000000', # 涨跌幅 + 'market_value': '0.000', # 港股市值 + 'pe_ratio': '0.0000000' + } + """ + except Exception as e: + logging.error(f"sina_hk_real/error: res.json()/detail:{e.__str__()}") + return [] + res = [ + {"stock_code": d["symbol"], + "name": d["name"], + "eng_name": d["engname"], + "date": d["ticktime"][:10], + "time": d["ticktime"][11:], + "now": float(d["lasttrade"]), + "open": float(d["open"]), + "close": float(d["prevclose"]), + "high": float(d["high"]), + "low": float(d["low"]), + "volume": float(d["amount"]) * 10000, + "turnover": float(d["volume"]) * 10000, + "buy": float(d["buy"]), + "sell": float(d["sell"]), + "change": float(d["pricechange"]), + "change_rate": float(d["changepercent"]), + "stock_type": "hk"} + for d in data_json + ] + return res \ No newline at end of file diff --git a/super-level.py b/super-level.py new file mode 100644 index 0000000..85e4302 --- /dev/null +++ b/super-level.py @@ -0,0 +1,83 @@ +import sys +import json,requests,datetime; +import pandas as pd + +class SuperLevel(object): + + stock_pool_hold = {'sh000001':'指数','sh601012':'隆基股份','sz300274':'阳光电源','sh600438':'通威股份','sh603098':'森特股份','sz002459':'晶澳股份','sz000762':'西藏矿业'} + # stock_pool_hold_name = ['隆基股份','阳光电源','通威股份','森特股份','晶澳股份','西藏矿业'] + + + def get_price(self, end_date='',count=10, frequency='1d', fields=[]): + if frequency in ['1m','5m','15m','30m','60m']: + try: + return self.get_price_sina(end_date=end_date,count=count,frequency=frequency) + except: + return self.get_price_sina(end_date=end_date,count=count,frequency=frequency) + + def get_price_sina(self, end_date='', count=10, frequency='60m'): + + frequency=frequency.replace('1d','240m').replace('1w','1200m').replace('1M','7200m'); mcount=count + + ts=int(frequency[:-1]) if frequency[:-1].isdigit() else 1 + + if (end_date!='') & (frequency in ['240m','1200m','7200m']): + end_date=pd.to_datetime(end_date) if not isinstance(end_date,datetime.date) else end_date + unit=4 if frequency=='1200m' else 29 if frequency=='7200m' else 1 + count=count+(datetime.datetime.now()-end_date).days//unit + + dataList = {} + for code in self.stock_pool_hold: + + xcode = code.replace('.XSHG','').replace('.XSHE','') + + xcode = 'sh'+xcode if ('XSHG' in code) else 'sz'+xcode if ('XSHE' in code) else code + + URL = f'http://money.finance.sina.com.cn/quotes_service/api/json_v2.php/CN_MarketData.getKLineData?symbol={code}&scale={ts}&ma=5&datalen={count}' + dstr = json.loads(requests.get(URL).content); + + for key in dstr: + timeStemp = key['day'] + closePrice = key['close'] + priceArr = dataList[timeStemp] if (timeStemp in dataList) else {} + priceArr[code] = closePrice + dataList[timeStemp] = priceArr + + dataArr = [] + for key in dataList: + data = {} + data['day'] = key + for item in dataList[key]: + itemKey = self.stock_pool_hold[item] + data[itemKey] = dataList[key][item] + dataArr.append(data) + + dynamicColumns = [] + dynamicColumns.append('day') + for code in self.stock_pool_hold: + dynamicColumns.append(self.stock_pool_hold[code]) + + + pd.set_option('display.unicode.east_asian_width', True) + pd.set_option('display.unicode.east_asian_width', True) + df= pd.DataFrame(dataArr, columns = dynamicColumns) + + df.day=pd.to_datetime(df.day); + + df.set_index(['day'], inplace=True); + + df.index.name='' + + return df + + def stockDetail(self, v1, v2): + df = self.get_price(frequency=v1,count=v2) + print('super-level:\n', df) + + + +if __name__ == "__main__": + frequency = sys.argv[1] if(len(sys.argv) > 1 ) else '5' + count = sys.argv[2] if(len(sys.argv) > 2) else 10 + superLevel = SuperLevel() + superLevel.stockDetail(frequency+'m', count) diff --git a/superLevel3.py b/superLevel3.py new file mode 100644 index 0000000..fb18f63 --- /dev/null +++ b/superLevel3.py @@ -0,0 +1,73 @@ +import sys +import json +import requests +import datetime +import pandas as pd +import time +import sched + +class SuperLevel(object): + + stock_pool_hold = {'sh000001':'指数','sh601012':'隆基股份','sz300274':'阳光电源','sh600438':'通威股份','sh603098':'森特股份','sz002459':'晶澳股份','sz000762':'西藏矿业','hk01880':'中国中免','hk06610':'飞天云动', 'hk01810':'小米'} + + def get_price(self): + + now = datetime.datetime.now() + + dataList = {} + timeStemp = now.strftime("%d/%m/%Y %H:%M:%S") + + for code in self.stock_pool_hold: + URL = f'http://qt.gtimg.cn/q=s_{code}' + dstr = requests.get(URL).content.decode('gb2312') + key = dstr.split('=')[0].split("_")[2] + price = dstr.split('=')[1].replace('"','').split('~')[3] + priceArr = dataList[timeStemp] if (timeStemp in dataList) else {} + priceArr[key] = price + dataList[timeStemp] = priceArr + + dataArr = [] + for key in dataList: + data = {} + data['day'] = key + for item in dataList[key]: + itemKey = self.stock_pool_hold[item] + data[itemKey] = dataList[key][item] + dataArr.append(data) + + dynamicColumns = [] + dynamicColumns.append('day') + for code in self.stock_pool_hold: + dynamicColumns.append(self.stock_pool_hold[code]) + + + pd.set_option('display.unicode.east_asian_width', True) + pd.set_option('display.unicode.east_asian_width', True) + df= pd.DataFrame(dataArr, columns = dynamicColumns) + + df.day=pd.to_datetime(df.day); + + df.set_index(['day'], inplace=True); + + df.index.name='' + + return df + + def stockDetail(self): + df = self.get_price() + print('super-level-3:\n', df) + + def time_printer(self): + now = datetime.datetime.now() + ts = now.strftime('%Y-%m-%d %H:%M:%S') + self.stockDetail() + self.loop_monitor() + + def loop_monitor(self): + s = sched.scheduler(time.time, time.sleep) + s.enter(5, 1, self.time_printer, ()) + s.run() + +if __name__ == "__main__": + superLevel = SuperLevel() + superLevel.loop_monitor() \ No newline at end of file