|
|
|
|
|
"""
|
|
|
|
|
|
验证器模块
|
|
|
|
|
|
"""
|
|
|
|
|
|
import re
|
|
|
|
|
|
from datetime import date
|
|
|
|
|
|
from typing import Tuple, Optional
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def validate_code_format(code: str) -> Tuple[bool, str]:
|
|
|
|
|
|
"""
|
|
|
|
|
|
验证代码格式
|
|
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
(是否有效, 错误信息)
|
|
|
|
|
|
"""
|
|
|
|
|
|
if not code:
|
|
|
|
|
|
return False, "代码不能为空"
|
|
|
|
|
|
|
|
|
|
|
|
# 股票代码格式: 000001.SZ, 600000.SH
|
|
|
|
|
|
stock_pattern = r"^\d{6}\.(SZ|SH|BJ)$"
|
|
|
|
|
|
|
|
|
|
|
|
# 期货代码格式: IF2501.CFE
|
|
|
|
|
|
future_pattern = r"^[A-Z]{1,2}\d{4}\.CFE$"
|
|
|
|
|
|
|
|
|
|
|
|
if re.match(stock_pattern, code):
|
|
|
|
|
|
return True, ""
|
|
|
|
|
|
|
|
|
|
|
|
if re.match(future_pattern, code):
|
|
|
|
|
|
return True, ""
|
|
|
|
|
|
|
|
|
|
|
|
return False, f"无效的代码格式: {code}"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def validate_date_range(start_date: date, end_date: date) -> Tuple[bool, str]:
|
|
|
|
|
|
"""
|
|
|
|
|
|
验证日期范围
|
|
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
(是否有效, 错误信息)
|
|
|
|
|
|
"""
|
|
|
|
|
|
if start_date > end_date:
|
|
|
|
|
|
return False, "开始日期不能晚于结束日期"
|
|
|
|
|
|
|
|
|
|
|
|
# 检查日期范围是否合理(不超过5年)
|
|
|
|
|
|
from datetime import timedelta
|
|
|
|
|
|
if (end_date - start_date).days > 365 * 5:
|
|
|
|
|
|
return False, "日期范围不能超过5年"
|
|
|
|
|
|
|
|
|
|
|
|
return True, ""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def validate_period_type(period: str) -> Tuple[bool, str]:
|
|
|
|
|
|
"""
|
|
|
|
|
|
验证周期类型
|
|
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
(是否有效, 错误信息)
|
|
|
|
|
|
"""
|
|
|
|
|
|
valid_periods = ["daily", "min1", "min5", "min15", "min30", "min60"]
|
|
|
|
|
|
|
|
|
|
|
|
if period not in valid_periods:
|
|
|
|
|
|
return False, f"无效的周期类型: {period},有效值: {', '.join(valid_periods)}"
|
|
|
|
|
|
|
|
|
|
|
|
return True, ""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def validate_security_type(security_type: str) -> Tuple[bool, str]:
|
|
|
|
|
|
"""
|
|
|
|
|
|
验证证券类型
|
|
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
(是否有效, 错误信息)
|
|
|
|
|
|
"""
|
|
|
|
|
|
valid_types = ["stock", "future", "index", "etf", "kzz"]
|
|
|
|
|
|
|
|
|
|
|
|
if security_type not in valid_types:
|
|
|
|
|
|
return False, f"无效的证券类型: {security_type},有效值: {', '.join(valid_types)}"
|
|
|
|
|
|
|
|
|
|
|
|
return True, ""
|