# -*- coding: utf-8 -*-
# @Author: fangbei
# @Date:   2017-08-26
# @Original:

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
'''
# for 循环
for _ in range(0, len(price_array)):
    date_array.append(str(date_base))
    date_base += 1
'''

推导式comprehensions(又称解析式),是Python的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列的结构体。

列表推导式

date_array = [str(date_base + ind) for ind, _ in enumerate(price_array)]
print(date_array)
# ['20170118', '20170119', '20170120', '20170121', '20170122']

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')]

字典推导式

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'}

可命名元组 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))
# print(type(change_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 = 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)
# print(type(filter_stock_up_days))
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

Python量化常用函数的更多相关文章

  1. Python 字符串常用函数

    操作字符串的常用函数 函数 描述(返回值) str.capitalize() 将字符串的第一个字符大写 str.title() 返回标题化的字符串,即每个单词的首字母都大写 str.upper() 全 ...

  2. Python—字符串常用函数

    Python-字符串常用字符串 字符串是一种表示文本的数据类型,使用单引号和双引号及三引号表示 访问字符串中的值字符串的每个字符都对应一个下标,下标编号是从0开始 转义字符字符串的格式化输出切片常用函 ...

  3. python字符串 常用函数 格式化字符串 字符串替换 制表符 换行符 删除空白 国际货币格式

    # 字符串常用函数# 转大写print('bmw'.upper()) # BMW# 转小写print('BMW'.lower()) # bmw# 首字母大写print('how aae you ?'. ...

  4. python中常用函数整理

    1.map map是python内置的高阶函数,它接收一个函数和一个列表,函数依次作用在列表的每个元素上,返回一个可迭代map对象. class map(object): ""&q ...

  5. 转 python 的常用函数replace, split(),enumerate() 函数

    1.execmd = "su - " + ou + " -c 'sqlplus / as sysdba << EOF\n " + execmd3 + ...

  6. python—各种常用函数及库

    列表list1.append(x)         将x添加到列表末尾 list1.sort()                对列表元素排序 list1.reverse()            将 ...

  7. Python string常用函数

    2017-07-03 23:26:08 1..replace(self, old, new, count=-1) replace()函数将旧字符串替换为新字符串,最后一个参数count为可选项,表示替 ...

  8. selenium2.0关于python的常用函数

    转: 新建实例driver = webdriver.Chrome() 1.获取当前页面的Url函数 方法:current_url 实例: driver.current_url 2.获取元素坐标 方法: ...

  9. python字符串常用函数

    # 索引与切片  *** capitalize()  **首字母大写 upper() lower() *** 大写和小写函数 startswith endswith  ***    判断以‘’字母’开 ...

随机推荐

  1. js基本知识2

    一.提示框 1. 弹出警示框 alert(); window.alert(); window 窗口 2. 控制台输出 console.log() 3. 文档打印 document 文档 documen ...

  2. 【转】shell pipe与输入输出重定向的区别

    http://www.cnblogs.com/chengmo/archive/2010/10/21/1856577.html

  3. 一定要使用-server参数来调试并发程序

    在阅读JCIP的时候想手工测试一下,结果发现总是没有出现书中描述的并发问题 后来我琢磨,以前记得书上说过,在debugging的环境下,JVM是低并发的,一定要在server的环境下测试,让JVM在高 ...

  4. 一款基于jQuery的图片下滑切换焦点图插件

    之前为大家分享了好多款jquery插件,今天我们要分享的一款jQuery插件也比较实用,是一款jQuery焦点图插件.焦点图相当普通,一共可以循环播放4张图片,并且每一张图片在切换的时候都是向下滑动的 ...

  5. Javascript 你不知道的事

    NaN表示一个不能产生正常结果的运算结果.它不等于任何值,包括它自己.可以用isNaN(number)来检测. 同Java中的字符串一样,JS中的字符串是不可变的.也就是说一旦字符串被创建,就无法改变 ...

  6. 002servlet生命周期以及有关servlet的各种知识

    4 Sevlet的生命周期(重点) 有关servlet的类有Servlet,HttpServlet以及GenericServlet. 其实我们要写一个Servlet只要写一个类去实现Servet就可以 ...

  7. 深入理解Mybatis中sqlSessionFactory机制原理

    对于任何框架而言,在使用前都要进行一系列的初始化,MyBatis也不例外.本章将通过以下几点详细介绍MyBatis的初始化过程. 1.MyBatis的初始化做了什么 2. MyBatis基于XML配置 ...

  8. oracle oci 调用 1

    http://blog.163.com/earth_of_fire/blog/static/1368943200791211622278/(总结) http://blog.163.com/earth_ ...

  9. Web设计的速查卡(转)

    一.排版 1.VisiBone Font Card Download: GIF 2.常用字体表 (HTML) 3.混合字体 (PDF) 二.单元/尺寸 1.Points 和Pixels近似转换表 (H ...

  10. Java设计模式菜鸟系列(十)模板方法模式建模与实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39806973 模板方法模式(Template Method):在一个方法中定义了一个算法的 ...