每天沉迷于数据回测和可视化研究,不可自拔。
发现get_price和get_bars两种方式获得的数据有些不太一样,但究竟哪里不同,一直不是十分清晰。
但是,作为一名严谨的交易者,怎么能容忍这种模糊和不清晰呢?
对获得的数据没有一个清晰且深入的了解,又怎么能相信自己的交易策略呢?
于是,分析一下是必须的。
先进行初始化设置:
```
import datetime # 获取时间
# 获取今日的日期
today=datetime.date.today()
# 转换为字符串
today=str(today)
now = datetime.datetime.now()
# 转换股票代码为聚宽数据的股票的代码
security = 300607
security = normalize_code(security)
```
然后直接测试:
```
a0 = get_price(security, start_date=None,
end_date='2020-12-10', frequency='daily',
fields='close', skip_paused=False, fq='pre', count=1, panel=True, fill_paused=True)
a1 = get_price(security, start_date=None,
end_date='2020-12-10 11:10:00', frequency='daily',
fields='close', skip_paused=False, fq='pre', count=1, panel=True, fill_paused=True)
a2 = get_price(security, start_date=None,
end_date='2020-12-10 11:10:00', frequency='60m',
fields='close', skip_paused=False, fq='pre', count=1, panel=True, fill_paused=True)
a3 = get_price(security, start_date=None,
end_date='2020-12-10 11:10:00', frequency='1m',
fields='close', skip_paused=False, fq='pre', count=1, panel=True, fill_paused=True)
a4 = get_bars(security, 1, unit='1d',
fields='close',
include_now=True, end_dt='2020-12-10 11:10:00', fq_ref_date=None,df=True)
a5 = get_bars(security, 1, unit='60m',
fields='close',
include_now=True, end_dt='2020-12-10 11:10:00', fq_ref_date=None,df=True)
a6 = get_bars(security, 1, unit='1m',
fields='close',
include_now=True, end_dt='2020-12-10 11:10:00', fq_ref_date=None,df=True)
print(f'get_price 获取2020-12-10当日的日线收盘价为:{a0.close[0]}')
print(f'get_price 获取2020-12-10 11:10:00的daily日线收盘价为:{a1.close[0]}')
print(f'get_price 获取2020-12-10 11:10:00的60分钟收盘价为:{a2.close[0]}')
print(f'get_price 获取2020-12-10 11:10:00的1分钟收盘价为:{a3.close[0]}')
print('-'*70)
print(f'get_bars 获取2020-12-10 11:10:00的1d日线收盘价为:{a4.close[0]}')
print(f'get_bars 获取2020-12-10 11:10:00的60分钟收盘价为:{a5.close[0]}')
print(f'get_bars 获取2020-12-10 11:10:00的1分钟收盘价为:{a6.close[0]}')
```
观察输出结果:
```
get_price 获取2020-12-10当日的日线收盘价为:36.68
get_price 获取2020-12-10 11:10:00的daily日线收盘价为:36.68
get_price 获取2020-12-10 11:10:00的60分钟收盘价为:36.8
get_price 获取2020-12-10 11:10:00的1分钟收盘价为:36.8
----------------------------------------------------------------------
get_bars 获取2020-12-10 11:10:00的1d日线收盘价为:36.8
get_bars 获取2020-12-10 11:10:00的60分钟收盘价为:36.8
get_bars 获取2020-12-10 11:10:00的1分钟收盘价为:36.8
```
可以得出结论:
**用get_price获取数据,frequency='daily'时,无视输入的分秒时间,取得的数据是当日的收盘价。
用get_bars获取数据,frequency='1d'时,根据输入的分秒时间,取得的数据是精确到分秒当前时刻的收盘价,非当日的收盘价。**
继续测试:
```
b1 = get_price(security, start_date=None,
end_date=today, frequency='daily',
fields='close', skip_paused=False, fq='pre', count=1, panel=True, fill_paused=True)
b2 = get_price(security, start_date=None,
end_date=now, frequency='1m',
fields='close', skip_paused=False, fq='pre', count=1, panel=True, fill_paused=True)
b3 = get_bars(security, 1, unit='1m',
fields='close',
include_now=True, end_dt=now, fq_ref_date=None,df=True)
print('-'*70)
print(f'get_price 获取当日某一时刻的日线收盘价为:{b1.close[0]}')
print(f'get_price 获取当日某一时刻的1分钟收盘价为:{b2.close[0]}')
print(f'get_bars 获取当日某一时刻的1分钟收盘价为:{b3.close[0]}')
```
观察输出:
```
get_price 获取当日某一时刻的日线收盘价为:36.98
get_price 获取当日某一时刻的1分钟收盘价为:36.98
get_bars 获取当日某一时刻的1分钟收盘价为:36.98
```
得到结论:
**用get_price获取数据,frequency='daily'时,时间为当日时,取得的数据是精确到分秒的最新时刻的收盘价。**
继续测试:
```
c0 = get_price(security, start_date=None,
end_date='2020-12-10 11:12:00', frequency='30m',
fields=['close'], skip_paused=False, fq='pre', count=3, panel=True, fill_paused=True)
c1 = get_bars(security, 3, unit='30m',
fields=['date','close'],
include_now=True, end_dt='2020-12-10 11:12:00', fq_ref_date=None,df=True)
c2 = get_bars(security, 3, unit='30m',
fields=['date','close'],
include_now=False, end_dt='2020-12-10 11:12:00', fq_ref_date=None,df=True)
print('-'*70)
print(f'get_price 获取30分钟bar的数据(include_now=True):{c0}')
print(f'get_bars 获取30分钟bar的数据(include_now=True):{c1}')
print(f'get_bars 获取30分钟bar的数据(include_now=False):{c2}')
```
观察输出:
```
get_price 获取30分钟bar的数据(include_now=True): close
2020-12-10 10:12:00 36.79
2020-12-10 10:42:00 36.76
2020-12-10 11:12:00 36.91
get_bars 获取30分钟bar的数据(include_now=True): date close
0 2020-12-10 10:30:00 36.76
1 2020-12-10 11:00:00 36.88
2 2020-12-10 11:12:00 36.91
get_bars 获取30分钟bar的数据(include_now=False): date close
0 2020-12-10 10:00:00 36.38
1 2020-12-10 10:30:00 36.76
2 2020-12-10 11:00:00 36.88
```
得到结论:
**get_price和get_bars的数据划分方式不同:
get_price以当前的时刻,以频率为固定间隔,往前切片取数据。
get_bars以开盘的时刻,以频率为固定间隔,往后切片取数据。
get_bars的数据切分方式,与行情软件的K线划分一致。**
测试完毕,总算对get_price和get_bars获取的数据有了清晰的认识。也希望可以帮到那些和我一样,对get_price和get_bars还有疑问的同行者。
遇坑填坑,在量化的道路上,终可越走越远!祝愿我们每个人都早日实现财务自由,拥抱幸福的人生!
大佬,请假下,如果用get_bars 来评估昨日涨停板的质量,
比如有个想法是 :是否涨停后有打开过,打开过的给 0 分,没有打开过的给1 分,
在代码上大概怎么写好一点?
谢谢!
2021-04-01
也就是说,get_price 在回测中会有未来数据吗?
2021-07-07
@zhraaa 收盘时间可能是:15.0000003时。这样,15时的数据就不是收盘数据。
2022-01-22
我的理解是get_price获取当日收盘价是会窥视今天的收盘价的,收盘价要在后一天才能获取到,get_bars获取当日收盘价的话获取的是当日开盘价,不会获取当天的收盘价
2022-06-20
获取日线两者基本一样,用哪个都行,获取分钟线差别很大。
2025-02-15