get_cyb50_kline.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. import akshare as ak
  2. import pandas as pd
  3. from datetime import datetime, timedelta
  4. import os
  5. def get_cyb50_60min_data():
  6. """获取创业板50指数最近3个月的60分钟K线数据"""
  7. try:
  8. print("正在获取创业板50指数(399673)的60分钟K线数据...")
  9. # 获取创业板50指数的60分钟K线数据
  10. # 使用东方财富接口获取分钟级数据
  11. data = ak.index_zh_a_hist_min_em(symbol="399673", period="60")
  12. if data.empty:
  13. print("未获取到数据,请检查网络连接或接口是否可用")
  14. return None
  15. # 筛选最近3个月的数据
  16. three_months_ago = datetime.now() - timedelta(days=90)
  17. data['时间'] = pd.to_datetime(data['时间'])
  18. data_filtered = data[data['时间'] >= three_months_ago].copy()
  19. print(f"成功获取数据,共 {len(data_filtered)} 条记录")
  20. print(f"数据时间范围: {data_filtered['时间'].min()} 至 {data_filtered['时间'].max()}")
  21. print(f"数据列: {list(data_filtered.columns)}")
  22. return data_filtered
  23. except Exception as e:
  24. print(f"获取数据时出错: {str(e)}")
  25. return None
  26. def export_to_csv(data, filename=None):
  27. """将数据导出到CSV文件"""
  28. if data is None or data.empty:
  29. print("没有数据可导出")
  30. return False
  31. try:
  32. # 生成文件名
  33. if filename is None:
  34. timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
  35. filename = f"cyb50_60min_kline_{timestamp}.csv"
  36. # 导出到CSV
  37. data.to_csv(filename, index=False, encoding='utf-8-sig')
  38. print(f"数据已成功导出到: {filename}")
  39. print(f"文件大小: {os.path.getsize(filename) / 1024:.2f} KB")
  40. return True
  41. except Exception as e:
  42. print(f"导出CSV时出错: {str(e)}")
  43. return False
  44. def get_cyb50_30min_data():
  45. """获取创业板50指数最近3个月的30分钟K线数据"""
  46. try:
  47. print("正在获取创业板50指数(399673)的30分钟K线数据...")
  48. # 获取创业板50指数的30分钟K线数据
  49. data = ak.index_zh_a_hist_min_em(symbol="399673", period="30")
  50. if data.empty:
  51. print("未获取到数据,请检查网络连接或接口是否可用")
  52. return None
  53. # 筛选最近3个月的数据
  54. three_months_ago = datetime.now() - timedelta(days=90)
  55. data['时间'] = pd.to_datetime(data['时间'])
  56. data_filtered = data[data['时间'] >= three_months_ago].copy()
  57. print(f"成功获取数据,共 {len(data_filtered)} 条记录")
  58. print(f"数据时间范围: {data_filtered['时间'].min()} 至 {data_filtered['时间'].max()}")
  59. print(f"数据列: {list(data_filtered.columns)}")
  60. return data_filtered
  61. except Exception as e:
  62. print(f"获取数据时出错: {str(e)}")
  63. return None
  64. def get_cyb50_15min_data():
  65. """获取创业板50指数最近1个月的15分钟K线数据"""
  66. try:
  67. print("正在获取创业板50指数(399673)的15分钟K线数据...")
  68. # 获取创业板50指数的15分钟K线数据
  69. data = ak.index_zh_a_hist_min_em(symbol="399673", period="15")
  70. if data.empty:
  71. print("未获取到数据,请检查网络连接或接口是否可用")
  72. return None
  73. # 筛选最近1个月的数据
  74. one_month_ago = datetime.now() - timedelta(days=30)
  75. data['时间'] = pd.to_datetime(data['时间'])
  76. data_filtered = data[data['时间'] >= one_month_ago].copy()
  77. print(f"成功获取数据,共 {len(data_filtered)} 条记录")
  78. print(f"数据时间范围: {data_filtered['时间'].min()} 至 {data_filtered['时间'].max()}")
  79. print(f"数据列: {list(data_filtered.columns)}")
  80. return data_filtered
  81. except Exception as e:
  82. print(f"获取数据时出错: {str(e)}")
  83. return None
  84. def main():
  85. """主函数"""
  86. print("=" * 50)
  87. print("创业板50指数K线数据获取工具")
  88. print("=" * 50)
  89. # 获取60分钟数据
  90. print("\n【60分钟K线数据】")
  91. data_60 = get_cyb50_60min_data()
  92. if data_60 is not None:
  93. # 显示前5条数据预览
  94. print("\n数据预览:")
  95. print(data_60.head())
  96. # 导出到CSV
  97. export_to_csv(data_60)
  98. print("\n数据统计信息:")
  99. print(data_60.describe())
  100. else:
  101. print("60分钟数据获取失败")
  102. # 获取30分钟数据
  103. print("\n" + "=" * 50)
  104. print("【30分钟K线数据】")
  105. data_30 = get_cyb50_30min_data()
  106. if data_30 is not None:
  107. # 显示前5条数据预览
  108. print("\n数据预览:")
  109. print(data_30.head())
  110. # 导出到CSV(带30分钟标识)
  111. export_to_csv(data_30, filename=f"cyb50_30min_kline_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv")
  112. print("\n数据统计信息:")
  113. print(data_30.describe())
  114. else:
  115. print("30分钟数据获取失败")
  116. # 获取15分钟数据
  117. print("\n" + "=" * 50)
  118. print("【15分钟K线数据】")
  119. data_15 = get_cyb50_15min_data()
  120. if data_15 is not None:
  121. # 显示前5条数据预览
  122. print("\n数据预览:")
  123. print(data_15.head())
  124. # 导出到CSV(带15分钟标识)
  125. export_to_csv(data_15, filename=f"cyb50_15min_kline_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv")
  126. print("\n数据统计信息:")
  127. print(data_15.describe())
  128. else:
  129. print("15分钟数据获取失败")
  130. if __name__ == "__main__":
  131. main()