coinsignal 1.4.9__cp312-cp312-manylinux2014_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of coinsignal might be problematic. Click here for more details.
- coinsignal/__init__.py +12 -0
- coinsignal/_ext.so +0 -0
- coinsignal/data.py +32 -0
- coinsignal/feature.py +39 -0
- coinsignal/label.py +38 -0
- coinsignal/model.py +76 -0
- coinsignal/parallel.py +21 -0
- coinsignal/sampler.py +26 -0
- coinsignal/tools.py +118 -0
- coinsignal-1.4.9.dist-info/METADATA +23 -0
- coinsignal-1.4.9.dist-info/RECORD +13 -0
- coinsignal-1.4.9.dist-info/WHEEL +5 -0
- coinsignal-1.4.9.dist-info/top_level.txt +1 -0
coinsignal/__init__.py
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
from . import _ext
|
|
2
|
+
from . import data
|
|
3
|
+
from . import feature
|
|
4
|
+
from . import label
|
|
5
|
+
from . import model
|
|
6
|
+
from . import parallel
|
|
7
|
+
from . import sampler
|
|
8
|
+
from . import tools
|
|
9
|
+
|
|
10
|
+
__version__ = '1.4.9'
|
|
11
|
+
|
|
12
|
+
__all__ = ['data', 'feature', 'label', 'model', 'parallel', 'sampler', 'tools']
|
coinsignal/_ext.so
ADDED
|
Binary file
|
coinsignal/data.py
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# --------------------------------------------------------------------------------
|
|
2
|
+
# Copyright (c) 2025 Zehao Yang
|
|
3
|
+
#
|
|
4
|
+
# Author: Zehao Yang
|
|
5
|
+
#
|
|
6
|
+
# This module implements data reading and transformation functions:
|
|
7
|
+
# • Reading raw market data from CSV files
|
|
8
|
+
# • Handling static and dynamic symbol selection
|
|
9
|
+
# • Transforming symbol-based data maps into feature maps
|
|
10
|
+
# --------------------------------------------------------------------------------
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
import _ext.data as _data
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
DEFAULT_DATA_PARAMS_DICT = {
|
|
17
|
+
'static_symbols': [],
|
|
18
|
+
'dynamic_symbols': {
|
|
19
|
+
'rule': '',
|
|
20
|
+
'count': 0
|
|
21
|
+
},
|
|
22
|
+
'sources': []
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def read_data_to_features_map(data_dir, date, look_back_days, look_ahead_days, data_params_dict):
|
|
27
|
+
features_map, read_data_errors = _data.read_data_to_features_map(data_dir, date, look_back_days, look_ahead_days, data_params_dict)
|
|
28
|
+
return features_map, read_data_errors
|
|
29
|
+
|
|
30
|
+
def transform_features_map_to_full_features_df(features_map):
|
|
31
|
+
full_features_df = _data.transform_features_map_to_full_features_df(features_map)
|
|
32
|
+
return full_features_df
|
coinsignal/feature.py
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# --------------------------------------------------------------------------------
|
|
2
|
+
# Copyright (c) 2025 Zehao Yang
|
|
3
|
+
#
|
|
4
|
+
# Author: Zehao Yang
|
|
5
|
+
#
|
|
6
|
+
# This module implements feature engineering functions:
|
|
7
|
+
# • Adding various features based on trade and reference exchange-market pairs
|
|
8
|
+
# --------------------------------------------------------------------------------
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
import _ext.feature as _feature
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
DEFAULT_FEATURE_PARAMS_DICT = {
|
|
15
|
+
'features':
|
|
16
|
+
{
|
|
17
|
+
'time': [],
|
|
18
|
+
'macd': [],
|
|
19
|
+
'rsi': [],
|
|
20
|
+
'price_move_range': [],
|
|
21
|
+
'price_trend': [],
|
|
22
|
+
'price_volume_corr': [],
|
|
23
|
+
'ohlcv': [],
|
|
24
|
+
'volatility': [],
|
|
25
|
+
'high_low_time': [],
|
|
26
|
+
'volume': [],
|
|
27
|
+
'basis': [],
|
|
28
|
+
'fixedstart': [],
|
|
29
|
+
'funding_rate': [],
|
|
30
|
+
'funding_time': [],
|
|
31
|
+
'index': []
|
|
32
|
+
},
|
|
33
|
+
'is_validating': False
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def add_features(features_map, feature_params_dict):
|
|
38
|
+
features_map = _feature.add_features(features_map, feature_params_dict)
|
|
39
|
+
return features_map
|
coinsignal/label.py
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# --------------------------------------------------------------------------------
|
|
2
|
+
# Copyright (c) 2025 Zehao Yang
|
|
3
|
+
#
|
|
4
|
+
# Author: Zehao Yang
|
|
5
|
+
#
|
|
6
|
+
# This module implements return (label) calculation functions:
|
|
7
|
+
# • Calculating return values for multiple horizons and decay multipliers
|
|
8
|
+
# • Handling time, duration, and range return types
|
|
9
|
+
# • Supporting funding rate adjustment and discrete return calculation
|
|
10
|
+
# --------------------------------------------------------------------------------
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
import _ext.label as _label
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
DEFAULT_RETURN_PARAMS_DICT = {
|
|
17
|
+
'pred_horizons': [600],
|
|
18
|
+
'decay_multipliers': [0.5, 0.8, 1, 1.5, 2, 3, 5, 10],
|
|
19
|
+
'return_type': 'time',
|
|
20
|
+
'range_direction': 'forward',
|
|
21
|
+
'range_horizon_limits': [0, 1000],
|
|
22
|
+
'range_merge_step': 1,
|
|
23
|
+
'n_multi': 1,
|
|
24
|
+
'multi_limits': [1, 1],
|
|
25
|
+
'half_life': 0,
|
|
26
|
+
'duration_vlimits': None,
|
|
27
|
+
'duration_qlimits': [0, 1],
|
|
28
|
+
'duration_handling': False,
|
|
29
|
+
'is_funding_adjusting': False,
|
|
30
|
+
'is_horizon_adjusting': False,
|
|
31
|
+
'is_discrete': False,
|
|
32
|
+
'y_multiplier': 10000
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def calculate_return(features_map, return_params_dict):
|
|
37
|
+
features_map = _label.calculate_return(features_map, return_params_dict)
|
|
38
|
+
return features_map
|
coinsignal/model.py
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# --------------------------------------------------------------------------------
|
|
2
|
+
# Copyright (c) 2025 Zehao Yang
|
|
3
|
+
#
|
|
4
|
+
# Author: Zehao Yang
|
|
5
|
+
#
|
|
6
|
+
# This module implements the main model training and evaluation pipeline:
|
|
7
|
+
# • Handling data splitting, scaling, auxiliary model processing, cross-validation,
|
|
8
|
+
# • Training and evaluating models with various metrics
|
|
9
|
+
# --------------------------------------------------------------------------------
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
import _ext.model as _model
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
DEFAULT_MODEL_PARAMS_DICT = {
|
|
16
|
+
'group_count': 5,
|
|
17
|
+
'train_ratio': 0.8,
|
|
18
|
+
'valid_sub_ratio': 0.25,
|
|
19
|
+
'test_isolate_time': 0,
|
|
20
|
+
'is_random_start': False,
|
|
21
|
+
'weight_limit': 1,
|
|
22
|
+
'is_sign_balanced': False,
|
|
23
|
+
'is_cv': True,
|
|
24
|
+
'cv_split_count': 4,
|
|
25
|
+
'cv_eval_train_metric': True,
|
|
26
|
+
'cv_selection_metric': 'mse',
|
|
27
|
+
'num_boost_round': 1000,
|
|
28
|
+
'log_evaluation_period': 50,
|
|
29
|
+
'evaluate_rounds': [400, 700, 1000],
|
|
30
|
+
'X_scaler_sub_params': {
|
|
31
|
+
'name': '',
|
|
32
|
+
'vlimits': None,
|
|
33
|
+
'qlimits': [0, 1],
|
|
34
|
+
'inner_scale': 1,
|
|
35
|
+
'outer_scale': 1
|
|
36
|
+
},
|
|
37
|
+
'y_scaler_sub_params': {
|
|
38
|
+
'name': '',
|
|
39
|
+
'vlimits': None,
|
|
40
|
+
'qlimits': [0, 1],
|
|
41
|
+
'inner_scale': 1,
|
|
42
|
+
'outer_scale': 1
|
|
43
|
+
},
|
|
44
|
+
'auxiliary_model_sub_params': {
|
|
45
|
+
'name': '',
|
|
46
|
+
'model_dir': '',
|
|
47
|
+
'vlimits': None,
|
|
48
|
+
'qlimits': [0, 1],
|
|
49
|
+
'sampling_modes': ['train', 'evaluate']
|
|
50
|
+
},
|
|
51
|
+
'loss_sub_params': {
|
|
52
|
+
'name': '',
|
|
53
|
+
'dof': 10,
|
|
54
|
+
'scale': 1,
|
|
55
|
+
'fee': 0.0001
|
|
56
|
+
},
|
|
57
|
+
'training_sub_params': {
|
|
58
|
+
'boosting_type': 'gbdt',
|
|
59
|
+
'num_leaves': 25,
|
|
60
|
+
'max_depth': 5,
|
|
61
|
+
'learning_rate': 0.005,
|
|
62
|
+
'reg_alpha': 1,
|
|
63
|
+
'reg_lambda': 1,
|
|
64
|
+
'min_gain_to_split': 0.1,
|
|
65
|
+
'extra_trees': True,
|
|
66
|
+
'objective': 'regression',
|
|
67
|
+
'metric': '',
|
|
68
|
+
'num_class': 1,
|
|
69
|
+
'verbose': -1
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def run_model(full_features_df, model_params_dict):
|
|
75
|
+
model_evaluations = _model.run_model(full_features_df, model_params_dict)
|
|
76
|
+
return model_evaluations
|
coinsignal/parallel.py
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# --------------------------------------------------------------------------------
|
|
2
|
+
# Copyright (c) 2025 Zehao Yang
|
|
3
|
+
#
|
|
4
|
+
# Author: Zehao Yang
|
|
5
|
+
#
|
|
6
|
+
# This module implements parallel processing for feature preparation:
|
|
7
|
+
# • Parallelizing data reading, feature and label calculations, sampling
|
|
8
|
+
# • Progress tracking for parallel processing across multiple dates
|
|
9
|
+
# --------------------------------------------------------------------------------
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
import _ext.parallel as _parallel
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def prepare_sub_full_features_df(data_dir, date, look_back_days, look_ahead_days, constants_dict, data_params_dict, feature_params_dict, return_params_dict, sampler_params_dict, N, n_completed, progress_update_event):
|
|
16
|
+
df, mft_df, mft_feature_plan, errors = _parallel.prepare_sub_full_features_df(data_dir, date, look_back_days, look_ahead_days, constants_dict, data_params_dict, feature_params_dict, return_params_dict, sampler_params_dict, N, n_completed, progress_update_event)
|
|
17
|
+
return df, mft_df, mft_feature_plan, errors
|
|
18
|
+
|
|
19
|
+
def prepare_full_features_df(data_dir, start_date, end_date, look_back_days, look_ahead_days, constants_dict, data_params_dict, feature_params_dict, return_params_dict, sampler_params_dict):
|
|
20
|
+
full_features_df, mft_full_features_df, mft_feature_plan, read_data_errors = _parallel.prepare_full_features_df(prepare_sub_full_features_df, data_dir, start_date, end_date, look_back_days, look_ahead_days, constants_dict, data_params_dict, feature_params_dict, return_params_dict, sampler_params_dict)
|
|
21
|
+
return full_features_df, mft_full_features_df, mft_feature_plan, read_data_errors
|
coinsignal/sampler.py
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# --------------------------------------------------------------------------------
|
|
2
|
+
# Copyright (c) 2025 Zehao Yang
|
|
3
|
+
#
|
|
4
|
+
# Author: Zehao Yang
|
|
5
|
+
#
|
|
6
|
+
# This module implements data sampling functions:
|
|
7
|
+
# • Sampling data on time using time intervals
|
|
8
|
+
# • Sampling data on move using smoothed price change
|
|
9
|
+
# • Sampling data on return using weighted random sampling
|
|
10
|
+
# --------------------------------------------------------------------------------
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
import _ext.sampler as _sampler
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
DEFAULT_SAMPLER_PARAMS_DICT = {
|
|
17
|
+
'sampling_time': 0,
|
|
18
|
+
'is_time_random': False,
|
|
19
|
+
'sampling_bp': 0,
|
|
20
|
+
'rolling_step': 0
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def sample_data(features_map, sampler_params_dict):
|
|
25
|
+
features_map = _sampler.sample_data(features_map, sampler_params_dict)
|
|
26
|
+
return features_map
|
coinsignal/tools.py
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# --------------------------------------------------------------------------------
|
|
2
|
+
# Copyright (c) 2025 Zehao Yang
|
|
3
|
+
#
|
|
4
|
+
# Author: Zehao Yang
|
|
5
|
+
#
|
|
6
|
+
# This module provides utility functions and helper classes:
|
|
7
|
+
# • I/O utilities for logging and progress tracking
|
|
8
|
+
# • Configuration loading and parameter updating
|
|
9
|
+
# • Rolling statistics calculations and various data processing helpers
|
|
10
|
+
# • Plotting functions for model performance visualization
|
|
11
|
+
# --------------------------------------------------------------------------------
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
import os
|
|
15
|
+
import sys
|
|
16
|
+
import yaml
|
|
17
|
+
import hashlib
|
|
18
|
+
import numpy as np
|
|
19
|
+
from datetime import datetime
|
|
20
|
+
import _ext.tools as _tools
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class RegressionIO:
|
|
24
|
+
def __init__(self, log_file):
|
|
25
|
+
self.sys_stdout = sys.stdout
|
|
26
|
+
self.ios = [sys.stdout, open(log_file, 'a', encoding='utf-8')]
|
|
27
|
+
|
|
28
|
+
def write(self, text):
|
|
29
|
+
current_time = get_current_time()
|
|
30
|
+
if text not in ['\n', '\r']:
|
|
31
|
+
text = f'[{current_time}] {text}'
|
|
32
|
+
for io in self.ios:
|
|
33
|
+
io.write(text)
|
|
34
|
+
|
|
35
|
+
def flush(self):
|
|
36
|
+
for io in self.ios:
|
|
37
|
+
io.flush()
|
|
38
|
+
|
|
39
|
+
def close(self):
|
|
40
|
+
for io in self.ios[1:]:
|
|
41
|
+
io.close()
|
|
42
|
+
|
|
43
|
+
def __enter__(self):
|
|
44
|
+
sys.stdout = self
|
|
45
|
+
return self
|
|
46
|
+
|
|
47
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
48
|
+
sys.stdout = self.sys_stdout
|
|
49
|
+
self.close()
|
|
50
|
+
return False
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def get_current_dir(current_file):
|
|
54
|
+
current_dir = os.path.dirname(os.path.abspath(current_file))
|
|
55
|
+
return current_dir
|
|
56
|
+
|
|
57
|
+
def get_current_time():
|
|
58
|
+
current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
|
59
|
+
return current_time
|
|
60
|
+
|
|
61
|
+
def write_log(log_file, log):
|
|
62
|
+
with open(log_file, 'w', encoding='utf-8') as f:
|
|
63
|
+
f.write(log)
|
|
64
|
+
|
|
65
|
+
def load_config(current_dir):
|
|
66
|
+
with open(f'{current_dir}/config.yaml', 'r', encoding='utf-8') as f:
|
|
67
|
+
config = yaml.safe_load(f)
|
|
68
|
+
config['start_date'] = str(config['start_date'])
|
|
69
|
+
config['end_date'] = str(config['end_date'])
|
|
70
|
+
return config
|
|
71
|
+
|
|
72
|
+
def initialize_random_seed(random_seed):
|
|
73
|
+
if random_seed is None:
|
|
74
|
+
random_seed = int(hashlib.md5(f'{datetime.now().timestamp()}_{os.urandom(8).hex()}'.encode()).hexdigest()[:8], 16)
|
|
75
|
+
np.random.seed(random_seed)
|
|
76
|
+
return random_seed
|
|
77
|
+
|
|
78
|
+
def update_params_dict(params_dict, default_params_dict):
|
|
79
|
+
new_params_dict = {}
|
|
80
|
+
for key in default_params_dict:
|
|
81
|
+
if isinstance(default_params_dict[key], dict):
|
|
82
|
+
new_params_dict[key] = update_params_dict(params_dict.get(key, {}), default_params_dict[key])
|
|
83
|
+
else:
|
|
84
|
+
new_params_dict[key] = params_dict.get(key, default_params_dict[key])
|
|
85
|
+
return new_params_dict
|
|
86
|
+
|
|
87
|
+
def make_results_dirs(output_dir, model_name, horizons):
|
|
88
|
+
model_dir = f'{output_dir}/{model_name}'
|
|
89
|
+
os.makedirs(model_dir, exist_ok=True)
|
|
90
|
+
os.makedirs(f'{model_dir}/results', exist_ok=True)
|
|
91
|
+
for horizon in horizons:
|
|
92
|
+
ret_col = f'ret-{horizon}'
|
|
93
|
+
os.makedirs(f'{model_dir}/results/{ret_col}', exist_ok=True)
|
|
94
|
+
os.makedirs(f'{model_dir}/results/{ret_col}/models', exist_ok=True)
|
|
95
|
+
os.makedirs(f'{model_dir}/results/{ret_col}/plots', exist_ok=True)
|
|
96
|
+
|
|
97
|
+
def copy_scripts(current_dir, output_dir, model_name, random_seed, scripts_folder='scripts'):
|
|
98
|
+
model_dir = f'{output_dir}/{model_name}'
|
|
99
|
+
os.makedirs(f'{model_dir}/{scripts_folder}', exist_ok=True)
|
|
100
|
+
file_and_folders = [f for f in os.listdir(current_dir) if not f.startswith('.')]
|
|
101
|
+
for f in file_and_folders:
|
|
102
|
+
if os.path.isfile(f'{current_dir}/{f}'):
|
|
103
|
+
with open(f'{current_dir}/{f}', 'r', encoding='utf-8') as file:
|
|
104
|
+
text = file.read()
|
|
105
|
+
if f == 'config.yaml':
|
|
106
|
+
row = [row for row in text.split('\n') if row.startswith('random_seed:')][0]
|
|
107
|
+
text = text.replace(row, f'random_seed: {random_seed}')
|
|
108
|
+
with open(f'{model_dir}/{scripts_folder}/{f}', 'w', encoding='utf-8') as file:
|
|
109
|
+
file.write(text)
|
|
110
|
+
else:
|
|
111
|
+
copy_scripts(f'{current_dir}/{f}', output_dir, model_name, random_seed, f'{scripts_folder}/{f}')
|
|
112
|
+
|
|
113
|
+
def validate_and_save_features(output_dir, model_name, full_features_df, mft_full_features_df, mft_feature_plan):
|
|
114
|
+
comparison_df = _tools.validate_and_save_features(output_dir, model_name, full_features_df, mft_full_features_df, mft_feature_plan)
|
|
115
|
+
return comparison_df
|
|
116
|
+
|
|
117
|
+
def summarize_and_save_results(output_dir, model_name, model_evaluations):
|
|
118
|
+
_tools.summarize_and_save_results(output_dir, model_name, model_evaluations)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: coinsignal
|
|
3
|
+
Version: 1.4.9
|
|
4
|
+
Summary: coin data analysis and return predicting framework
|
|
5
|
+
Author: Zehao Yang
|
|
6
|
+
Requires-Python: >=3.8
|
|
7
|
+
Description-Content-Type: text/plain
|
|
8
|
+
Requires-Dist: numpy>=1.20.0
|
|
9
|
+
Requires-Dist: pandas>=1.3.0
|
|
10
|
+
Requires-Dist: lightgbm>=3.3.0
|
|
11
|
+
Requires-Dist: scikit-learn>=1.0.0
|
|
12
|
+
Requires-Dist: matplotlib>=3.3.0
|
|
13
|
+
Requires-Dist: pyyaml>=5.4.0
|
|
14
|
+
Requires-Dist: joblib>=1.0.0
|
|
15
|
+
Requires-Dist: cython>=0.29.0
|
|
16
|
+
Dynamic: author
|
|
17
|
+
Dynamic: description
|
|
18
|
+
Dynamic: description-content-type
|
|
19
|
+
Dynamic: requires-dist
|
|
20
|
+
Dynamic: requires-python
|
|
21
|
+
Dynamic: summary
|
|
22
|
+
|
|
23
|
+
coin data analysis and return predicting framework
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
coinsignal-1.4.9.dist-info/METADATA,sha256=e9RXNmIpc-qOCrPxJDL4CiQgfpwNAPn3HGxm8d0h9xQ,626
|
|
2
|
+
coinsignal-1.4.9.dist-info/WHEEL,sha256=abiPiewrGIMBJasL3sP4UnsZN4xsTtRXnS1JXgFYjtg,112
|
|
3
|
+
coinsignal-1.4.9.dist-info/top_level.txt,sha256=8xBBVxKSVz2DM3nreUe-A7OGl7vCbK-3njdPu-JtUjw,11
|
|
4
|
+
coinsignal/__init__.py,sha256=LzN6rcSEJm9WonEOjhtXGJg7ev5ZR07IpI1PkUibr9U,269
|
|
5
|
+
coinsignal/_ext.so,sha256=fxnET7txIUeORb73boZww6dT00jgM8JcQixuPgoBf4Q,12959376
|
|
6
|
+
coinsignal/data.py,sha256=VUC5aC2yVFdzFhHHF01hdjGmUOUU9KxNx13rggj3cMM,1077
|
|
7
|
+
coinsignal/feature.py,sha256=kgBVCBXZWBLauptusI5p2Sof0DXJXo7jjq5YZivnaEc,1012
|
|
8
|
+
coinsignal/label.py,sha256=NRZgnje1baDasecNfiPxUcT-wj0NA-CvSgDLLmpsvBo,1207
|
|
9
|
+
coinsignal/model.py,sha256=F-DJhtr_QWwM1wc_ws_XkZqvWRJQKfX7NZ8m1BIO_SQ,2051
|
|
10
|
+
coinsignal/parallel.py,sha256=KKLRUc_LGqSfcfuhHi1vUGyJZHPhsvHbn6imQs1_6JQ,1592
|
|
11
|
+
coinsignal/sampler.py,sha256=3fRBUk2kFBZ_3ef6WdFYx0Hk2Sz1Cq8nB9PV4MFek7I,758
|
|
12
|
+
coinsignal/tools.py,sha256=l4nGZtcXUE5DiUx_yfcniu5klDASI3FgoLwHDJ83oxI,4485
|
|
13
|
+
coinsignal-1.4.9.dist-info/RECORD,,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
coinsignal
|