python量化交易之路code测试一(python3通过测试)

Jupyter Notebook
Untitled12
最后检查: 几秒前
(自动保存)

#1 数据类型
i=1  
type(i)
f=1.1
type(f)
b=(1>2)
type(b)
price_str = '30.14, 29.58, 26.36, 32.56, 32.82'
type(price_str)
print ('旧的price_str id= {}'.format(id(price_str)))
price_str = price_str.replace(' ', '')
print ('新的price_str id= {}'.format(id(price_str)))
price_str

#2.1 生成列表
price_array=price_str.split(",")
price_array.append('9.99')
print(price_array)

#2.2 用列表生成集合

set(price_array)

#2.3 用for循环生成列表
date_array=[]
date_base=20200418
for _ in range(0,len(price_array)):   #无用的循环计数变量建议用"_"声明
    date_array.append(str(date_base))
    date_base+=1
date_array

#2.4 用列表推导式简化
#enumerate()函数将列表转换为下标和数值二维列表
date_base=20200418
date_array=[str(date_base+ind) for ind,_ in enumerate(price_array)]
date_array

#3 可命名元组,namedtuple, zip函数

from collections import namedtuple
stock_namedtuple = namedtuple('stock', ('date','price'))
stock_namedtuple_list = [stock_namedtuple(date, price) for date,price in zip(date_array,price_array)]
stock_namedtuple_list

#4 字典推导式 {key:value for in}
from collections import OrderedDict
stock_dict=OrderedDict((date,price) for (date,price) in zip(date_array,price_array))
stock_dict.keys()
min(zip(stock_dict.values(),stock_dict.keys()))
min(zip(stock_dict.values(),stock_dict.keys()))

#5 匿名函数  返回最大值最小值
find_2nd_max_value=lambda dict_array: sorted(zip(dict_array.values(),dict_array.keys()))
find_2nd_max_value(stock_dict)[-1],find_2nd_max_value(stock_dict)[0]

#6 高阶函数
#map()函数,接收两个参数,一个是函数,一个是序列,map()把传入的函数依次作用于序列的每个元素,并把结果作为新的序列返回;
#filter()函数,接收两个参数,一个是函数,一个是序列,filter()把传入的函数依次作用于每个元素,根据返回值是True还是False决定是保留还是丢弃该元素,结果序列是所有返回值为True的子集;
#reduce()函数,把一个函数作用在一个序列上,这个函数必须接收两个参数,其中reduce()函数把结果继续和序列的下一个元素做累积计算,reduce()函数只返回值结果非序列。
#从收盘价格,推导出每天的涨跌幅度。
#首先将两两相邻的收盘价格组成tuple后装入list
#stock_dict是ordereddic,date已排序

price_float_array=[float(price_array) for price_array in stock_dict.values()]
pp_array=[(price1,price2) for price1,price2 in zip(price_float_array[:-1],price_float_array[1:])]

#下面使用高阶函数map()和reduce()结合lambda函数完成需求,推导出每天的涨跌幅度。
#外层使用map()函数针对pp_array的每一个元素执行操作,内层使用reduce()函数即两个相邻的价格,求出涨跌幅度,返回外层结果list。
#python3使用reduce需要import一下:

from functools import reduce 

# round将float保留几位小数,以下保留3位

#map、reduce和嵌套lambda的结合运用

new_array = map(
    lambda pp: reduce(lambda a, b: round((b - a) / a, 3), pp),
    pp_array)

#注意,上面代码其实完全没必要用reduce,完全可以直接用下面代码更简洁而且能更好理解:

new_array = map(
    lambda n: round((n[1] - n[0]) / n[0], 3),
    pp_array)

# new_array是个迭代器,用list方法转换成列表,用 insert插入数据,将第一天的涨跌幅设置为0
change_array=list(new_array)
change_array.insert(0,0)
change_array

#从收盘价格,推导出每天的涨跌幅度。
#首先将两两相邻的收盘价格组成tuple后装入list
#stock_dict是ordereddic,date已排序
price_float_array=[float(price_array) for price_array in stock_dict.values()]
pp_array=[(price1,price2) for price1,price2 in zip(price_float_array[:-1],price_float_array[1:])]


#下面使用高阶函数map()和reduce()结合lambda函数完成需求,推导出每天的涨跌幅度。
#外层使用map()函数针对pp_array的每一个元素执行操作,内层使用reduce()函数即两个相邻的价格,求出涨跌幅度,返回外层结果list。

#map、reduce和嵌套lambda的结合运用

# round将float保留几位小数,以下保留3位

#python3使用reduce需要import一下

from functools import reduce 

new_array = map(
    lambda pp: reduce(lambda a, b: round((b - a) / a, 3), pp),
    pp_array)
# new_array是个迭代器,用list方法转换成列表,用 insert插入数据,将第一天的涨跌幅设置为0
change_array=list(new_array)
change_array.insert(0,0)
change_array
 

#通过namedtuple重构数据结构加入变动,通过zip从date,price,change三个列表取数,用ordereddic组成字典用date作为key
stock_namedtuple=namedtuple('stock',('date','price','change'))
stock_dict=OrderedDict((date,stock_namedtuple(date,price,change)) for date,price,change in zip(date_array,price_array,change_array))
stock_dict

#通过filter函数筛选数据
up_days=filter(lambda day:day.change>0 ,stock_dict.values())
list(up_days)

#7 下面用一个通用的函数来完成筛选涨跌日和涨跌幅或求和的需求。
def filter_stock(stock_array_dict,want_up=True,want_calc_sum=False):
    if not isinstance(stock_array_dict,OrderedDict):
        #如果类型不是OrderedDict则产生错误
        raise TypeError("stock_array_dict type must be OrderedDict!")
    
    #python中的三目表达式的写法
    filter_func=(lambda day: day.change>0 if want_up else change<0)
    
    #使用filter_func作为筛选函数
    
    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

list(filter_stock(stock_dic,want_up=True,want_calc_sum=False))
#filter_stock(stock_dic,want_up=True,want_calc_sum=True)

#8 偏函数 对多参数函数的简化
from functools import partial
filter_stock_updays=partial(filter_stock,want_up=True,want_calc_sum=False)
filter_stock_up_sum=partial(filter_stock,want_up=True,want_calc_sum=True)
print('上涨的天数明细{}\n总涨幅{}'.format(list(filter_stock_updays(stock_dic)),filter_stock_up_sum(stock_dic)))

 

(未完)

转载请注明链接:https://mp.csdn.net/console/editor/html/106218355

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ddxn417

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值