finance / calculator.py
Jumper-Clown's picture
add paper trading back testing
0789d79
import numpy as np
import scipy as sp
from datetime import datetime
# test
import streamlit as st
def linear_regression_line(dates, y_list):
if not any(dates):
return 0, 0
if isinstance(dates[0], datetime):
dates = [ts.timestamp() for ts in dates]
if not isinstance(dates, np.ndarray):
dates = np.array(dates)
if not isinstance(y_list, np.ndarray):
y_list = np.array(y_list)
mean_x = np.mean(dates)
mean_y = np.mean(y_list)
# Calculate the slope (m) and y-intercept (c) of the regression line
m = np.sum((dates - mean_x) * (y_list - mean_y)) / np.sum((dates - mean_x) ** 2)
c = mean_y - m * mean_x
return m, c
def linear_regression_points(dates, y_list):
if not any(dates):
return 0, 0
if isinstance(dates[0], datetime):
dates = [ts.timestamp() for ts in dates]
if not isinstance(dates, np.ndarray):
dates = np.array(dates)
if not isinstance(y_list, np.ndarray):
y_list = np.array(y_list)
m, c = linear_regression_line(dates, y_list)
return m * dates + c
def linear_regression(dates, y_list):
if not any(dates):
return 0, 0
if isinstance(dates[0], datetime):
dates = [ts.timestamp() for ts in dates]
if not isinstance(dates, np.ndarray):
dates = np.array(dates)
if not isinstance(y_list, np.ndarray):
y_list = np.array(y_list)
m, c = linear_regression_line(dates, y_list)
y_low = m * dates[0] + c
y_high = m * dates[-1] + c
return y_low, y_high
def normalize(data_list, high=1.0, low=-1.0):
data = np.array(data_list)
min_val = np.min(data)
max_val = np.max(data)
delta = max_val - min_val
new_delta = high - low
data = ((data - min_val) * new_delta / delta) + low
return data
def intercepts(data1, data2):
intercept_indices = []
prev_data1_is_above = True
for index, (data1_v, data2_v) in enumerate(zip(data1, data2)):
data1_is_above = data1_v - data2_v >= 0.0
if index is not 0 and (not any(intercept_indices) or index is not intercept_indices[-1] + 1) and prev_data1_is_above is not data1_is_above:
intercept_indices.append(index)
prev_data1_is_above = data1_is_above
return intercept_indices