import requests import pandas as pd from datetime import datetime, timedelta from io import StringIO def get_futures_data(symbol, start_date, end_date, kline_period='1m', adjust_type='0', depth='no'): """ 获取期货数据 """ # 构建请求参数 params = { 'username': username, 'password': password, 'symbol': symbol, 'start_date': start_date, 'end_date': end_date, 'kline_period': kline_period, 'adjust_type': adjust_type } if depth: params['Depth'] = depth print("请求参数:", params) # 打印请求参数,便于调试 try: # 发送请求,设置超时时间为30秒 response = requests.get(base_url, params=params, timeout=300) # 检查响应状态 if response.status_code == 200: # 检查响应是否为JSON格式 if 'application/json' in response.headers.get('Content-Type', ''): data = pd.read_json(StringIO(response.text), orient='records') data=data.reset_index() #列名排序 if depth=='yes': columns=['datetime','symbol','open','high','low','close','volume','amount','openint','cumulative_openint','open_askp','open_bidp','close_askp','close_bidp','开仓','平仓','多开','空开','多平','空平','双开','双平','双换','B','S','未知'] else: columns=['datetime','symbol','open','high','low','close','volume','amount','openint','cumulative_openint','open_askp','open_bidp','close_askp','close_bidp'] # 重新排列列名 data = data.reindex(columns=columns) data['datetime'] = pd.to_datetime(data['datetime']) # 更改时间显示的格式,例如 "YYYY-MM-DD HH:MM:SS" # 将 UTC 时间转换为本地时区,例如 'Asia/Shanghai' data['datetime'] = data['datetime'].dt.tz_convert('Asia/Shanghai') data['datetime'] = data['datetime'].dt.strftime('%Y-%m-%d %H:%M:%S') return data else: print("响应不是JSON格式:", response.text[:1000]) return None elif response.status_code == 401: print("认证失败:用户名和密码不能为空") return None elif response.status_code == 402: print("认证失败:账号不存在,请检查账号后重新输入......如还有问题联系管理员微信:viquant01") return None elif response.status_code == 405: print("认证失败:账号已过期,请联系管理员微信:viquant01") return None elif response.status_code == 406: print("认证失败:密码错误,请检查密码后重新输入......如还有问题联系管理员微信:viquant01") return None else: print(f"请求失败,状态码:{response.status_code}") print(f"错误信息:{response.json().get('error', '未知错误')}") return None except Exception as e: print(f"发生错误:{e}") print("请求URL:", response.url) print("响应内容:", response.text[:1000]) # 打印前1000个字符 return None # 使用示例 if __name__ == "__main__": # API配置 base_url = 'http://kanpan789.com:8086/ftdata' # 用户认证信息 username = '240884432@qq.com' # 替换为你的手机号或者邮箱 password = 'Zj123!@#' # 替换为你的密码 # 示例参数 symbol = "IM888" # start_date = "2025-10-01" #start_date : 开始时间 end_date = "2025-10-10" #end_date(包含当天):结束时间 kline_period="15M" #周期:1M..5M..NM(分钟),1D(天),1W(周),1Y(月) adjust_type= 0 #复权开关 :0(不复权)1(后复权) depth='yes' # 获取交易数据统计: yes(获取),no(不获取) # 获取K线数据 df_data = get_futures_data( symbol=symbol, start_date=start_date, end_date=end_date, kline_period=kline_period, adjust_type=adjust_type, depth=depth ) if df_data is not None: print("\nK线数据示例:") print(df_data) print(f"\n数据条数:{len(df_data)}") # 保存到CSV文件(可选) csv_filename = f"{symbol}_{start_date}_{end_date}_1m.csv" df_data.to_csv(csv_filename, index=False) print(f"\n数据已保存到文件:{csv_filename}")