文档章节

数字货币量化教程——构造金融数据的数据结构

o
 osc_n6euf5h6
发布于 2019/03/19 20:22
字数 829
阅读 7
收藏 0

 

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

 



o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

pycurl libcurl link-time ssl backend (nss)

pip uninstall pycurlecho 'pycurl==7.19.5.1 --global-option="--with-nss"' > requires.pypip install -r requires.py...

小红手
27分钟前
17
0
计算机网络性能衡量

1、速率 单位时间(s)内传输信息(bit)量 单位:KB/s, MB/s, Gb/s K = 10^3 ,M = 10^6, G=10^9 一般表示的是理想的传输速率 2、带宽 计算机网络中的带宽和通信等领域的带宽概念不一样,计算机网...

osc_np3y0rbq
27分钟前
3
0
互联网掀起农家乐,巨头上演AI掘金战

配图来自Canva **前有网易、阿里AI养猪,后有腾讯AI养鹅,互联网大佬们纷纷玩起了“农家乐”,互联网的生意在尖端技术的引领之下频频跨界,巨头之间的较量也从线上延伸至线下。**自古“民以食...

osc_5cok9i01
29分钟前
9
0
原来!我在4年前就开始体验雾游戏了!

前有云游戏后有雾游戏,游戏的方式看来起来越来越多种多样。那么“震撼业界”的雾游戏到底是什么来头?它依靠什么改变游戏界?它的原理又是什么? 本月月初,著名的日本游戏杂志《Fami通》表...

osc_j34n26zn
30分钟前
11
0
活动预告|田溯宁与你相约GSMA Thrive·万物生晖,分享5G风口下的创新与投资洞察

在万物互联的时代背景下,5G+AI+IoT的技术变革与融合,正在引发一场深刻的全产业创新与变革。5G技术创新、行业应用及投资机遇已成为科技行业所瞩目的焦点。 6月30日,宽带资本董事长田溯宁将...

osc_0qnrwmy3
31分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部