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)}")