Included diverging and converging status calculation
This commit is contained in:
+9
-9
@@ -8,23 +8,23 @@ calculate:
|
|||||||
overlap_pct: 90
|
overlap_pct: 90
|
||||||
max_p_value: 0.05
|
max_p_value: 0.05
|
||||||
monitor:
|
monitor:
|
||||||
interval: 10
|
interval: 20
|
||||||
calculations:
|
calculations:
|
||||||
long:
|
long:
|
||||||
from: 60
|
from: 30
|
||||||
min_prices: 2000
|
min_prices: 300
|
||||||
max_set_size_diff_pct: 50
|
max_set_size_diff_pct: 50
|
||||||
overlap_pct: 50
|
overlap_pct: 50
|
||||||
max_p_value: 0.05
|
max_p_value: 0.05
|
||||||
medium:
|
medium:
|
||||||
from: 30
|
from: 10
|
||||||
min_prices: 1000
|
min_prices: 100
|
||||||
max_set_size_diff_pct: 50
|
max_set_size_diff_pct: 50
|
||||||
overlap_pct: 50
|
overlap_pct: 50
|
||||||
max_p_value: 0.05
|
max_p_value: 0.05
|
||||||
short:
|
short:
|
||||||
from: 10
|
from: 2
|
||||||
min_prices: 200
|
min_prices: 30
|
||||||
max_set_size_diff_pct: 50
|
max_set_size_diff_pct: 50
|
||||||
overlap_pct: 50
|
overlap_pct: 50
|
||||||
max_p_value: 0.05
|
max_p_value: 0.05
|
||||||
@@ -72,8 +72,8 @@ logging:
|
|||||||
developer:
|
developer:
|
||||||
inspection: false
|
inspection: false
|
||||||
window:
|
window:
|
||||||
x: 24
|
x: 101
|
||||||
y: 38
|
y: 9
|
||||||
width: 1510
|
width: 1510
|
||||||
height: 956
|
height: 956
|
||||||
style: 541072960
|
style: 541072960
|
||||||
|
|||||||
@@ -58,11 +58,20 @@ class CorrelationStatus:
|
|||||||
|
|
||||||
# All status's for symbol pair from monitoring. Status set from assessing coefficient for all timeframes from last run.
|
# All status's for symbol pair from monitoring. Status set from assessing coefficient for all timeframes from last run.
|
||||||
STATUS_NOT_CALCULATED = CorrelationStatus(-1, 'NOT CALC', 'Coefficient could not be calculated')
|
STATUS_NOT_CALCULATED = CorrelationStatus(-1, 'NOT CALC', 'Coefficient could not be calculated')
|
||||||
STATUS_ABOVE_DIVERGENCE_THRESHOLD = CorrelationStatus(1, 'ABOVE', 'All coefficients equal to or above the divergence '
|
STATUS_CORRELATED = CorrelationStatus(1, 'CORRELATED', 'Coefficients for all timeframes are equal to or above the '
|
||||||
'threshold')
|
'divergence threshold')
|
||||||
STATUS_BELOW_DIVERGENCE_THRESHOLD = CorrelationStatus(2, 'BELOW', 'All coefficients below the divergence threshold')
|
STATUS_DIVERGED = CorrelationStatus(2, 'DIVERGED', 'Coefficients for all timeframes are below the divergence threshold')
|
||||||
STATUS_INCONSISTENT = CorrelationStatus(3, 'INCONSISTENT', 'Coefficients not consistently above or below divergence '
|
STATUS_INCONSISTENT = CorrelationStatus(3, 'INCONSISTENT', 'Coefficients not consistently above or below divergence '
|
||||||
'threshold')
|
'threshold and are neither trending towards divergence or '
|
||||||
|
'convergence')
|
||||||
|
STATUS_DIVERGING = CorrelationStatus(4, 'DIVERGING', 'Coefficients, when ordered by timeframe, are trending '
|
||||||
|
'towards convergence. The shortest timeframe is below the '
|
||||||
|
'divergence threshold and the longest timeframe is above the '
|
||||||
|
'divergence threshold')
|
||||||
|
STATUS_CONVERGING = CorrelationStatus(5, 'CONVERGING', 'Coefficients, when ordered by timeframe, are trending '
|
||||||
|
'towards divergence. The shortest timeframe is above the '
|
||||||
|
'divergence threshold and the longest timeframe is below the '
|
||||||
|
'divergence threshold')
|
||||||
|
|
||||||
|
|
||||||
class Correlation:
|
class Correlation:
|
||||||
@@ -223,7 +232,7 @@ class Correlation:
|
|||||||
|
|
||||||
# Loop through all symbol pair combinations and calculate coefficient. Make sure you don't double count pairs
|
# Loop through all symbol pair combinations and calculate coefficient. Make sure you don't double count pairs
|
||||||
# eg. (USD/GBP AUD/USD vs AUD/USD USD/GBP). Use grid of all symbols with i and j axis. j starts at i + 1 to
|
# eg. (USD/GBP AUD/USD vs AUD/USD USD/GBP). Use grid of all symbols with i and j axis. j starts at i + 1 to
|
||||||
# avoid duplicating. We will store all coefficients in a dataframe for export as CSV.
|
# avoid duplicating. We will store all coefficients in a dataframe.
|
||||||
index = 0
|
index = 0
|
||||||
# There will be (x^2 - x) / 2 pairs where x is number of symbols
|
# There will be (x^2 - x) / 2 pairs where x is number of symbols
|
||||||
num_pair_combinations = int((len(symbols) ** 2 - len(symbols)) / 2)
|
num_pair_combinations = int((len(symbols) ** 2 - len(symbols)) / 2)
|
||||||
@@ -387,8 +396,8 @@ class Correlation:
|
|||||||
symbol1_prices_filtered = symbol1_prices[symbol1_prices['time'].isin(intersect_dates)]
|
symbol1_prices_filtered = symbol1_prices[symbol1_prices['time'].isin(intersect_dates)]
|
||||||
symbol2_prices_filtered = symbol2_prices[symbol2_prices['time'].isin(intersect_dates)]
|
symbol2_prices_filtered = symbol2_prices[symbol2_prices['time'].isin(intersect_dates)]
|
||||||
|
|
||||||
# Calculate coefficient. Only use if p value is < 0.01 (highly likely that coefficient is valid and null
|
# Calculate coefficient. Only use if p value is < max_p_value (highly likely that coefficient is valid
|
||||||
# hypothesis is false).
|
# and null hypothesis is false).
|
||||||
coefficient_with_p_value = pearsonr(symbol1_prices_filtered['close'], symbol2_prices_filtered['close'])
|
coefficient_with_p_value = pearsonr(symbol1_prices_filtered['close'], symbol2_prices_filtered['close'])
|
||||||
coefficient = None if coefficient_with_p_value[1] > max_p_value else coefficient_with_p_value[0]
|
coefficient = None if coefficient_with_p_value[1] > max_p_value else coefficient_with_p_value[0]
|
||||||
|
|
||||||
@@ -716,23 +725,36 @@ class Correlation:
|
|||||||
:return: status
|
:return: status
|
||||||
"""
|
"""
|
||||||
status = STATUS_NOT_CALCULATED
|
status = STATUS_NOT_CALCULATED
|
||||||
values = coefficients.values()
|
|
||||||
|
|
||||||
if None not in values:
|
# Only continue if we have calculated all coefficients, otherwise we will return STATUS_NOT_CALCULATED
|
||||||
|
if None not in coefficients.values():
|
||||||
|
# Get the values ordered by timeframe descending
|
||||||
|
ordered_values = []
|
||||||
|
for key in sorted(coefficients, reverse=True):
|
||||||
|
ordered_values.append(coefficients[key])
|
||||||
|
|
||||||
if self.monitor_inverse and inverse:
|
if self.monitor_inverse and inverse:
|
||||||
# Calculation for inverse calculations
|
# Calculation for inverse calculations
|
||||||
if all(i <= self.divergence_threshold * -1 for i in values):
|
if all(i <= self.divergence_threshold * -1 for i in ordered_values):
|
||||||
status = STATUS_ABOVE_DIVERGENCE_THRESHOLD
|
status = STATUS_CORRELATED
|
||||||
elif all(i > self.divergence_threshold * -1 for i in values):
|
elif all(i > self.divergence_threshold * -1 for i in ordered_values):
|
||||||
status = STATUS_BELOW_DIVERGENCE_THRESHOLD
|
status = STATUS_DIVERGED
|
||||||
|
elif all(ordered_values[i] <= ordered_values[i+1] for i in range(0, len(ordered_values)-1, 1)):
|
||||||
|
status = STATUS_CONVERGING
|
||||||
|
elif all(ordered_values[i] > ordered_values[i+1] for i in range(0, len(ordered_values)-1, 1)):
|
||||||
|
status = STATUS_DIVERGING
|
||||||
else:
|
else:
|
||||||
status = STATUS_INCONSISTENT
|
status = STATUS_INCONSISTENT
|
||||||
else:
|
else:
|
||||||
# Calculation for standard correlations
|
# Calculation for standard correlations
|
||||||
if all(i >= self.divergence_threshold for i in values):
|
if all(i >= self.divergence_threshold for i in ordered_values):
|
||||||
status = STATUS_ABOVE_DIVERGENCE_THRESHOLD
|
status = STATUS_CORRELATED
|
||||||
elif all(i < self.divergence_threshold for i in values):
|
elif all(i < self.divergence_threshold for i in ordered_values):
|
||||||
status = STATUS_BELOW_DIVERGENCE_THRESHOLD
|
status = STATUS_DIVERGED
|
||||||
|
elif all(ordered_values[i] <= ordered_values[i+1] for i in range(0, len(ordered_values)-1, 1)):
|
||||||
|
status = STATUS_DIVERGING
|
||||||
|
elif all(ordered_values[i] > ordered_values[i+1] for i in range(0, len(ordered_values)-1, 1)):
|
||||||
|
status = STATUS_CONVERGING
|
||||||
else:
|
else:
|
||||||
status = STATUS_INCONSISTENT
|
status = STATUS_INCONSISTENT
|
||||||
|
|
||||||
|
|||||||
@@ -510,8 +510,10 @@ class DataTable(wx.grid.GridTableBase):
|
|||||||
# Is status one of interest
|
# Is status one of interest
|
||||||
value = self.GetValue(row, col)
|
value = self.GetValue(row, col)
|
||||||
if value != "":
|
if value != "":
|
||||||
if value in [cor.STATUS_BELOW_DIVERGENCE_THRESHOLD]:
|
if value in [cor.STATUS_DIVERGING]:
|
||||||
attr.SetBackgroundColour(wx.YELLOW)
|
attr.SetBackgroundColour(wx.RED)
|
||||||
|
elif value in [cor.STATUS_CONVERGING]:
|
||||||
|
attr.SetBackgroundColour(wx.GREEN)
|
||||||
else:
|
else:
|
||||||
attr.SetBackgroundColour(wx.WHITE)
|
attr.SetBackgroundColour(wx.WHITE)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user