第一套方案废弃的原因是数据不准确,大家可以使用Tushare试试,多测试一些。
方案二的整体流程:
- 先随机检测数据(50条)
- 处理后数据的精度问题(第一套方案也遇到了这个问题)
1、下载数据
使用通达信下载数据
再使用pytdx
读取下载到磁盘的数据
D:\software\tongdaxing\vipdoc\sh\lday
2、解析或者直接读取
https://blog.csdn.net/wowocpp/article/details/133707148?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170666852116777224453888%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=170666852116777224453888&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-133707148-null-null.142^v99^pc_search_result_base8&utm_term=pytdx.reader&spm=1018.2226.3001.4187
接下来就是读取文件,这个可以借鉴其他博主,为降低风险的可能,我使用直接读取的方式。
想要解析,看这个博主
1、不直接联网获取的原因很简单,数据的准确的,谁知道有没有维护。
2、下载好还可以用于离线分析
注意:
尽可能的使用pydtx直接读取,不要使用其他方式解析,你运行下面的代码你就知道它效率有多高
from pytdx.reader import TdxDailyBarReader, TdxFileNotFoundException
from pytdx.reader import BlockReader
reader = TdxDailyBarReader()
df = reader.get_df("D:/software/tongdaxing/vipdoc/sh/lday/sh000001.day")
print(df)
接下里如何实现【中转】
1、将所有文件全部读取,然后写入到csv文件中,当使用到某个数据时从上200万条数据遍历
2、根据要获取的股票代码,先在5000多条文件(也就5000多个股票)筛选,再到400多个数据中筛选(我保存了两年的)【使用这个】
3、元数据的处理
我通过问财下载了我需要的数据,并做了数据的检测,保证文件名中有的日期和文件内容的日期保存相同,并缓存为csv格式
import os
import pandas as pd
import re
def extract_date_from_filename(filename):
# 从文件名中提取日期
match = re.search(r'(\d{4}年\d{1,2}月\d{1,2}日)', filename)
if match:
date_str = match.group(1)
# 将中文日期转换为标准日期格式
date_obj = pd.to_datetime(date_str, format='%Y年%m月%d日', errors='coerce')
if not pd.isnull(date_obj):
return date_obj.strftime('%Y-%m-%d')
return None
def excel_csv(resource, goal):
# resource 元数据存放的路径
# goal 处理后元数据存放的路径
for root, dirs, files in os.walk(resource):
for file in files:
file_path = os.path.join(root, file)
file_path = file_path.replace('//', '/')
# 提取文件名中的日期
file_date = extract_date_from_filename(file)
if file_date is None:
print(f"无法从文件名中提取日期,文件名:{file}")
continue
# 读取Excel文件
df = pd.read_excel(file_path)
# 去除列名中的换行符
df.columns = df.columns.str.replace('/n', '')
# 删除最后一行
df = df.iloc[:-1]
# 获取日期列名
date_column = [col for col in df.columns if '连续涨停天数(天)' in col][0]
# 提取日期数据
df['日期'] = date_column.split('连续涨停天数(天)')[1]
# 将日期格式转换为'YYYY-MM-DD'
df['日期'] = pd.to_datetime(df['日期'], format='%Y.%m.%d').dt.strftime('%Y-%m-%d')
# 提取并重命名需要的列
df = df[['股票代码', '股票简称', date_column, '日期']]
# 判断文件名日期和DataFrame中的日期是否相同
if file_date != df['日期'].iloc[0]:
print(f"文件名日期与DataFrame中的日期不匹配,文件名日期:{file_date},DataFrame日期:{df['日期'].iloc[0]}")
continue
# 保存为CSV文件
df.to_csv(goal, index=False, mode='a', header=False)
# 调用
excel_csv('', '')
4、元数据使用个人逻辑
002315.SZ,焦点科技,2,2023-05-04
002351.SZ,漫步者,2,2023-05-04
002555.SZ,三七互娱,2,2023-05-04
600757.SH,长江传媒,4,2023-05-05
002315.SZ,焦点科技,3,2023-05-05
- 先对csv文件根据日期进行排序,保证顺序是递增的
- 假设当读取到第一行元数据,发现日期为2023-05-04,读取所有日期为2023-05-04的代码(002315,002351,002555)然后再往下读取一行,发现日期为2023-05-05,将05-05设置为结束日期,05-04设置为开始日期。
通过上述我们获取了,需要的开始日期05-04,开始期日的代码(002315,002351,002555),结束日期05-05,这里面需要用到索引,才能达到这样的效果
with open(file_path, 'r', encoding='utf-8') as file:
csv_reader = csv.reader(file)
# 将文件内容读入列表
all_rows = list(csv_reader)
# 循环处理每一行数据
i = 0
while i < len(all_rows):
# 获取起始日期,并转换为指定格式
start_datetime = datetime.strptime(all_rows[i][3], '%Y-%m-%d')
yesterday = start_datetime.strftime('%Y%m%d')
# 初始化结束日期变量
today = None
# 读取所有时间为起始日期的数据,提取股票代码
stock_codes = []
for row in all_rows[i:]:
if row[3] == all_rows[i][3]:
stock_codes.append(row[0])
else:
# 读取下一行日期,并转换为指定格式
end_datetime = datetime.strptime(row[3], '%Y-%m-%d')
today = end_datetime.strftime('%Y%m%d')
break
# 输出结果
print(f"股票代码列表:{stock_codes}")
print(f"起始日期:{yesterday}")
print(f"结束日期:{today}")
# 移动循环索引到下一个日期的开始
i += len(stock_codes)
5、根据股票代码,起始日期获取数据
6、数据逻辑处理
这个就不可能放出来了。