QuantX encompasses modules for real-time stock data collection, analysis, AI-driven position sizing, and data insights, providing traders with informed decision-making capabilities. Highlighting dynamic hedging strategies, advanced simulations, and slippage modeling, QuantX facilitates risk reduction and strategy enhancement. With its technical analysis tools and API integration, the project offers a robust platform for quantitative trading and in-depth market analysis.
-
Position Sizing Module:
- Calculates position sizes based on risk percentage and stop loss percentage.
- Supports calculation of position size with a specified maximum loss amount.
-
Moving Average Module:
- Computes simple moving averages (SMA) and exponential moving averages (EMA) for a given window size.
- Tracks and updates moving averages as new data points are added.
-
Mean Reversion Analysis Module:
- Analyzes mean reversion using historical price data.
- Provides methods to calculate mean reversion values, average mean reversion, and identify extreme values.
-
Market Data Analysis Module:
- Performs various market data analyses on historical price data.
- Calculates average price, volatility, upward and downward trends, and the relative strength index (RSI).
-
Dynamic Hedging Module:
- Implements dynamic hedging strategies based on moving averages.
- Determines short and long moving averages windows for analysis.
- Outputs moving average values and their changes over time.
-
Correlation Analysis Module:
- Conducts correlation analysis between two sets of historical price data.
- Calculates the correlation coefficient to measure the relationship between asset prices.
-
Slippage Modeling Module:
- Models slippage effects on trading.
- Considers slippage due to market conditions and trading volume.
- Adjusts slippage based on trade volume and market volatility.
-
Price History Management:
- Manages historical price data for various assets.
- Fetches historical price data using Yahoo Finance API.
- Stores and organizes data points for analysis.
-
Advanced Simulation:
- Performs Monte Carlo simulations to assess trading strategy performance.
- Simulates multiple scenarios with varying initial investments.
-
Time and Date Utilities:
- Converts between different time representations (POSIX timestamps and human-readable dates).
- Compares dates and checks their order.
//sys.cpp
int main() {
PriceHistory *snp500History = new PriceHistory("AAPL");
PriceHistory *eurusdHistory = new PriceHistory("EURUSD=X");
PriceHistory *euraudHistory = new PriceHistory("EURAUD=X");
snp500History->fetchHistoricalData("2017-12-01", "2017-12-31", "1d");
eurusdHistory->fetchHistoricalData("2018-01-01", "2018-01-10", "1d");
euraudHistory->fetchHistoricalData("2018-01-01", "2018-01-10", "1d");
cout << "Historical data for S&P 500 (Dec 2017):" << endl;
snp500History->printDataPoints();
try {
PricePoint dataPoint = snp500History->getDataPoint("2017-12-01");
cout << "Data point at 2017-12-01:" << endl;
dataPoint.printPricePoint();
} catch (const exception &e) {
cerr << e.what() << endl;
}
cout << "EUR/USD rates (Jan 2018):" << endl;
eurusdHistory->printDataPoints();
cout << "EUR/AUD rates (Jan 2018):" << endl;
euraudHistory->printDataPoints();
delete snp500History;
delete eurusdHistory;
delete euraudHistory;
}
//position_sizing.cpp
int main() {
// Create an instance of the PositionSizing class with a risk percentage and stop loss percentage
PositionSizing positionSizer(2.5, 0.02); // Example risk: 2.5%, stop loss: 2%
// Calculate position size based on risk percentage and stop loss
double portfolioSize = 100000; // Example portfolio size: $100,000
double entryPrice = 50; // Example entry price: $50 per share
double positionSize = positionSizer.calculatePositionSize(portfolioSize, entryPrice);
std::cout << "Calculated Position Size: " << positionSize << " shares" << std::endl;
// Modify risk and stop loss percentages
positionSizer.setRiskPercentage(3.0); // Change risk percentage to 3%
positionSizer.setStopLossPercentage(0.03); // Change stop loss percentage to 3%
// Calculate position size with a maximum loss amount
double maxLossAmount = 2500; // Example maximum allowable loss: $2,500
double positionSizeWithMaxLoss = positionSizer.calculatePositionSizeWithMaxLoss(portfolioSize, entryPrice, maxLossAmount);
std::cout << "Position Size with Max Loss: " << positionSizeWithMaxLoss << " shares" << std::endl;
return 0;
}
//moving_averages.cpp
int main() {
// Create a PriceHistory instance for the "AAPL" asset
PriceHistory priceHistory("AAPL");
// Fetch historical data for the specified date range and interval
priceHistory.fetchHistoricalData("2023-01-01", "2023-08-31", "1d");
// Define window size for moving averages and EMA smoothing factor
size_t windowSize = 5;
double emaSmoothingFactor = 0.2;
// Calculate and display moving averages for the fetched data
priceHistory.calculateMovingAverages(windowSize, emaSmoothingFactor);
return 0;
}
//mean_reversion.cpp
int main() {
PriceHistory priceHistory("AAPL"); // Create a PriceHistory instance for the "AAPL" asset
priceHistory.fetchHistoricalData("2023-01-01", "2023-08-31", "1d"); // Fetch historical data
int movingWindowSize = 10; // Define the moving window size for mean reversion calculation
MeanReversion meanReversion(priceHistory, movingWindowSize); // Create a MeanReversion instance
meanReversion.calculateMeanReversion(); // Calculate mean reversion values
meanReversion.printMeanReversionResults(); // Print mean reversion results
// Get statistics about mean reversion values
std::cout << "Average Mean Reversion: " << meanReversion.getAverageMeanReversion() << std::endl;
std::cout << "Max Mean Reversion Index: " << meanReversion.getMaxMeanReversionIndex() << std::endl;
std::cout << "Min Mean Reversion Index: " << meanReversion.getMinMeanReversionIndex() << std::endl;
return 0;
}
//market_data_analysis.cpp
int main() {
MarketDataAnalysis marketAnalysis("AAPL"); // Create a MarketDataAnalysis instance for "AAPL" asset
marketAnalysis.priceHistory_.fetchHistoricalData("2023-01-01", "2023-08-31", "1d"); // Fetch historical data
double avgPrice = marketAnalysis.calculateAveragePrice();
double volatility = marketAnalysis.calculateVolatility();
cout << "Average Price: " << avgPrice << endl;
cout << "Volatility: " << volatility << endl;
vector<PricePoint> upwardTrends = marketAnalysis.getUpwardTrends();
vector<PricePoint> downwardTrends = marketAnalysis.getDownwardTrends();
cout << "Number of Upward Trends: " << upwardTrends.size() << endl;
cout << "Number of Downward Trends: " << downwardTrends.size() << endl;
size_t rsiPeriod = 14; // RSI calculation period
double rsiValue = marketAnalysis.calculateRelativeStrengthIndex(rsiPeriod);
cout << "RSI for period " << rsiPeriod << ": " << rsiValue << endl;
return 0;
}
//dynamic_hedging.cpp
int main() {
string assetSymbol = "AAPL";
const char* startDate = "2023-01-01";
const char* endDate = "2023-08-31";
const char* interval = "1d";
DynamicHedging dynamicHedging(assetSymbol, startDate, endDate, interval);
dynamicHedging.performDynamicHedging();
return 0;
}
```cpp
//correlation_analysis.cpp
int main() {
string assetSymbolA = "AAPL"; // Asset symbol for the first historical data
string assetSymbolB = "MSFT"; // Asset symbol for the second historical data
const char* startDate = "2023-01-01";
const char* endDate = "2023-08-31";
const char* interval = "1d";
// Create PriceHistory instances for both assets and fetch historical data
PriceHistory historyA(assetSymbolA);
historyA.fetchHistoricalData(startDate, endDate, interval);
PriceHistory historyB(assetSymbolB);
historyB.fetchHistoricalData(startDate, endDate, interval);
// Create a CorrelationAnalysis instance and calculate correlation
CorrelationAnalysis correlationAnalysis(historyA, historyB);
double correlation = correlationAnalysis.calculateCorrelation();
std::cout << "Correlation between " << assetSymbolA << " and " << assetSymbolB << ": " << correlation << std::endl;
return 0;
}
//slippage_model
int main() {
PriceHistory priceHistory("AAPL");
priceHistory.fetchHistoricalData("2023-01-01", "2023-08-01", "1d");
SlippageModel slippageModel(priceHistory, 0.01);
// Convert date strings to time_t using a function like convertDateToEpoch()
time_t entryDate = convertDateToEpoch("2023-03-15");
double entryPrice = 150.0;
time_t exitDate = convertDateToEpoch("2023-06-15");
double exitPrice = 170.0;
double tradeVolume = 10000.0;
double calculatedSlippage = slippageModel.calculateSlippage(entryDate, entryPrice, exitDate, exitPrice, tradeVolume);
std::cout << "Calculated slippage: " << calculatedSlippage << std::endl;
return 0;
}