日常回测的时候有时会遇到只有日线没有周线的情况,这时候就需要将日线合成为周线

本文参考了【邢不行|量化小讲堂系列06-Python量化入门】极简方法将日线数据转为周线、月线或其他周期_xingbuxing_py的博客-CSDN博客

但是将数据格式修改为tushare的格式,并且支持一个文件里存在多个品种

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import pandas as pd

all_stock_data = pd.read_csv('day.csv', parse_dates=[0])
# 设定转换周期period_type  转换为周是'W',月'M',季度线'Q',五分钟'5min',12天'12D'
period_type = 'W'
# 将[date]设定为    index   inplace是原地修改,不要创建一个新对象
all_stock_data.set_index('trade_date', inplace=True)

groups = all_stock_data.groupby('ts_code')
all = []
for name, stock_data in groups:
    # 进行转换,周线的每个变量都等于那一周中最后一个交易日的变量值
    period_stock_data = stock_data.resample(period_type).last()
    # 周线的change等于那一周中每日change的连续相乘
    period_stock_data['change'] = stock_data['change'].resample(period_type).apply(lambda x: (x + 1.0).prod() - 1.0)
    # 周线的open等于那一周中第一个交易日的open

    period_stock_data['open'] = stock_data['open'].resample(period_type).first()
    # 周线的high等于那一周中的high的最大值

    period_stock_data['high'] = stock_data['high'].resample(period_type).max()
    # 周线的low等于那一周中的low的最大值

    period_stock_data['low'] = stock_data['low'].resample(period_type).min()
    # 周线的volume和money等于那一周中volume和money各自的和
    period_stock_data['vol'] = stock_data['vol'].resample(period_type).sum()
    period_stock_data['amount'] = stock_data['amount'].resample(period_type).sum()
    # 股票在有些周一天都没有交易,将这些周去除
    period_stock_data = period_stock_data[period_stock_data['ts_code'].notnull()]
    period_stock_data.reset_index(inplace=True)
    all.append(period_stock_data)

all2 = pd.concat(all, axis=0)
# 导出数据
all2.to_csv('week_stock_data.csv', index=False)