Licensing

Licensing

Permission to use, copy, and distribute AlgoQuant (but not the paid models and modules) and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of the copyright holders not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. The copyright holders makes no representations about the suitability of this software for any purpose. It is provided “as is” without express or implied warranty. Permission to modify the software is granted, but NOT the right to distribute the modified code in either source or binary format. THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Full Licensing Terms: ​http://numericalmethod.com/algoquant-licensing-terms/

Features

Features

Features Highlight

Unified Mathematical Analysis and Modeling Library

AlgoQuant has a large collection of mathematical models, many from top academic journal publications, which a trader can use as building blocks to create his own trading models. For example, to build a mean reversion model, the trader can combine (D’Aspremont, 2011)to construct a maximally mean reverting portfolio of two assets and then trade the pair using (Elliott, van der Hoek, & Malcolm, 2005)pair trading strategy. Both mathematical modules are available in the library. In addition, AlgoQuant has a large number of algorithms that the trader can apply. For example, in the area of portfolio optimization, AlgoQuant covers Quadratic Programming(Markowitz or Modern Portfolio Theory), Second Order Conic Programmingas well as Differential Evolution. In other words, using AlgoQuant, the trader does not need external math software like Excel, R, or MATLAB, and there are many readily available modules and algorithms to use. He can quickly build up very complicated mathematical strategies by combining together the components from the library.

Uniqueness

NM FinTech Inc. has a unique way of doing backtest. In general, backtest using historical data alone is not a sufficient justification of a quantitative trading strategy. Historical backtest tells only how much money we could have made in the past. What we really want to know is how much money we may make in the future. The future P&L is a random variable. Therefore, in addition to reporting the historical P&L, a proper backtest should, when applicable and feasible, report also the probability function of the future P&L.

In general, optimizing strategy parameters is a very difficult optimization problem due to, e.g., curse of dimensionality, discrete or integral variables, trading constraints. AlgoQuant comes with a suite of professional optimization tools, e.g.,LP, SDP, SOCP, QP, DEOptim, simulated annealing, genetic algorithm, to do strategy and portfolio optimization.

Moreover, we can only find the optimal strategy parameters with respect to, e.g., historical data, or a hypothetical model. The optimal parameters for live trading are going to be different than what we have picked. We hope that the (small) differences between the optimal parameters and our choices do not severely reduce the profit. So, AlgoQuant checks the stability of the strategy parameters around the chosen values by doing sensitivity analysis to see how the P&L curve changes.

Finally, AlgoQuant uses Monte Carlo simulationto stress test a strategy. We want to ensure (or check) that the strategy is profitable in many plausible situations. For example, the strategy needs to be profitable on average in many possible prices that have similar statistical properties as the ones we use in study before it can go live. Also, to identify the sources of profit, we compute the expected returns of trading a strategy under different (hopefully isolated) risk factors.

Trading Models

AlgoQuant has a collection of trading strategies and models, which can be purchased separately. They are found here: ​Quantitative Trading Strategies.

AlgoQuant Introduction

AlgoQuant Introduction

AlgoQuant is a collection of trading-bot building tools. It is a well developed and comprehensive library of codes which build systems for algorithmic trading in all aspects. You can use it to build systems for backtesting, trading strategy generation, data analysis, research, and actual order execution. AlgoQuant also supports data import, data filtering and cleaning, in-samples calibration, out-samples simulation and performance analysis. The main competitive advantage of AlgoQuant is the incorporation of NM Dev, a powerful modern library of mathematics, statistics, optimization and data mining.

Illustration with Infantino’s PCA Strategy

Illustration with Infantino’s PCA Strategy

In this tutorial, we demonstrate some powerful features of AlgoQuant (which is backed by our SuanShu library) using Infantino’s PCA strategy as an example. All the code referenced in this tutorial can be found in algoquant/model/infantino2010 package and its demo.

Powerful Mathematical Support

AlgoQuant is backed by our numerical library (SuanShu), so computing strategy signals becomes a very simple task, and the code usually takes only a few lines. For example, Infantino’s strategy computes its buy/sell signals based on principal component analysis (PCA). Here is the code snipplet for the computation of matrix D for the “dimensionally reduced returns” (mentioned on pages 25 and 26 in the paper):

PCA pca = new PCAbyEigen(X, false);

Vector mean = pca.mean();
Matrix M_t = rbind(mean);
Matrix M = rbind(nCopies(T, mean)); // each column is the average log returns for each stock
Matrix Y = X.minus(M); // T by N

List loadings = new ArrayList(k);
for (int i = 1; i < = k; ++i) {
    loadings.add(pca.loading(i));
}
Matrix PHI = cbind(loadings); // N by k
Matrix D = Y.multiply(PHI); // T by k

Quick Strategy Prototyping

With AlgoQuant, coding strategies for simulation can be done with minimal effort. A strategy class just needs to implement an interface, Strategy. Simulation in AlgoQuant is event-driven, so a strategy just needs to subscribe to the events it is interested, such as price changes, order executions, etc. By implementing the corresponding event handlers, the strategy is called back when the subscribed events happened. Here is the skeleton for Infantino Strategy which makes trade descisions upon price updates:

public class Infantino2010Strategy
        implements Strategy, DepthHandler {
    // ...
	@Override
    public void onDepthUpdate(DateTime now, Depth depth, MarketCondition mc, TradeBlotter blotter, Broker broker) {
        // ... compute buy/sell signals from the updated prices (or depths)
 
        List orders = param.infantinoOrders.getOrders(signal, regime, blotter.positions(), mc.depths());

        broker.sendOrder(orders);
    }
}

Convenient Data Loading

Historical price data from various sources (e.g., Bloomberg, Yahoo! Finance, Gain Capital, Compustat, etc.) can be loaded for simulation. For example, we use end-of-day data from Yahoo! Finance in our simulation. The following code snippet loads the data files cached in the harddrive or automatically downloads them from Yahoo! Finance website if the cache is absent.

// load data from Yahoo!
this.caches = 
    new DepthCaches(
    new DepthCacheFactory(){
      @Override
      public SequentialCache newInstance(Stock stock,Interval interval) throws Exception {
        return new YahooDepthCacheFactory("./log/Yahoo").newInstance(stock, interval);
      }
	},
    stocks,
    interval);

Simple Simulation Setup

Simulator with various options can be configured easily. For example, we configure the simulator to update the strategy with synchronized views of product depths by this:

new SimpleSimulatorBuilder().withDepthUpdates(caches).useExchangeRates(rates).synchronizeDepthUpdates().build();

Flexible & Extendible Performance Measures for Analysis

There are plenty of performance measures available for you to analyze the performance of your strategy (see performance package for more details). You can also conveniently develop your own set of measures.

List measures = new ArrayList();

double commissionRate = 0.005;
measures.add(new ProfitLossAfterCommission(commissionRate));
measures.add(new Commission(commissionRate));
measures.add(new InformationRatioForZeroInvestment(interval, Period.years(1), 0.));
measures.add(new MaxDrawdownPercentage(1.));
measures.add(new ExecutionCount());
// ... many other measures can be added

Parallelized Sensitivity Analysis and Monte Carlo Simulation

Usually, a strategy takes in a few parameters, and we want to find the optimal ones to trade with. In addition, we are also interested in how sensitive the strategy’s performance is to the change of these parameters. With parallelized SensitivityAnalyzer in AlgoQuant, you can find the answer in plots with a few lines of code (see Infantino2010ParamAnalysis):

SimSetting simSetting = new SimSetting(simulator, caches, rates);

SensitivityAnalyzer analyzer
	= new SensitivityAnalyzer(
	simSetting,
	measures,
	new StrategyFactory() {	
	  @Override
	  public Infantino2010Strategy newInstance(Param param) {
		return new Infantino2010Strategy(param);
	  }
	});

SensitivityAnalysisReport report = analyzer.run(params, new NoOpProgressListener());

SensitivityPlotterUtils.plotAllMeasures(new GenericParamPlotter(true), report);

printReport(report);

The simulations on various parameters run in parallel by utilizing all the available CPU cores, so that results can be obtained multiple times faster. Besides, you can also run MCSimulation with customizable price models.

Coding an AlgoQuant Strategy

Coding an AlgoQuant Strategy

There have been a number of questions on how to create a quantitative trading strategy using AlgoQuant. This is a brief introduction to the process, which will hopefully answer all questions you my have. Basic knowledge of the Java programming language is required, although you do not need to be an expert to follow this tutorial.

Sources of Inspiration

Of course you will need an idea of the type of strategy you want to develop. There are a number of popular (such as Moving Averages and Pairs Trading) and some more exotic strategies already included in AlgoQuant. You can use them as a template and build your own ideas on top of them for rapid prototyping. If you don’t want to use any of the built in strategies you can of course develop your own from scratch, in which case you may still find existing strategies useful as a code base or as examples if you are ever unsure about how something is done.

Implementing a Strategy

Once you have an idea for a strategy, coding it up is very straightforward. During a simulation in AlgoQuant a strategy object gets notified if an event (such as a price update) occurs, so that it can then carry out an action if desired. The strategy only has to deal with the type of event it has subscribed to and hence the amount of boilerplate code you have to write is minimal.

We define a strategy by implementing the Strategy interface. To handle updates of a certain kind, all you need to do is to process that kind of updates in onEvent() method. If any of this feels unfamiliar don’t worry. You can find an example below and there are plenty of others included in AlgoQuant.

A typical strategy will receive updates of one or more types and use the information from these updates to make orders via the broker. On each update the strategy also receives the complete state (prices for all equities, current portfolio) so that you do not need to keep track of it yourself.

Example

As an example I will show how to write an extremely simple strategy: We long a stock if the previous period’s return was positive and short otherwise (this is a special case of the Geometric Moving Average strategy with lag times 1 and 2 periods). The full source code can be found in AlgoQuant in com.numericalmethod.algoquant.execution.strategy.demo or here.

public class TutorialStrategy implements Strategy {

    private final double scale = 1;
    private final Product product;
    private Double previousPrice = null;

    public TutorialStrategy(Product product) {
        this.product = product;
    }

    @Override
    public void onEvent(TraderContext ctx, Event evt) {
        if (evt instanceof OrderBook) {
            onOrderBookUpdate(ctx);
        }
    }

    private void onOrderBookUpdate(TraderContext ctx) {
        double currentPrice = ctx.marketCondition().orderBook(product).mid();
        if (previousPrice != null) {
            Collection orders
                = computeOrders(
                    currentPrice,
                    ctx.tradeBlotter().position(product)
                );
            ctx.broker().sendOrder(orders);
        }
        previousPrice = currentPrice;
    }

    private Collection computeOrders(
        double currentPrice,
        double position
    ) {
        double qty = 0.;
        if (currentPrice >= previousPrice) {
            qty = scale - position;
        } else if (currentPrice < previousPrice) {
            qty = -scale - position;
        }

        if (qty == 0.) {
            return Collections.emptySet();
        }

        return singletonList(newMarketOrder(product, qty));
    }
}

The only parameter of this strategy is a Product object that states which product we are trading with. The scale of our simulation is taken to be 1. The method onDepthUpdate receives depth updates. Note that the arguments it takes also include:

  • The current time
  • The market condition, which stores the most recent depths for ALL equities
  • The TradeBlotter which contains all past executions and our positions for all stocks
  • The broker which can be used to place orders

On each orderbook update we call computeOrders(). This method compares the current to the previous periods’ price. If the current price is greater than or equal to the previous one, we buy according to our position (the number of stocks we hold) and scale (the number of stocks we would like to hold). If the current price is less than or equal to the previous one we sell.

The order is then passed to the broker as a market order. Finally we store the current price in previousPrice so that it can be retrieved on the next update.

Data Cleaning / Filtering

Next we need to fetch and prepare data for backtesting. When working with real world data there is often some work necessary to get it into the right format for processing. In AlgoQuant you can do this easily by using cache processors. There are built in processors for eliminating faulty data points, sampling the data at regular intervals (for example to get monthly instead of daily data), filtering for outliers and many other common duties. For example this is how we could get monthly data for the Hang Seng index.

	// set up the product
	final Stock stock = HSI.getInstance();

	// specify the simulation period
	DateTime begin = JodaTimeUtils.getDate(2000, 1, 1, stock.exchange().timeZone());
	DateTime end = JodaTimeUtils.getDate(2012, 1, 1, stock.exchange().timeZone());
	Interval interval = new Interval(begin, end);

	// set up the data source; we download data from Yahoo! Finance here.
	YahooDepthCacheFactory yahoo = new YahooDepthCacheFactory(SimTemplateYahooEOD.DEFAULT_DATA_FOLDER);
	SequentialCache dailyData = yahoo.newInstance(stock, interval);

	// clean the data using filters; we simulate using only monthly data.
	EquiTimeSampler monthlySampler = new EquiTimeSampler(Period.months(1));
	SequentialCache monthlyData = monthlySampler.process(dailyData);

The code first defines the product and date range for the simulation and then initializes Yahoo end-of-day data as the data source. Since the Yahoo data is daily, we use an EquiTimeSampler to sample the data at a one month interval.

For some data sources you may need to clean the data first. Algoquant allows chaining of filters, so that you can for instance, first filter our NaNs or entries with missing data and then perform further processing. This process is usually extremely tedious, error prone and time consuming in Matlab/R, but in Algoquant only takes a couple of lines of code.

Backtesting the Strategy

After you have written the strategy it is time to backtest it.

	// set up the data source to feed into the simulator
	DepthCaches depthCaches = new DepthCaches(stock, monthlyData);

	// construct an instance of the strategy to simulate
	Strategy strategy = new TutorialStrategy(stock);

	// set up a simulator to host the strategy
	Simulator simulator = new SimpleSimulatorBuilder()
		.withDepthUpdates(depthCaches)
		.useStrategyPlotter(
			new SimpleStrategyPlotter("tutorial on " + stock.symbol()))
		.build();
	// here is where the actual simulation happens
	TradeBlotter tradeBlotter = simulator.run(strategy);

	// collect all trades that happen during the simulation for post-trading analysis
	List executions = tradeBlotter.allExecutions();

First we convert our depth cache into the required format by the simulator. It takes an instance of DepthCaches (mapping Product to SequentialCache) as an argument to facilitate running simulations containing multiple products. In this case however there is only one product, so the DepthCaches object is created with only one pair.

Now we are ready to run the simulation. You will note I have also passed in a plotter, which creates a simple plot of the prices of our product and the P&L. Here is what this looks like (recall that we are running the strategy on monthly data):

Performance Measures

The simulation records its executions in an instance of TradeBlotter. From this we can compute performance measures. In this tutorial we look at PNL and annualized information ratio and omega.

	// compute the P&L
	ExchangeRateTable rates = new SimpleExchangeRateTable(Currencies.HKD);
	double pnl = new ProfitLoss().valueOf(executions, depthCaches, rates);

	// compute the information ratio/Sharpe ratio
	double initialCapital = dailyData.iterator().next().data().mid();
	double benchmarkPeriodReturn = 0.0;
	double ir = new InformationRatioForPeriods(initialCapital,
						   interval,
						   Period.years(1),
						   ReturnsCalculators.SIMPLE,
						   benchmarkPeriodReturn
	).valueOf(executions, depthCaches, rates);

	// compute the Omega
	double lossThreshold = 0.0;
	double omega0 = new OmegaForPeriods(initialCapital,
					    interval,
					    Period.years(1),
					    ReturnsCalculators.SIMPLE,
					    lossThreshold,
					    new OmegaBySummation()
	).valueOf(executions, depthCaches, rates);

Since AlgoQuant supports having products with different currencies in the same simulation, we need to pass in an exchange rate table which in this case only contains one currency. From this, the depth caches and executions we compute profit and loss.

For omega and information ratio we additionally need to pass in information about the timing of the calculation (length of a period, start and end date), as well as information specific to the measure. As you can see though, this also requires only a minimal coding effort.

Of course there are many other performance measures included in AlgoQuant and even those presented above can be used in different ways, by changing their period or other parameters. Another great use of measures within AlgoQuant is for ​dynamic strategy calibration: You can specify which measure best encompasses the belief that a strategy has been successful in order to find the best set of parameters.

Next Steps

In this tutorial I have only touched on the most basic aspects of designing and backtesting a strategy but of course there is plenty of scope within AlgoQuant to take this further: Because it is backed by SuanShu a powerful math library there are numerous tools available to design strategies based on complex statistical operations and due to its object oriented nature, every aspect can be easily extended, so that if you are ever in need of a custom simulator or an intricate performance measure, your ideas can be realized in a minimal amount of time.

A final point to mention is that once you have backtested your strategy and wish to deploy it, you only have to replace the simulated market component with a component for the real market in which you wish to trade. This is made easy by the fact that simulation in AlgoQuant works exactly like a real market, so that you do not need to modify your strategy at all (and hence risk introducing errors), but only write adapters to work with your broker and live data source.

I hope you will find this helpful when designing a strategy with AlgoQuant.

Maven

Maven

We do not include the javadoc files in the zipped package because Maven can automatically download it for you (when you need it) from our repository server. In NetBeans, you can also force it to download the javadoc by clicking the “Dependencies > suanshu-2.2.0 > Download Javadoc”:

Or, right click “Dependencies” and choose “Download Javadoc” for downloading the javadoc of ALL dependencies:

A little “J” means the javadoc is available offline. Then, by clicking “View Javadoc”, you can see the downloaded javadoc in your browser offline.

Eclipse also has similar functions:

Coding Tools

Coding Tools

To set up the coding environment for a new AlgoQuant project, please follow the following steps.

JDK

SuanShu and AlgoQuant are Java based code. Before we can code using the libraries, we need to install the latest Java Development Kit (JDK). If you skip this step, you can download it together with NetBeans in the next step.

NetBeans

NetBeans is our preferred IDE for Java programming. You may download and install JDK and then NetBeans. Or you can download “NetBeans with JDK” directly.

NetBeans can be downloaded from this link. If you have no Java programming experience, choose the one labeled “Java SE”.

Run the installer.

TortoiseSVN

Download TortoiseSVN.

Run the installer. More information on svn can be found in this wiki.

After installing TortoiseSVN, right click in Explorer in the empty space in the folder you want to put your project in. Click “SVN checkout” to check out project.

The following example checks out AlgoQuant. You will use the URL given to you instead. In most cases, you do NOT need to check out AlgoQuant as it will be automatically downloaded by Maven when you build your project.

Coding in NetBeans

Launch NetBeans. Open your project. You can right click on a package/folder to create a new Java class to start coding. If you are asked to modify AlgoQuant code, copy and paste the code in your project and do the editing there. Do NOT modify source code in AlgoQuant directly.

To build your project, right click on the project and hit “Clean and Build”. Alternatively, you can hit this button on the top bar.

To run your project, you need to create JUNIT test cases. We run our project by running the test cases. To create a JUNIT test case file, hit “CTRL+SHIRT+U”. This will create a test file for you where you will put your test cases. You can right click on the test file and run it – either in normal or debug mode.

Debugger

https://netbeans.org/features/java/debugger.html
https://netbeans.org/kb/docs/java/debug-visual.html

Commit Code

When you are done with coding a milestone, you can submit your code by committing code. Right click the project folder. Select “SVN Commit”.

Type in some meaningful message to let people know what changes and files you make and add. Click “OK” to commit.

Floating License Server

Floating License Server

For personal use, a user needs a valid license file (namely, numericalmethod.lic) to use SuanShu on his/her fixed machine. In case, the machines on which SuanShu is used are not fixed, floating licenses provide an alternative solution. This solution is suitable for a group of users working in the same organization, in which they share a predetermined number of licenses. Floating license is supported since version 3.7.0.

License Server

A predetermined number of floating licenses are managed by a dedicated license server. Users from any machine can connect to the server in order to obtain the licenses for using SuanShu.

To start the license server, under Windows, double-click the file start-floating-license-server.bat (or, run the script start-floating-license-server.sh under Linux). The script file is packaged with SuanShu distribution (see the file structure below).

suanshu-x.y.z
|   floating.server.conf
|   floating.user.conf
|   start-floating-license-server.bat
|   start-floating-license-server.sh
|   suanshu-x.y.z.jar
|
\---lib

Configuration

The port number used by the license server is 8080 by default. To change the port number, one can change the value by editing the configuration file floating.server.conf.

PORT = 8080

License

The license server itself needs a license file floating.server.lic (under the same folder as the SuanShu jar file) to run. Please contact our sales team to obtain the license file.

Run at Startup

License server can be configured to start at machine startup by the following steps:

  • Windows 7 or earlier versions
    1. Create a shortcut of the batch script by right-clicking the file and selecting “Create shortcut”.
    2. Click “Start” menu and locate “Startup”.
    3. Right-click “Startup” and select “Explore”.
    4. Copy and paste the created shortcut into the Startup folder.
  • Windows 8 or later versions
    1. Create a shortcut of the batch script by right-clicking the file and selecting “Create shortcut”.
    2. Press Windows key + R.
    3. Type “shell:startup” into the Run dialog, and press Enter.
    4. Copy and paste the created shortcut into the Startup folder.
  • Mac OS X
    1. Click “Apple” menu, and select “System Preferences”.
    2. Click “Users & Groups” icon, and click “Login Items”.
    3. Click “+” button at the bottom to add the .sh script file in SuanShu folder.
  • Linux
    1. Edit the file “~/.bash_profile”.
    2. Add a line to call “location_of_suanshu_folder/start-floating-license-server.sh” into the file, and save it.

Floating Users

A floating user with a valid floating numericalmethod.lic can use SuanShu on any machine (as long as it can connect to the license server).

Configuration

The IP address and the port number of the license server can be configured via the configuration file floating.user.conf.

SERVER_HOST = 127.0.0.1<br>SERVER_PORT = 8080

Note that the port number configured here must match the one used by the server.

License

Floating users also need special license file numericalmethod.lic (under the same folder as the SuanShu jar file). Such license file can be replicated to any machine. Please contact our sales team to obtain the license file.

Setup

Setup

AlgoQuant uses Maven for project management. To download and install the required libraries, you need to do an initialization step.

NetBeans

In NetBeans, open the parent project algoquant and click Build:

NetBeans will download all the required jar files to your local maven repository and run all the tests.

Reference: http://wiki.netbeans.org/MavenBestPractices

Eclipse

In Eclipse, import the parent project (choose File > Import > Maven > Existing Maven Project, then select the root directory of algoquant). Then, Eclipse may install the required maven plugins and restart.

After Eclipse restarts, you need to run Maven install for the parent project algoquant.

Eclipse will download all the required jar files to your local maven repository.

If there are errors shown in source files in algoquant-core, they may be due to the ignorance of Eclipse about the generated source code. Add the generated source folder:

References:

Command Line

If you have already installed Maven in your workstation, you can directly use command line interface to do the setup by typing the command:

> mvn install

at the outermost project folder. Having done the proper setup, you can now start coding with the AlgoQuant API.

Using AlgoQuant API via Maven dependency

Alternatively, you may use AlgoQuant API in your own project without downloading the whole zipped package. In your project POM, fill in our repository information in the section, then put a dependency in the section. Here is an example:



    4.0.0
    com.mycompany
    myproject
    1.0-SNAPSHOT
    jar
    
        UTF-8
        1.8
        1.8
    

    
        
            nm-repo
            Numerical Method's Maven Repository
            http://repo.numericalmethod.com/maven/
            default
        
    

    
        
            com.numericalmethod
            algoquant-core
            2.0.0
        
    

Your own code can now call the API from algoquant-core.

Link to a local AlgoQuant Project

After downloading, unzipping, and installing AlgoQuant, you can create your own Maven project, and link to the local algoquant-core to use the AlgoQuant API. In this case, you can also customize AlgoQuant by changing the code in your local copy.

This is a simple example POM to link your project to your local AlgoQuant:



    4.0.0
    com.yourcompany
    your-project-id
    1.0-SNAPSHOT
    jar
    
        2.0.0
    

    
        
            com.numericalmethod
            algoquant-core
            ${installed.algoquant.version}
        
    

Note: You have to install (or Clean and Build in NetBeans terminology) your local AlgoQuant again after changing the source code.

Configuration File

The default configuration file is algoquant/core/config/config.default.xml. If you would like to modify the settings (e.g., location of data files), you can edit the file data.properties in the same directory.

Alternatively, you can create your custom-made configuration folder and files as in folder, e.g. haksunli, and define the system property config in your Java environment, e.g., -Dconfig=haksunli/config.haksunli.xml in NetBeans IDE. You can put the configuration files in folder core/src/main/resources/config or any location in the classpath.

If you would like to run unit testing with a different config file, you need to set the property of the test goal (see figure).

Project License

All our software requires a license. For NetBeans users, when creating a new file in the project AlgoQuant, you may see this error in the first line of the new file.

Error reading included file Templates/Classes/../Licenses/license-NumericalMethod.txt

There are two options. You may choose to ignore them and delete this line each time you open a new file. Alternatively, you can comment out the following line in the project POM file (algoquant/pom.xml):

NumericalMethod