实现自己的小功能(方案二)

第一套方案废弃的原因是数据不准确,大家可以使用Tushare试试,多测试一些。

方案二的整体流程:

  1. 先随机检测数据(50条)
  2. 处理后数据的精度问题(第一套方案也遇到了这个问题)

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

  1. 先对csv文件根据日期进行排序,保证顺序是递增的
  2. 假设当读取到第一行元数据,发现日期为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、数据逻辑处理

这个就不可能放出来了。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值