1. 程式人生 > >數字貨幣量化教程——構造金融數據的數據結構

數字貨幣量化教程——構造金融數據的數據結構

最小 pri 特性 序列 filter ict 有序字典 alc 計算

1、數據準備

price_str = 30.14, 29.58, 26.36, 32.56, 32.82
price_str = price_str.replace( , ‘‘)  #刪除空格
price_array = price_str.split(,)      #轉成數組

date_array = []
date_base = 20170118

2、構造日期

#推導式comprehensions(又稱解析式),是Python的一種獨有特性。推導式是可以從一個數據序列構建另一個新的數據序列的結構體。
#列表推導式

date_array = [str(date_base + ind) for
ind, _ in enumerate(price_array)] print(date_array)

返回

[20170118, 20170119, 20170120, 20170121, 20170122]

3、生成日期價格對

3.1 列表格式

# zip函數
stock_tuple_list = [(date, price) for date, price in zip(date_array, price_array)] print(stock_tuple_list)

返回

[(20170118, 30.14), (20170119, 29.58
), (20170120, 26.36), (20170121, 32.56), (20170122, 32.82)]

3.2 字典格式

#字典推導式
stock_dict = {date: price for date, price in zip(date_array, price_array)}
print(stock_dict)

返回

{20170118: 30.14, 20170119: 29.58, 20170120: 26.36, 20170121: 32.56, 20170122: 32.82}

3.3 元組格式

# 可命名元組 namedtuple

from
collections import namedtuple stock_nametuple = namedtuple(stock, (date, price)) stock_nametuple_list = [stock_nametuple(date, price) for date, price in zip(date_array, price_array)] print(stock_nametuple_list)

返回

[stock(date=20170118, price=30.14), stock(date=20170119, price=29.58), stock(date=20170120, price=26.36), stock(date=20170121, price=32.56), stock(date=20170122, price=32.82)]



# 有序字典 OrderedDict
from collections import OrderedDict
stock_dict = OrderedDict((date, price) for date, price in zip(date_array, price_array))
print(stock_dict.keys())

返回

 odict_keys([20170118, 20170119, 20170120, 20170121, 20170122])

#最小收盤價
print(min(zip(stock_dict.values(), stock_dict.keys())))

返回

(26.36, 20170120)

#lambad函數
func = lambda x:x+1
#以上lambda等同於以下函數
def func(x):
    return(x+1)

#找出收盤價中第二大的價格
find_second_max_lambda = lambda dict_array : sorted(zip(dict_array.values(), dict_array.keys()))[-2]
print(find_second_max_lambda(stock_dict))

返回

 (32.56, 20170121)

#高階函數
#將相鄰的收盤價格組成tuple後裝入list
price_float_array = [float(price_str) for price_str in stock_dict.values()]
pp_array = [(price1, price2) for price1, price2 in zip(price_float_array[:-1], price_float_array[1:])]
print(pp_array)

返回

 [(30.14, 29.58), (29.58, 26.36), (26.36, 32.56), (32.56, 32.82)]

from functools import reduce
#外層使用map函數針對pp_array()的每一個元素執行操作,內層使用reduce()函數即兩個相鄰的價格, 求出漲跌幅度,返回外層結果list
change_array = list(map(lambda pp:reduce(lambda a,b: round((b-a) / a, 3),pp), pp_array))

change_array.insert(0,0)
print(change_array)

返回

[0, -0.019, -0.109, 0.235, 0.008]

#將漲跌幅數據加入OrderedDict,配合使用namedtuple重新構建數據結構stock_dict
stock_nametuple = namedtuple(stock, (date, price, change))
stock_dict = OrderedDict((date, stock_nametuple(date, price, change))
                         for date, price, change in
                         zip(date_array, price_array, change_array))
print(stock_dict)

返回

OrderedDict([(20170118, stock(date=20170118, price=30.14, change=0)), (20170119, stock(date=20170119, price=29.58, change=-0.019)), (20170120, stock(date=20170120, price=26.36, change=-0.109)), (20170121, stock(date=20170121, price=32.56, change=0.235)), (20170122, stock(date=20170122, price=32.82, change=0.008))])

#用filter()進行篩選,選出上漲的交易日
up_days = list(filter(lambda day: day.change > 0, stock_dict.values()))
print(up_days)

返回

[stock(date=20170121, price=32.56, change=0.235), stock(date=20170122, price=32.82, change=0.008)]

#定義函數計算漲跌日或漲跌值
def filter_stock(stock_array_dict, want_up=True, want_calc_sum=False):
    if not isinstance(stock_array_dict, OrderedDict):
        raise TypeError(stock_array_dict must be OrderedDict)

    filter_func = (lambda day: day.change > 0) if want_up else (lambda day: day.change < 0)

    want_days = list(filter(filter_func, stock_array_dict.values()))

    if not want_calc_sum:
        return want_days

    change_sum = 0.0
    for day in want_days:
        change_sum += day.change

    return change_sum


#偏函數 partial
from functools import partial
filter_stock_up_days    = partial(filter_stock, want_up=True,  want_calc_sum=False)
filter_stock_down_days  = partial(filter_stock, want_up=False, want_calc_sum=False)
filter_stock_up_sums    = partial(filter_stock, want_up=True,  want_calc_sum=True)
filter_stock_down_sums  = partial(filter_stock, want_up=False, want_calc_sum=True)

print(所有上漲的交易日:{}.format(list(filter_stock_up_days(stock_dict))))
print(所有下跌的交易日:{}.format(list(filter_stock_down_days(stock_dict))))
print(所有上漲交易日的漲幅和:{}.format(filter_stock_up_sums(stock_dict)))
print(所有下跌交易日的跌幅和:{}.format(filter_stock_down_sums(stock_dict)))

# 所有上漲的交易日:[stock(date=‘20170121‘, price=‘32.56‘, change=0.235), stock(date=‘20170122‘, price=‘32.82‘, change=0.008)]
# 所有下跌的交易日:[stock(date=‘20170119‘, price=‘29.58‘, change=-0.019), stock(date=‘20170120‘, price=‘26.36‘, change=-0.109)]
# 所有上漲交易日的漲幅和:0.243
# 所有下跌交易日的跌幅和:-0.128



數字貨幣量化教程——構造金融數據的數據結構