目录
本期主要介绍如何获前一个和后一个交易日,以及获取周度交易日。
1. 源代码
class TRADE_DAY(object):
def __init__(self, data, st=None, et=None):
'''
st: str,开始日期,格式如'2023-03-01'
et: str,终止日期,格式如'2023-03-01'
data:转换后的交易日数据源
'''
self.st = st
self.et = et
self.data = data
@classmethod
def data_change(cls, trade_day):
# 对初始的数据进行清洗转换,此处可依据获取的数据源进行自主转换
# 转换后的数据格式为DataFrame,只有一列,列名为date,值的格式为str,例如'2023-03-03'
new_df = pd.DataFrame({'date': trade_day['trade_date']})
new_df['date'] = new_df['date'].apply(lambda x:
pd.to_datetime(str(x)).strftime("%Y-%m-%d"))
return new_df
@staticmethod
def add_date(date, st, et):
# date:TRADE_DAY对应获取的交易日数据
# 对所获频率的日期加上开始和结束日
new_date = pd.DataFrame({'date': [st, et]})
new_date = new_date.append(date)
new_date = new_date.drop_duplicates()
add_date = new_date.sort_values(by=['date'], ascending=True)
return add_date
@staticmethod
def get_time_diff(one_day, other_day):
# 获取两个交易日之间相差的自然日天数
min_day = pd.to_datetime(min([one_day, other_day]))
max_day = pd.to_datetime(max([one_day, other_day]))
return (max_day - min_day).days
def get_last_trading_day(self, day):
# 获取上一个交易日
data = self.data
last_day = data.loc[data['date'] < day]
return last_day['date'].max()
def get_next_trading_day(self, day):
# 获取下一个交易日
data = self.data
last_day = data.loc[data['date'] > day]
return last_day['date'].min()
def get_week_day(self):
# 获取区间对应的周度交易日日期
data = self.data
data['last'] = data['date'].shift(1)
data['next'] = data['date'].shift(-1)
new_data = data.loc[(data['date'] >= self.st) & (data['date'] <= self.et)]
# 求时间差
last_diff = []
next_diff = []
for num in range(len(new_data)):
now = new_data['date'].values[num]
last = new_data['last'].values[num]
next = new_data['next'].values[num]
last_diff.append(TRADE_DAY.get_time_diff(now, last))
next_diff.append(TRADE_DAY.get_time_diff(now, next))
new_data['next_diff'] = next_diff
new_data['last_diff'] = last_diff
me_df = new_data.loc[new_data['next_diff']>2]
me_df = me_df.sort_values(by=['date'], ascending=True)
out_df = pd.DataFrame({'date': me_df['date']})
return out_df
2. 案例演示
2.1 获取前后交易日
实现的方法主要是通过日期之间的比较来实现,比较简单。
if __name__ == '__main__':
# 输入参数
trade_date = ak.tool_trade_date_hist_sina()
st, et = '2020-02-01', '2023-07-01'
# 对原始数据进行转换
data = TRADE_DAY.data_change(trade_date)
Trade = TRADE_DAY(data, st, et)
# 获取上一个交易日
last_day = Trade.get_last_trading_day(st)
# 获取下一个交易日
next_day = Trade.get_next_trading_day(et)
对应得到的结果为:
2.2 获取周度数据
周度日期的提取思路如下:
1. 获取某个交易日与上一个交易日和下一个交易日的自然日天数差。
2. 筛选出情形1的数据。情形1对应的情况是:与上一个交易日的天数间隔为1,与下一个交易日的天数间隔大于2,。情形1比较常见,对应一些短期节假日和周末。
3. 筛选出情形2的数据。情形2对应的情况是:与上一个交易日的天数间隔不等于1,与下一个交易日的天数间隔大于2,。情形2比较少见,对应当周内只有一个交易日(国庆节后面那周)。
4. 总结下来周度日期的逻辑就是就是与下一个交易日的间隔日期大于2天。
当然,获取周度还有许多办法(直接调取周度的大盘指数数据,对应得到的日期就是周频的),以上面是笔者自己的思路,仅供参考。
# 获取周度交易日日期
week_df = Trade.get_week_day()
# 添加首尾的周度日期
week_df_add = Trade.add_date(week_df, st, et)
对应得到的结果为:
本次内容分为两期,两期内容可以放在一个类中进行使用。
本期分享到此结束,有何问题欢迎交流。