fetch_data.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. 创业板50指数数据获取脚本
  5. 数据来源:baostock (证券宝) - http://www.baostock.com
  6. """
  7. import baostock as bs
  8. import pandas as pd
  9. from datetime import datetime
  10. def fetch_cyb50_data():
  11. """
  12. 获取创业板50指数历史数据
  13. 指数代码:sz.399673
  14. """
  15. # 登录baostock
  16. lg = bs.login()
  17. if lg.error_code != '0':
  18. print(f"登录失败: {lg.error_msg}")
  19. return None
  20. print("登录成功,开始获取数据...")
  21. # 获取创业板50指数日线数据
  22. # 参数说明:
  23. # - code: 指数代码 sz.399673 (深圳.创业板50)
  24. # - fields: 获取的字段 (日期, 开盘价, 最高价, 最低价, 收盘价, 成交量)
  25. # - start_date: 开始日期
  26. # - end_date: 结束日期
  27. rs = bs.query_history_k_data_plus(
  28. "sz.399673",
  29. "date,open,high,low,close,volume",
  30. start_date='2017-01-01',
  31. end_date='2025-12-31',
  32. frequency='d', # 日频
  33. adjustflag='3' # 不复权 (指数不需要复权)
  34. )
  35. if rs.error_code != '0':
  36. print(f"数据获取失败: {rs.error_msg}")
  37. bs.logout()
  38. return None
  39. # 解析数据
  40. data_list = []
  41. while rs.next():
  42. data_list.append(rs.get_row_data())
  43. # 转换为DataFrame
  44. df = pd.DataFrame(data_list, columns=['date', 'open', 'high', 'low', 'close', 'volume'])
  45. # 数据类型转换
  46. for col in ['open', 'high', 'low', 'close', 'volume']:
  47. df[col] = pd.to_numeric(df[col], errors='coerce')
  48. # 保存为CSV
  49. df.to_csv('cyb50_baostock.csv', index=False)
  50. print(f"数据获取成功!")
  51. print(f" 数据区间: {df['date'].iloc[0]} ~ {df['date'].iloc[-1]}")
  52. print(f" 总交易日: {len(df)} 天")
  53. print(f" 保存文件: cyb50_baostock.csv")
  54. # 登出
  55. bs.logout()
  56. return df
  57. if __name__ == "__main__":
  58. df = fetch_cyb50_data()
  59. if df is not None:
  60. print("\n数据预览:")
  61. print(df.head())
  62. print("...")
  63. print(df.tail())