120 lines
3.9 KiB
Python
120 lines
3.9 KiB
Python
from datetime import timedelta
|
||
|
||
from DB.model.StockDailyFreq import get_stock_daily_freq
|
||
from DB.sqlite_db_main import SqliteDbMain, config
|
||
from utils.tdxUtil import TdxUtil
|
||
from utils.comm import *
|
||
from 基本信息入库 import StockInfoMain
|
||
|
||
|
||
class StockDailyFreqMain:
|
||
|
||
def __init__(self):
|
||
self.code_res = StockInfoMain().get_stock_basic()
|
||
self.db_main = SqliteDbMain(config.stock_daily_freq_db)
|
||
|
||
def __filter_stock(self, code, name):
|
||
if 'ST' in name:
|
||
return False
|
||
if code.startswith('30'):
|
||
return False
|
||
if code.startswith('68'):
|
||
return False
|
||
return True
|
||
|
||
def init_data(self):
|
||
"""
|
||
全量入库操作
|
||
:return:
|
||
"""
|
||
# Print the results
|
||
for result in self.code_res:
|
||
tdx_util = TdxUtil("")
|
||
s_type = tdx_util.get_security_type(code=result.ts_code)
|
||
if s_type in tdx_util.SECURITY_TYPE and self.__filter_stock(result.ts_code, result.name):
|
||
# 设置开始和结束时间
|
||
start_time = f"{(datetime.now() - timedelta(days=365 * 3)).strftime('%Y-%m-%d')} 09:30:00"
|
||
end_time = f"{datetime.now().strftime('%Y-%m-%d')} 15:00:00"
|
||
print(
|
||
f"{result.id},{result.ts_code} --> start_time={trade_date} 09:30:00 --->> end_time={trade_date} 15:00:00")
|
||
i = 0
|
||
df = None
|
||
while True:
|
||
try:
|
||
if i > 6:
|
||
break
|
||
df = xcsc_pro.stk_mins(ts_code=result.ts_code, freq='30min',
|
||
start_time=start_time,
|
||
end_time=end_time)[::-1]
|
||
except Exception as e:
|
||
i += 1
|
||
# 捕获超时异常
|
||
print("请求超时,等待2分钟后重试...")
|
||
time.sleep(120) # 休眠2分钟
|
||
print(f"{result.ts_code},{result.name} 获取 stk_mins _ 30 数据完毕!")
|
||
# 创建表
|
||
table_name = str(result.ts_code).split(".")[0] + "_daily_freq_30"
|
||
new_table_class = get_stock_daily_freq(table_name=table_name)
|
||
self.db_main.create_table(new_table_class)
|
||
entries = []
|
||
for index, row in df.iterrows():
|
||
min_time = row['trade_time']
|
||
# 将字符串解析为日期时间对象
|
||
trade_time = datetime.strptime(min_time, '%Y-%m-%d %H:%M:%S').strftime('%Y-%m-%d')
|
||
entry = new_table_class(
|
||
trade_date=trade_time,
|
||
time=min_time,
|
||
open=row['open'],
|
||
close=row['close'],
|
||
high=row['high'],
|
||
low=row['low'],
|
||
vol=row['vol'],
|
||
amount=row['amount'],
|
||
)
|
||
print(entry.to_dict())
|
||
entries.append(entry)
|
||
self.db_main.insert_all_entry(entries)
|
||
|
||
def task_data(self, trade_date=datetime.now().strftime('%Y%m%d')):
|
||
print(len(self.code_res))
|
||
for result in self.code_res:
|
||
tdx_util = TdxUtil("")
|
||
s_type = tdx_util.get_security_type(code=result.ts_code)
|
||
if s_type in tdx_util.SECURITY_TYPE and self.__filter_stock(result.ts_code, result.name):
|
||
print(
|
||
f"{result.id},{result.ts_code} --> start_time={trade_date} 09:30:00 --->> end_time={trade_date} 15:00:00")
|
||
|
||
df = xcsc_pro.stk_mins(ts_code=result.ts_code, freq='30min',
|
||
start_time=f"{trade_date} 09:30:00",
|
||
end_time=f"{trade_date} 15:00:00")
|
||
print(f"{result.ts_code},{result.name} 获取 stk_mins _ 30 数据完毕!")
|
||
for index, row in df.iterrows():
|
||
table_name = str(result.ts_code).split(".")[0] + "_daily_freq_30"
|
||
new_table_class = get_stock_daily_freq(table_name=table_name)
|
||
entry = new_table_class(
|
||
trade_date=trade_date,
|
||
time=row['trade_time'],
|
||
open=row['open'],
|
||
close=row['close'],
|
||
high=row['high'],
|
||
low=row['low'],
|
||
vol=row['vol'],
|
||
amount=row['amount'],
|
||
)
|
||
print(entry.to_dict())
|
||
self.db_main.insert_entry(entry)
|
||
|
||
|
||
if __name__ == '__main__':
|
||
current_date = datetime.now()
|
||
if if_run(current_date):
|
||
trade_date = current_date.strftime('%Y-%m-%d')
|
||
print(trade_date)
|
||
main = StockDailyFreqMain()
|
||
# main.init_data()
|
||
main.task_data(trade_date)
|
||
|
||
# df = xcsc_pro.stk_mins(ts_code='600095.SH', start_time='2022-08-24 09:30:00', end_time='2023-08-24 15:00:00',
|
||
# freq='30min')
|
||
# print(df)
|