Initial commit: cc-cursor 全链路量化研究平台

7 Sprints 全部完成:
  Sprint 0: 基础设施 (DataManager + MariaDB)
  Sprint 1: 因子引擎 (34因子/12分类)
  Sprint 2: VectorBT 回测 (5策略+截面)
  Sprint 3: Optuna 优化 (+Walk-Forward)
  Sprint 4: ML 模型 (LightGBM+CatBoost)
  Sprint 5: Qwen 情绪因子 (三源新闻+日期对齐)
  Sprint 6: Agent 系统 (4Agent+日报.md/.html)

生产加固 (15项): Tushare双源fallback, SSH自动恢复, pool_pre_ping,
  save_daily先删后插, load_dotenv绝对路径, 日报5d/20d修复,
  RiskAgent改上证指数, 昨日对比+数据截止, mac_report utf8mb4,
  CLAUDE-*.md 9条已知Bug, demo全参数化, djapi数据源归一化,
  indexDatas API修正

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-06-07 15:59:05 +08:00
co-authored by Claude Opus 4.7
commit 271a9343a5
293 changed files with 59598 additions and 0 deletions
+125
View File
@@ -0,0 +1,125 @@
import pandas as pd
# 将项目根目录添加到 sys.path
#project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
#sys.path.append(project_root)
# 导入当站目录的config文件
try:
# 尝试相对导入(作为包的一部分)
from .config import TS_TOKEN, START_DATE, END_DATE
from .stock_utils import dataCorrect,get_trading_dates,tscodeCheck
except (ImportError, SystemError):
# 失败则使用绝对导入(直接运行脚本)
from config import TS_TOKEN, START_DATE, END_DATE
from stock_utils import dataCorrect,get_trading_dates,tscodeCheck
from .data_source import get_tushare_pro
pro = get_tushare_pro()
def getStockMargin(tscode: str, start_date: str=START_DATE, end_date: str=END_DATE) -> pd.DataFrame:
"""
获取指定股票代码在时间区间内的每日融资明细数据
参数:
tscode (str): 股票代码,格式如 '600000.SH'
start_date (str): 开始日期,格式 'YYYY-MM-DD'
end_date (str): 结束日期,格式 'YYYY-MM-DD'
返回:
pd.DataFrame: 包含融资明细数据的DataFrame,列包括:
- trade_date: 交易日期
- tscode: 股票代码
- rzye: 融资余额(元)
- rqye float 融券余额(元)
- rzmre float 融资买入额(元)
- rqyl float 融券余量(股)
- rzche float 融资偿还额(元)
- rqchl float 融券偿还量(股)
- rqmcl float 融券卖出量(股,份,手)
- rzrqye float 融资融券余额(元)
异常处理:
- 若tushare接口调用失败,打印错误信息并返回空DataFrame
"""
try:
tscode=tscodeCheck(tscode)
# 调用tushare接口
df = pro.margin_detail(ts_code=tscode, start_date=start_date, end_date=end_date)
cols=["rzye","rqye","rzmre","rqyl","rzche","rqchl","rqmcl","rzrqye"]
df = dataCorrect(df,cols)
if df.empty:
print(f"未找到{tscode}{start_date}{end_date}期间的融资数据")
return df
except Exception as e:
print(f"获取融资数据失败: {e}")
return pd.DataFrame()
def getDailyMargin(trade_date: str = None, start_date: str = None, end_date: str = None, exchange_id: str = None) -> pd.DataFrame:
"""
获取指定日期或时间区间内的每日融资明细数据
参数:
trade_date (str, optional): 指定单个交易日,格式 'YYYY-MM-DD'。与start_date/end_date互斥
start_date (str, optional): 开始日期,格式 'YYYY-MM-DD'。需与end_date同时使用
end_date (str, optional): 结束日期,格式 'YYYY-MM-DD'。需与start_date同时使用
exchange_id (str, optional): 交易所代码,如 'SSE'(上交所)、'SZSE'(深交所)
返回:
pd.DataFrame: 包含每日融资明细数据的DataFrame,列包括:
- exchange_id: 交易所代码
- trade_date: 交易日期
- rzye: 融资余额(元)
- rqye: 融券余额(元)
- rzmre: 融资买入额(元)
- rqyl: 融券余量(股)
- rzche: 融资偿还额(元)
- rqchl: 融券偿还量(股)
- rqmcl: 融券卖出量(股,份,手)
- rzrqye: 融资融券余额(元)
异常处理:
- 若参数组合无效,打印错误信息并返回空DataFrame
- 若tushare接口调用失败,打印错误信息并返回空DataFrame
"""
try:
# 日期格式转换
if trade_date:
trade_date = trade_date.replace("-", "")
if start_date:
start_date = start_date.replace("-", "")
if end_date:
end_date = end_date.replace("-", "")
# 参数校验
if trade_date and (start_date or end_date):
print("错误:trade_date不能与start_date/end_date同时使用")
return pd.DataFrame()
if (start_date and not end_date) or (end_date and not start_date):
print("错误:start_date和end_date必须同时使用")
return pd.DataFrame()
# 调用tushare接口
df = pro.margin(exchange_id=exchange_id,
trade_date=trade_date,
start_date=start_date,
end_date=end_date)
if df.empty:
print("未找到符合条件的融资数据")
return df
except Exception as e:
print(f"获取每日融资数据失败: {e}")
return pd.DataFrame()
if __name__ == "__main__":
# 测试getStockMargin函数
test_code = "600000.SH"
test_start = "20150101"
test_end = "20250731"
result = getStockMargin(test_code, test_start, test_end)
print("返回结果示例:")
print(result.head())
if not result.empty:
print(f"\n返回数据行数: {len(result)}")