aboutsummaryrefslogtreecommitdiff
path: root/analysis.py
diff options
context:
space:
mode:
authorsotech117 <michael_foiani@brown.edu>2025-07-31 17:27:24 -0400
committersotech117 <michael_foiani@brown.edu>2025-07-31 17:27:24 -0400
commit5bf22fc7e3c392c8bd44315ca2d06d7dca7d084e (patch)
tree8dacb0f195df1c0788d36dd0064f6bbaa3143ede /analysis.py
parentb832d364da8c2efe09e3f75828caf73c50d01ce3 (diff)
add code for analysis of data
Diffstat (limited to 'analysis.py')
-rw-r--r--analysis.py87
1 files changed, 87 insertions, 0 deletions
diff --git a/analysis.py b/analysis.py
index 15ba0ef..912eb0a 100644
--- a/analysis.py
+++ b/analysis.py
@@ -1,5 +1,92 @@
import json
import datetime
+import os
+
+def summarize_results(batch_name):
+ """
+ Summarizes the results of the backtesting by calculating average percent gain/loss,
+ and finding the best stock order.
+ """
+
+ # get the result data json files under batches
+ batch_folder = f'batches/{batch_name}'
+ result_files = [f for f in os.listdir(batch_folder) if f.endswith('.json')]
+
+ results_summary = []
+
+ # make a dict for the algo table
+ algos_to_results = {}
+ print(len(result_files), "results found in", batch_folder)
+ for result in result_files:
+ file_path = os.path.join(batch_folder, result)
+ with open(file_path, 'r') as fd:
+ result_data = json.load(fd)
+
+ # extract the relevant data
+ result = result_data['backtest_results']
+ if not result:
+ continue
+
+ algo_name = result['algo_name']
+ algo_params = result['algo_params']
+ algo_key = f"{algo_name}_{algo_params}"
+
+ if algo_key not in algos_to_results:
+ algos_to_results[algo_key] = {
+ 'percent_gains': [],
+ 'stock_orders': []
+ }
+
+ algos_to_results[algo_key]['percent_gains'].append(result['percent_gain'])
+
+ stock_ticker = result_data['url_params']['ticker']
+ algos_to_results[algo_key]['stock_orders'].append(stock_ticker)
+
+ # summarize the results for each algo
+ for algo_name, result in algos_to_results.items():
+ algo_params = algo_name.split('_')[1] # Extract params from the key
+ if not result['percent_gains'] and not result['percent_losses']:
+ continue # Skip if no gains or losses
+
+ # calculate average percent gain/loss
+ avg_percent_gain = sum(result['percent_gains']) / len(result['percent_gains']) if result['percent_gains'] else 0
+
+ # calculate which stock ticker produced the best result
+ stock_orders = result['stock_orders']
+ if stock_orders:
+ best_stock_order = max(set(stock_orders), key=stock_orders.count)
+ else:
+ best_stock_order = "N/A"
+
+ # Append the summarized data
+ results_summary.append([
+ algo_name,
+ algo_params,
+ avg_percent_gain,
+ best_stock_order
+ ])
+
+ # Sort the results by average percent gain in descending order
+ results_summary.sort(key=lambda x: x[2], reverse=True)
+
+ print(algos_to_results)
+
+ return results_summary
+
+def test():
+ """
+ Test function to summarize results from a specific batch.
+ """
+ batch_name = 'test-1-ema'
+ results = summarize_results(batch_name)
+ if results:
+ print("Results Summary:")
+ for row in results:
+ print(row)
+ else:
+ print("No results found.")
+
+test()
# pull stock data from json files
# timestamps_file = open('timestamps.json', 'r')