python量化常用_Python量化常用函数
#-*- 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, _ inenumerate(price_array)]print(date_array)#['20170118', '20170119', '20170120', '20170121', '20170122']
zip函數
stock_tuple_list = [(date, price) for date, price inzip(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 inzip(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 importnamedtuple
stock_nametuple= namedtuple('stock', ('date', 'price'))
stock_nametuple_list= [stock_nametuple(date, price) for date, price inzip(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 importOrderedDict
stock_dict= OrderedDict((date, price) for date, price inzip(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等同于以下函數
deffunc(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 instock_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 importreduce#外層使用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 inzip(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 notisinstance(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 notwant_calc_sum:returnwant_days
change_sum= 0.0
for day inwant_days:
change_sum+=day.changereturn change_sum
偏函數 partial
from functools importpartial
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量化常用_Python量化常用函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 联网时win10电脑之间的内容共享win
- 下一篇: python求解微分方程组_python