PKfNn6,,NetTrade/__init__.py"""NetTrade tools""" __version__ = '1.0.0' PKadN"NetTrade/ExcelDataUtil/__init__.pyPK`fN)!NetTrade/ExcelDataUtil/headers.pyclass Headers(object): fields_en2cn_map = { "value": "净值", "shares": "份额", "money": "金额", "date_str": "日期", "status": "状态", "timestamp": "时间戳" } fields_cn2en_map = {v: k for k, v in fields_en2cn_map.items()} fields_en_order = ["value", "shares", "money", "date_str", "status", "timestamp"] fields_cn_order = list() for i in fields_en_order: fields_cn_order.append(fields_en2cn_map[i]) @staticmethod def filter_en2cn(item): new_item = {k: v for k, v in zip(Headers.fields_cn_order, item)} return new_item @staticmethod def filter_cn2en(item): for float_keys in ("value", "shares", "money", "timestamp"): item[Headers.fields_en2cn_map[float_keys]] = round(float(item[Headers.fields_en2cn_map[float_keys]]), 3) r = tuple(item[k] for k in Headers.fields_cn_order) return r PK,ueN! (NetTrade/ExcelDataUtil/xlsxDataGetter.pyfrom idataapi_transform import ProcessFactory, GetterConfig from .headers import Headers from .xlsxDataWriter import XlsxDataWriter import os class XlsxDataGetter(object): @staticmethod def get_data(file_name, raise_if_not_exist=True): ret_list = list() if not os.path.exists(file_name): if raise_if_not_exist: raise ValueError("您还未进行过任何操作,请至少记录一次操作(买入/卖出),再进行查看/计算") else: return ret_list getter = ProcessFactory.create_getter(GetterConfig.RXLSXConfig(file_name, filter_=Headers.filter_cn2en)) for items in getter: ret_list.extend(items) return ret_list PK dN2>ii(NetTrade/ExcelDataUtil/xlsxDataWriter.pyfrom idataapi_transform import ProcessFactory, WriterConfig from .headers import Headers class XlsxDataWriter(object): @staticmethod def write_data(file_name, items): with ProcessFactory.create_writer(WriterConfig.WXLSXConfig(file_name, headers=Headers.fields_cn_order, filter_=Headers.filter_en2cn)) as writer: writer.write(items) PK-fN6%NetTrade/HistoryNotes/HistoryNotes.pyimport math from datetime import datetime from ..TestDataUtil.GetterFactory import GetterFactory from ..Variables.Status import Status class HistoryNotes(object): def __init__(self, strategy, source, code, begin_val, net_price, year_begin, year_end, log_for_every_round=False, **kwargs): """ :param source: 数据来源 :param code: 交易代码 :param begin_val: 入网净值 :param net_price: 初始价格 :param year_begin: 开始的年份 :param year_end: 结束的年份 :param log_for_every_round: 每当第一网卖出后,清空重新计算 """ getter = GetterFactory.create_getter(source) date_now = datetime.now() year_now = date_now.year if year_end > year_now: year_end = year_now result_data = list() for year in range(year_begin, year_end+1): ret_data = getter.get_data(code, year) result_data.extend(ret_data) self.strategy = strategy self.code = code self.begin_val = begin_val self.net_price = net_price self.log_for_every_round = log_for_every_round self.kwargs = kwargs self.operation_history = list() self.curr_strategy = None self.next_buy_value, self.next_buy_shares, self.next_buy_money, self.next_sell_value, self.next_sell_shares, self.next_sell_money = None, None, None, None, None, None for date_time, value in result_data: if not self.next_buy_value: # first net if value <= begin_val: self.buy(value, date_time, True) else: if value <= self.next_buy_value: self.buy(value, date_time) elif self.next_sell_value is not None and value >= self.next_sell_value: self.sell(value, date_time) if self.curr_strategy is not None: self.log_and_clear() def buy(self, value, date_time, first_time=False): if first_time: share = self.net_price / self.begin_val share = math.ceil(share / 100) * 100 money = share * value else: # recalculate next buy money if needed if value < self.next_buy_value: buy_tup, sell_tup = self.curr_strategy.calc_curr_buy_sell_val(value) self.next_buy_value, self.next_buy_shares, self.next_buy_money = buy_tup money = self.next_buy_money self.operation_history.append((value, round(money / value, 3), money, date_time.strftime("%Y-%m-%d %H:%M:%S"), Status.BUY, int(date_time.timestamp()))) if first_time: self.curr_strategy = self.strategy(self.operation_history, **self.kwargs) if self.kwargs else self.strategy(self.operation_history) else: self.curr_strategy.re_static() self.recalculate_next() def sell(self, value, date_time): if value > self.next_sell_value: buy_tup, sell_tup = self.curr_strategy.calc_curr_buy_sell_val(value) self.next_sell_value, self.next_sell_shares, self.next_sell_money = sell_tup self.operation_history.append((value, self.next_sell_shares, round(value * self.next_sell_shares, 3), date_time.strftime("%Y-%m-%d %H:%M:%S"), Status.SELL, int(date_time.timestamp()))) self.curr_strategy.re_static() self.recalculate_next() if value > self.operation_history[0][0] and self.log_for_every_round: self.log_and_clear() def recalculate_next(self): next_buy_bup, next_sell_tup = self.curr_strategy.calc_next_buy_sell_val() self.next_buy_value, self.next_buy_shares, self.next_buy_money = next_buy_bup if next_sell_tup: self.next_sell_value, self.next_sell_shares, self.next_sell_money = next_sell_tup else: self.next_sell_value, self.next_sell_shares, self.next_sell_money = None, None, None def log_and_clear(self): print("结束一轮网格: ") self.curr_strategy.print_status() self.operation_history = list() self.curr_strategy = None self.next_buy_value, self.next_buy_shares, self.next_buy_money, self.next_sell_value, self.next_sell_shares, self.next_sell_money = None, None, None, None, None, None PKeN!NetTrade/HistoryNotes/__init__.pyPKvfN(i NetTrade/Notes/RealNotes.pyimport time from ..ExcelDataUtil.xlsxDataGetter import XlsxDataGetter from ..ExcelDataUtil.xlsxDataWriter import XlsxDataWriter from ..Util.dateUtil import timestamp2datetime from ..Variables.Status import Status class RealNotes(object): def __init__(self, code, strategy, **kwargs): self.file_name = code + ".xlsx" self.code = code self.strategy = strategy self.operation_history = None self.kwargs = kwargs def pr_status(self): if self.operation_history is None: self.init_strategy() self.strategy.print_status() def calc_next_val(self): if self.operation_history is None: self.init_strategy() tup_buy, tup_sell = self.strategy.calc_next_buy_sell_val() buy_value, buy_shares, buy_money = tup_buy sell_value, sell_shares, sell_money = tup_sell print("\n\n下次买入价格: %-8s\t买入份额: %-8s\t买入金额: %-8s" % (buy_value, buy_shares, buy_money)) print("下次卖出价格: %-8s\t卖出份额: %-8s\t卖出金额: %-8s\n\n" % (sell_value, sell_shares, sell_money)) def buy(self, value, shares, ts=None): operation_history = XlsxDataGetter.get_data(self.file_name, raise_if_not_exist=False) # "value", "shares", "money", "date_str", "status", "timestamp"] if shares % 100 != 0: raise ValueError("请输入100的整数倍份额") money = shares * value if ts is None: ts = int(time.time()) operation_history.append((value, shares, money, timestamp2datetime(ts), Status.BUY, ts)) XlsxDataWriter.write_data(self.file_name, operation_history) def sell(self, value, shares, ts=None): operation_history = XlsxDataGetter.get_data(self.file_name) if ts is None: ts = int(time.time()) operation_history.append((value, shares, value * shares, timestamp2datetime(ts), Status.SELL, ts)) XlsxDataWriter.write_data(self.file_name, operation_history) def init_strategy(self): self.operation_history = XlsxDataGetter.get_data(self.file_name) self.strategy = self.strategy(self.operation_history, **self.kwargs) def calc_curr_val(self, value): if self.operation_history is None: self.init_strategy() tup_buy, tup_sell = self.strategy.calc_curr_buy_sell_val(value) if tup_buy is not None: buy_value, buy_shares, buy_money = tup_buy print("\n当前净值跌幅过大,需要加大买入, 价格: %-8s\t买入份额: %-8s\t买入金额: %-8s" % (buy_value, buy_shares, buy_money)) elif tup_sell is not None: sell_value, sell_shares, sell_money = tup_sell print("当前净值涨幅过大: 需要加大卖出,价格: %-8s\t卖出份额: %-8s\t卖出金额: %-8s\n" % (sell_value, sell_shares, sell_money)) else: print("\n当前净值波动在合理范围内\n") PK|eNNetTrade/Notes/__init__.pyPKfNV////!NetTrade/Strategy/NetstrategyA.pyimport time import math import logging from ..Variables.Status import Status class NetstrategyA(object): def __init__(self, operate_history, range_percent=0.03, growth_rate=0.2): """ :param operate_history: [(value1, shares, money1, date_str, status, timestamp), (value2, shares, money2, date_str, status, timestamp) ... ] :param range_percent: 幅度, e.g 0.03 :param growth_rate: 每网增加幅度 0.2 """ self.operate_history = operate_history self.buy_history_including_sold, self.sell_history, self.buy_history, \ self.curr_buy_money, self.sum_shares, self.curr_shares_worth, \ self.total_base_money, self.total_current_money, self.curr_val = self.split_history() self.init_val = self.operate_history[0][0] self.range_percent = range_percent self.growth_rate = growth_rate def re_static(self): self.buy_history_including_sold, self.sell_history, self.buy_history, \ self.curr_buy_money, self.sum_shares, self.curr_shares_worth, \ self.total_base_money, self.total_current_money, self.curr_val = self.split_history() self.init_val = self.operate_history[0][0] def calc_next_buy_sell_val(self): """ :return: ((buy_value, buy_shares, buy_money), (sell_value, sell_shares, sell_money)) """ if not self.buy_history: if self.operate_history: buy_tup = (self.operate_history[0][0], self.operate_history[0][1], self.operate_history[0][2]) else: buy_tup = None return buy_tup, None latest_buy_value, latest_buy_money = self.buy_history[-1][0], self.buy_history[-1][2] next_fall_value = round(latest_buy_value * (1 - self.range_percent), 3) next_fall_money = latest_buy_money * (1 + self.growth_rate) next_fall_shares = int(math.ceil(next_fall_money / next_fall_value / 100) * 100) # 取100的整数份额 next_fall_money = next_fall_value * next_fall_shares next_grow_value = latest_buy_value * (1 + self.range_percent) r = math.modf(next_grow_value * 1000) if r[0]: next_grow_value = (r[1] + 1) / 1000 else: next_grow_value = r[1] / 1000 next_grow_shares = 0 need_sell_history_index_including = self.bin_search(next_grow_value) for each in self.buy_history[need_sell_history_index_including:]: next_grow_shares += each[1] next_grow_money = next_grow_shares * next_grow_value return (round(next_fall_value, 4), round(next_fall_shares, 4), round(next_fall_money, 4)), \ (round(next_grow_value, 4), round(next_grow_shares, 4), round(next_grow_money, 4)) def calc_curr_buy_sell_val(self, curr_val): tup1, tup2 = self.calc_next_buy_sell_val() next_buy_value, next_buy_shares, next_buy_money = tup1 if tup2: next_sell_value, next_sell_shares, next_sell_money = tup2 else: next_sell_value, next_sell_shares, next_sell_money = None, None, None if next_sell_value is not None and curr_val > next_sell_value: # there are some shares need to be sold, but currently hold need_sell_history_index_including = self.bin_search(curr_val) next_grow_shares = 0 for each in self.buy_history[need_sell_history_index_including:]: next_grow_shares += each[1] next_grow_money = next_grow_shares * curr_val return None, (curr_val, next_grow_shares, round(next_grow_money, 4)) elif curr_val < next_buy_value: # need to buy more, price is lower than curr_val operation = self.buy_history[-1] if self.buy_history else self.operate_history[0] x = math.log(curr_val / operation[0], 1-self.range_percent) next_fall_money = operation[2] * math.pow(1 + self.growth_rate, x) next_fall_shares = int(math.ceil(next_fall_money / curr_val / 100) * 100) # 取100的整数份额 next_fall_money = curr_val * next_fall_shares return (curr_val, next_fall_shares, round(next_fall_money, 4)), None return None, None def bin_search(self, value, begin=None, end=None): if begin is None: begin = 0 if end is None: end = len(self.buy_history) - 1 if begin == end: # terminate if value > self.buy_history[begin][0]: return begin return end + 1 if end != len(self.buy_history) - 1 else None middle = int((begin + end) / 2) if value == self.buy_history[middle][0]: # best match, 不能卖出相同净值的买入份额 return self.bin_search(value, middle, middle) elif value < self.buy_history[middle][0]: return self.bin_search(value, middle+1, end) elif value > self.buy_history[middle][0]: return self.bin_search(value, begin, middle) def split_history(self): buy_history_including_sold = list() sell_history = list() buy_history = list() curr_buy_money = 0 # 当前投入的钱数 (还未卖出的钱数的和) sum_shares = 0 # 当前持有份额 curr_shares_worth = 0 # 投入部分当前市值(净值为 curr_val) total_current_money = 0 # 总的当前的钱数(投入部分当前市值 + 卖出部分获得的金额) already_sold_money = 0 # 总的卖出获得的金额 curr_used_money = 0 # 当前占用本金 curr_not_used_money = 0 # 当前卖出未占用本金 # 总收益率 = total_current_money / total_base_money for each in self.operate_history: if each[4] == Status.BUY: new_curr_not_used_money = curr_not_used_money curr_used_money += each[2] new_curr_not_used_money -= each[2] if new_curr_not_used_money < 0: new_curr_not_used_money = 0 already_sold_money -= curr_not_used_money else: already_sold_money -= each[2] curr_not_used_money = new_curr_not_used_money buy_history_including_sold.append(each) buy_history.append(each) elif each[4] == Status.SELL: sell_history.append(each) max_index = len(buy_history)-1 if len(buy_history) == 1: need_sell_history = buy_history max_index = -1 else: for i in range(max_index, -1, -1): max_index = i if buy_history[max_index][0] >= each[0]: break need_sell_history = buy_history[max_index + 1:] sold_rest_money = sum(i[2] for i in need_sell_history) curr_used_money -= sold_rest_money curr_not_used_money += sold_rest_money already_sold_money += each[0] * sum(i[1] for i in need_sell_history) buy_history = buy_history[:max_index+1] else: raise ValueError("Unknown status: %s" % (str(each), )) for i in buy_history: curr_buy_money += i[2] sum_shares += i[1] curr_val = self.operate_history[-1][0] curr_shares_worth = sum_shares * curr_val total_current_money = round(curr_shares_worth + already_sold_money, 2) return buy_history_including_sold, sell_history, buy_history, curr_buy_money, \ sum_shares, curr_shares_worth, round(curr_used_money + curr_not_used_money, 3), total_current_money, curr_val def print_status(self): print("操作历史:") if not self.operate_history: print("无任何操作记录") else: buy_history = list() curr_used_money = 0 # 当前占用本金 curr_not_used_money = 0 # 当前卖出未占用本金 already_sold_money = 0 print("%-10s\t%-10s\t%-10s\t%-10s\t%-20s\t%-15s\t%-10s" % ("净值", "份额", "金额", "操作", "日期", "当前动用过本金", "当前收益率")) for each in self.operate_history: total_current_money = 0 # 总的当前的钱数(投入部分当前市值 + 卖出部分获得的金额) if each[4] == Status.BUY: new_curr_not_used_money = curr_not_used_money curr_used_money += each[2] new_curr_not_used_money -= each[2] if new_curr_not_used_money < 0: new_curr_not_used_money = 0 already_sold_money -= curr_not_used_money else: already_sold_money -= each[2] curr_not_used_money = new_curr_not_used_money buy_history.append(each) else: if len(buy_history) == 1: need_sell_history = buy_history max_index = -1 else: max_index = len(buy_history) - 1 for i in range(max_index, -1, -1): max_index = i if buy_history[max_index][0] >= each[0]: break need_sell_history = buy_history[max_index + 1:] sold_rest_money = sum(i[2] for i in need_sell_history) curr_used_money -= sold_rest_money curr_not_used_money += sold_rest_money buy_history = buy_history[:max_index + 1] already_sold_money += each[0] * sum(i[1] for i in need_sell_history) sum_shares = sum(i[1] for i in buy_history) total_current_money += sum_shares * each[0] + already_sold_money total_used_base_money = curr_used_money + curr_not_used_money rate = (total_current_money - total_used_base_money) / total_used_base_money print("%-10s\t%-10s\t%-10s\t%-10s\t%-20s\t%-20s\t%-10s" % (str(each[0]), str(each[1]), str(each[2]), Status.CN_MAP[str(each[4])], each[3], round(total_used_base_money, 3), "%.2f%%" % (rate * 100, ))) print("\n%s" % ("当前投入的钱数 (还未卖出的钱数的和): ", ), round(self.curr_buy_money, 3)) print("%s" % ("当前持有份额: ", ), self.sum_shares) print("%s" % ("投入部分当前市值: ", ), round(self.curr_shares_worth, 3)) print("%s" % ("总的使用过的本金(当前投入的本金 + 卖出的本金): ", ), self.total_base_money) print("%s" % ("总的当前的资产(投入部分当前市值 + 卖出部分获得的金额): ", ), self.total_current_money) rate = (self.total_current_money - self.total_base_money) / self.total_base_money print("%s" % ("当前总收益: %.2f " % (self.total_current_money - self.total_base_money, ))) print("%s" % ("当前收益率: %.2f%% " % (rate * 100)), ) ts_begin = int(self.operate_history[0][5]) ts_now = int(self.operate_history[-1][5]) days_interval = (ts_now - ts_begin) / (24 * 3600) years_interval = days_interval / 365 if years_interval < 1: average_year_rate = (365 * rate / days_interval) if days_interval else 0 else: if rate < 0: sign = -1 else: sign = 1 average_year_rate = sign * math.pow(abs(rate), 1 / years_interval) print("\n%s" % ("第一份到最后份时长: %.2f 天, 平均年化: %.2f%% " % (days_interval, average_year_rate * 100)), ) PKecNNetTrade/Strategy/__init__.pyPK`dNqE#NetTrade/TestDataUtil/DataGetter.pyimport abc class DataGetter(object): @abc.abstractmethod def get_data(self, stock_code, date): """ :param stock_code: e.g sz162411 :param date: e.g 2018 :return: [(datetime1, value1), (datetime2, value2)] """ pass PK4TfN 00&NetTrade/TestDataUtil/GetterFactory.pyfrom .JSLGetter import JSLGetter getter_map = { "jsl": JSLGetter } class GetterFactory(object): def create_getter(self, source="jsl"): if source not in getter_map: raise NotImplementedError("date getter: %s not Implemented" % (source, )) return getter_map[source]() PK2cfNv6"NetTrade/TestDataUtil/JSLGetter.pyimport requests import logging from datetime import datetime from idataapi_transform import ProcessFactory # for log from .DataGetter import DataGetter class JSLGetter(DataGetter): def get_data(self, stock_code, date): """ :param stock_code: e.g sz162411 :param date: e.g 2018 :return: [(datetime1, value1), (datetime2, value2)] """ url = "http://data.gtimg.cn/flashdata/hushen/daily/%s/%s.js" % (str(date)[2:], stock_code) logging.info("requesting %s" % (url, )) r = requests.get(url) if '404' in r.text: raise ValueError("无法从以下 url 获取到历史数据,请确保参数均填写正确: %s" % (url, )) ret_data = list() for line in r.text.split("\n")[1:-1]: line_lst = line.split(" ") date_obj = datetime.strptime(line_lst[0], "%y%m%d") val = float(line_lst[-2]) ret_data.append((date_obj, val)) return ret_data PK�����aN������������!���NetTrade/TestDataUtil/__init__.pyPK�����dN���������������NetTrade/Util/__init__.pyPK�����eN/i�������NetTrade/Util/dateUtil.pyimport time def timestamp2datetime(value): """ timestamp2datetime(1471234567) -> "2016-1-1 12:12:12" """ struct_time = time.localtime(value) dt = time.strftime('%Y-%m-%d %H:%M:%S', struct_time) return dt def datetime2timestamp(dt): """ datetime2timestamp("2016-1-1 12:12:12") -> 1471234567 """ struct_time = time.strptime(dt, "%Y-%m-%d %H:%M:%S") return int(time.mktime(struct_time)) PK�����cNHx���x������NetTrade/Variables/Status.py class Status(object): BUY = "1" SELL = "2" CN_MAP = { BUY: "买入", SELL: "卖出" } PK�����-cN���������������NetTrade/Variables/__init__.pyPK�����aNb+��+�� ���NetTrade-1.0.0.dist-info/LICENSEMIT License Copyright (c) 2019 Guo Zpoint Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. PK������!H>*R���Q������NetTrade-1.0.0.dist-info/WHEEL HM K-*ϳR03rOK-J,/RH,rzd&Y)r$[)T&Ur�PK������!HC����!���NetTrade-1.0.0.dist-info/METADATA]N0w?_ NZb DHTiE ̦ }X:beAk"ϟ<@\uRvYB1ԊvaȤPJrP:sL+ Dx%.6*\-s s9y2ģ 6qbVW_֟+p-?6̚hi"7+ -K{>L8'S E9I&u"r*OFhERm{L|aNYs PK������!Hs8{O�������NetTrade-1.0.0.dist-info/RECORDIH{b_}HYdE &)~{<<f!( FeLV,1xS 'CA,ٔw4 2I; P7󃒖4?1}X?)V})+7F#Omք͝SCF,ݫ#+g(ሹ+WR)oU=jo` #Cx~/qy߬soA o.Ejݩ }x\J=EX/?}T1Ce�R8&a$4{f,B[ ',egd|a7o'N TF񯄑X^j a e4$NgE OrK\$|ND^s f!a~]F1̋d{ r>vu,(ɓccwbzG'0^>_-ysH�"H uж3B '+{-tE[jIa6WrRwy8 $ze!$F5W#wo<&nt 7+3lXp[M_sbsx<B?Q/EŨjwge'!$B3⡊c\pŁ7m``M`ݙV)԰731<}g旽8OU{tULWPkɹT/ 6DT<*=60c0vg1} $a~c &zC; =r-|tjYnZ6pkԐ< rwPBߓP~ڃJrs4uUEH| ;`9"| PK�����fNn6,���,������������������NetTrade/__init__.pyPK�����adN������������"�����������^���NetTrade/ExcelDataUtil/__init__.pyPK�����`fN)����!��������������NetTrade/ExcelDataUtil/headers.pyPK�����,ueN! ����(�������������NetTrade/ExcelDataUtil/xlsxDataGetter.pyPK����� dN2>i��i��(�������������NetTrade/ExcelDataUtil/xlsxDataWriter.pyPK�����-fN6����%�����������e ��NetTrade/HistoryNotes/HistoryNotes.pyPK�����eN������������!�������������NetTrade/HistoryNotes/__init__.pyPK�����vfN(i �� ���������������NetTrade/Notes/RealNotes.pyPK�����|eN�����������������������&��NetTrade/Notes/__init__.pyPK�����fNV//��//��!�����������&��NetTrade/Strategy/NetstrategyA.pyPK�����ecN�����������������������aV��NetTrade/Strategy/__init__.pyPK�����`dNqE�����#�����������V��NetTrade/TestDataUtil/DataGetter.pyPK�����4TfN 0��0��&�����������W��NetTrade/TestDataUtil/GetterFactory.pyPK�����2cfNv6����"�����������`Y��NetTrade/TestDataUtil/JSLGetter.pyPK�����aN������������!�����������]��NetTrade/TestDataUtil/__init__.pyPK�����dN�����������������������]��NetTrade/Util/__init__.pyPK�����eN/i���������������]��NetTrade/Util/dateUtil.pyPK�����cNHx���x��������������_��NetTrade/Variables/Status.pyPK�����-cN�����������������������`��NetTrade/Variables/__init__.pyPK�����aNb+��+�� �����������`��NetTrade-1.0.0.dist-info/LICENSEPK������!H>*R���Q��������������9e��NetTrade-1.0.0.dist-info/WHEELPK������!HC����!�����������e��NetTrade-1.0.0.dist-info/METADATAPK������!Hs8{O���������������g��NetTrade-1.0.0.dist-info/RECORDPK��������j����