1. 程式人生 > >量化交易入門筆記-Datetime和Time模組

量化交易入門筆記-Datetime和Time模組

Python 中,通常有三種方式用來表示時間,分別是時間戳、格式化的字串、元組(struct_time)方式

  1. 時間戳

    一般來講,時間戳表示的是從1970年1月1日00:00:00開始按秒計算的偏移量。可以運用"type(time.time())",返回的是 float 。返回時間戳方式的函式主要有 time()clock()

  2. 格式化的時間字串

    格式化的時間字串表示時間,如"%Y-%m-%d %H:%M:%S"表示 年-月-日 時:分:秒

  3. 元組(struct_time)方式

    struct_time元組共有9個元素,返回struct_time的函式主要有gmtime()

    /localtime()/strptime()

    示例:

    struct_time(tm_year=2016, tm_mon=2, tm_mday=2, tm_hour=11, tm_min=16, tm_sec=43, tm_wday=1, tm_yday=33, tm_isdst=0)
    # 引數分別表示 年,月,日,時,分,秒,星期幾(0-6),年的第幾天,是否為夏令時(預設為-1)
    

利用 Datetime 模組獲得當前的日期和時間

# 匯入datetime模組
import datetime

dt_time = datetime.datetime.now()

print("當前日期和時間是 %s"
% dt_time) print("ISO格式的日期和時間是 %s" % dt_time.isoformat()) print("當前的年份是 %s" % dt_time.year) print("當前的月份是 %s" % dt_time.month) print("當前的日期是 %s" % dt_time.day) print("dd/mm/yyyy格式是 %s/%s/%s" % (dt_time.day, dt_time.month, dt_time.year)) print("當前小時是 %s" % dt_time.hour) print("當前的分鐘是 %s" % dt_time.minute)
print("當前的秒是 %s" % dt_time.second)

當前日期和時間是 2018-10-08 13:04:52.728721
ISO格式的日期和時間是 2018-10-08T13:04:52.728721
當前的年份是 2018
當前的月份是 10
當前的日期是 8
dd/mm/yyyy格式是 8/10/2018
當前小時是 13
當前的分鐘是 4
當前的秒是 52

利用 Time 模組獲得當前的日期和時間

# 匯入time模組
import time

# 呼叫strftime()輸出時間
print('24小時計時法,當前時間是:', time.strftime('%H:%M:%S'))
print('12小時計時法,當前時間是:', time.strftime('%I:%M:%S'))
print('dd/mm/yyyy 格式是:', time.strftime('%d/%m/%Y'))

print(time.localtime())

24小時計時法,當前時間是: 13:09:22
12小時計時法,當前時間是: 01:09:22
dd/mm/yyyy 格式是: 08/10/2018
time.struct_time(tm_year=2018, tm_mon=10, tm_mday=8, tm_hour=13, tm_min=9, tm_sec=22, tm_wday=0, tm_yday=281, tm_isdst=0)

time.strftime(format[,t]):把一個代表時間的元組或者 struct_time(如由 time.localtime() 和 time.gmtime() 返回)轉化為格式你給的時間字串。如果 t 未指定,將傳入 time.localtime()。如果元組中任何一個元素越界,ValueError 的錯誤將會被丟擲

獲得當前時間並轉換為指定日期格式

# 匯入datetime模組
import datetime

# 獲得當前時間
now = datetime.datetime.now()
# 這是時間組格式 
print(now)
# 轉換為指定格式 
otherStyleTime = now.strftime('%Y-%m-%d %H:%M:%S')
print(otherStyleTime)
print(now.strftime('%Y-%m-%d'))

2018-10-08 13:16:58.715215
2018-10-08 13:16:58
2018-10-08

獲得三前的時間的方法

# 匯入time模組
import time
# 匯入datetime模組
import datetime

# 先獲得時間元組格式的日期
threeDayAgo = (datetime.datetime.now() - datetime.timedelta(days = 3))
# 轉換為時間戳
timeStamp = int(time.mktime(threeDayAgo.timetuple()))
# 轉換為其他字串格式 
otherStyleTime = threeDayAgo.strftime('%Y-%m-%d %H:%M:%S')

print(threeDayAgo)
print(timeStamp)
print(otherStyleTime)

2018-10-05 13:24:14.055158
1538717054
2018-10-05 13:24:14

獲得三天前的日期的方法

# 匯入datetime模組
import datetime

today = datetime.date.today()
print('今天日期是:', today)
# 用今天日期減掉時間差,引數為1,獲得昨天的日期
yesterday = today - datetime.timedelta(days=1)
print('昨天的日期是:', yesterday)
# 用今天的日期加上時間差,引數為1天,獲得明天的日期
tomorrow = today + datetime.timedelta(days=1)
print('明天的日期是:', tomorrow)

今天日期是: 2018-10-08
昨天的日期是: 2018-10-07
明天的日期是: 2018-10-09

獲得歷史交易日期

歷史交易日往往因為法定節假日的不固定而導致交易日不固定,給我們的回測帶來了很大的不便。下面講解一個簡單方法,可以輕鬆獲得某隻股票歷史交易日

# 匯入time模組
import time

initial = '2018-01-15'
tradingdays = get_price(
    '000001.XSHE', 
    fields='open', 
    start_date=initial, 
    end_date=time.strftime('%Y-%m-%d', time.localtime()))
tradingdays.index

DatetimeIndex(['2018-01-15', '2018-01-16', '2018-01-17', '2018-01-18',
               '2018-01-19', '2018-01-22', '2018-01-23', '2018-01-24',
               '2018-01-25', '2018-01-26', 
               ...
               '2018-09-17', '2018-09-18', '2018-09-19', '2018-09-20',
               '2018-09-21', '2018-09-25', '2018-09-26', '2018-09-27',
               '2018-09-28', '2018-10-08'],
              dtype='datetime64[ns]', length=175, freq=None, tz=None)

也可以這麼寫:

# 匯入time模組
import time

initial = '2018-01-15'
datetime_now = datetime.datetime.now()

tradingdays = get_price(
    '000001.XSHE', 
    fields='open', 
    start_date=initial, 
    end_date=datetime_now.strftime('%Y-%m-%d'))
tradingdays.index

DatetimeIndex(['2018-01-15', '2018-01-16', '2018-01-17', '2018-01-18',
               '2018-01-19', '2018-01-22', '2018-01-23', '2018-01-24',
               '2018-01-25', '2018-01-26', 
               ...
               '2018-09-17', '2018-09-18', '2018-09-19', '2018-09-20',
               '2018-09-21', '2018-09-25', '2018-09-26', '2018-09-27',
               '2018-09-28', '2018-10-08'],
              dtype='datetime64[ns]', length=175, freq=None, tz=None)

注:本文章為個人學習筆記,參考了一些書籍與官方教程,不作任何商業用途!*