qnloft-stock/fp/分钟线数据入库.py

120 lines
3.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)