Unity 2D Game Development, Implementing Parallax Background Implementing Parallax Scrolling Effect Using Multi-layer Background.

When developing a 2D game, the background is an important element that determines the atmosphere of the game. In particular, the Parallax effect provides viewers with a deep experience by allowing background elements to move at various depths. This article will explain in detail how to implement a Parallax scrolling effect using multilayer backgrounds in the Unity engine.

What is the Parallax Effect?

The Parallax effect is a technique that simulates depth by using visually different layers of background images. As users scroll or move the screen, each background layer moves at different speeds, creating a 3D effect. This visual effect can enhance immersion in gameplay.

Implementing Parallax Backgrounds in Unity

To implement a Parallax scrolling effect in Unity, several steps are needed. Here are those steps.

1. Project Setup

Create a new 2D project in Unity. Select the ‘2D’ template, enter a project name, and create it. Once the project is loaded, proceed to the next steps.

2. Prepare Background Images

Prepare the background images to be used for the Parallax effect. Divide the images into various layers according to depth. For example, you can divide them into the following layers:

  • Background Layer (furthest back)
  • Midground Layer (middle)
  • Foreground Layer (closest)

3. Import Images into Unity

Drag and drop the prepared images into the Project window in Unity. At this time, create sprites that match each background layer, and if necessary, adjust the ‘Pixel Per Unit’ value in the sprite settings to adjust the size of the background.

4. Arrange Background Layers

Create a new Empty GameObject in the Hierarchy window and name it “ParallaxLayer.” This GameObject will be the parent of all Parallax layers. Now place each background layer as a child of this GameObject.

5. Move Background Layers

The next step is to move the background layers according to user input. To do this, create a new C# script and name it “ParallaxController,” then write the following code.


using UnityEngine;

public class ParallaxController : MonoBehaviour
{
    public Transform[] layers; // Background layer array
    public float scrollSpeed = 0.5f; // Scroll speed
    public float depthMultiplier = 0.1f; // Movement speed ratio based on layer depth

    private float[] layerScales;

    void Start()
    {
        // Store the scale values of each layer
        layerScales = new float[layers.Length];
        for (int i = 0; i < layers.Length; i++)
        {
            layerScales[i] = layers[i].position.z;
        }
    }

    void Update()
    {
        float movement = Input.GetAxis("Horizontal") * scrollSpeed * Time.deltaTime;

        for (int i = 0; i < layers.Length; i++)
        {
            float parallaxEffect = movement * layerScales[i] * depthMultiplier;
            layers[i].position += new Vector3(parallaxEffect, 0, 0);
        }
    }
}

6. Apply the Script

Add the ParallaxController script written above to the ParallaxLayer GameObject. In the Inspector window, drag and drop each background layer into the layers array. This array will be used to adjust the position of each layer.

7. Test and Adjust

After setting up all the components, run the game to test the Parallax effect. You can adjust the scroll speed and depthMultiplier values to achieve the desired effect.

Advanced Features of the Parallax Effect

After implementing the basic Parallax scrolling, you may consider adding additional features such as:

1. Various Input Methods

In addition to keyboard input, you can use touch input on mobile devices or detect mouse movements to apply the Parallax effect. Here is the code for this.


void Update()
{
    Vector3 inputMovement = new Vector3(Input.GetAxis("Mouse X"), 0, 0); // Detect mouse X-axis movement
    float movement = inputMovement.x * scrollSpeed * Time.deltaTime;

    for (int i = 0; i < layers.Length; i++)
    {
        float parallaxEffect = movement * layerScales[i] * depthMultiplier;
        layers[i].position += new Vector3(parallaxEffect, 0, 0);
    }
}

2. Auto Scroll

Depending on the game's settings, you can also add a feature to automatically scroll the background. To do this, you can modify the Update method to move automatically in a specific direction.


void Update()
{
    float movement = scrollSpeed * Time.deltaTime;

    for (int i = 0; i < layers.Length; i++)
    {
        float parallaxEffect = movement * layerScales[i] * depthMultiplier;
        layers[i].position += new Vector3(parallaxEffect, 0, 0);
    }
}

3. Managing the Lifecycle of Background Objects

When backgrounds leave the screen, you may also consider creating new background objects or reusing existing objects. This can help manage resources efficiently.

Conclusion

In this post, we took a detailed look at how to implement Parallax backgrounds in Unity. The Parallax effect can enhance the depth of the game and increase player immersion. In addition to the basic implementation, various features can be added for more effective game development, and practicing will provide you with more ideas.

Use this method to develop your own unique 2D game. The Parallax effect will be a great help in maximizing the user experience.

Unity 2D Game Development, Simple Shader and Material for 2D Graphics that can be used with 2D Shaders and Materials.

Unity is a powerful tool for developing 2D games. In particular, shaders and materials in Unity are important elements that determine the visuals of the game. In this article, we will explore the concepts of 2D shaders and materials, how to set them up, and simple example code to understand how these elements work.

1. Understanding Shaders and Materials

1.1. What is a Shader?

A shader is the way in which the graphics card handles the rendering of 3D and 2D objects. In simple terms, a shader is program code that adds effects to textures or changes their colors. In Unity, shaders can mainly be divided into two types: Vertex shaders and Fragment shaders. In 2D games, Fragment shaders are primarily used for pixel-level processing.

1.2. What is a Material?

A material combines a shader and textures to apply to an object, defining the surface properties of each object. Without a material, a shader cannot be applied to an object. Therefore, materials can apply various effects of the shaders to objects.

2. Key Elements of 2D Shaders

2.1. Unity’s Basic Shaders

Unity has several built-in shaders. The shaders commonly used in 2D games are as follows:

  • Unlit Shader: Used for applying simple colors and textures that do not require lighting.
  • Sprites/Default: The standard shader for 2D sprites, which applies lighting effects.
  • Sprites/Diffuse: A sprite shader that adds the effect of light reflection on the surface.

2.2. Writing Custom Shaders

Creating custom shaders in Unity allows for more unique and varied visual effects. Here is a simple example of a 2D custom shader:

Shader "Custom/MySimpleShader"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata_t
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;

            v2f vert (appdata_t v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                return tex2D(_MainTex, i.uv);
            }
            ENDCG
        }
    }
    Fallback "Diffuse"
}

3. Setting and Applying Materials

After writing a shader, you create a material using it. A material is applied to an object by combining shaders and textures, and property values can be set to adjust the visual effects.

3.1. Creating a Material

The steps to create a material in Unity are as follows:

  1. Right-click in the project window of the Unity editor.
  2. Select Create -> Material.
  3. Click the created material and set the shader in the inspector. Select the Custom/MySimpleShader created in the current example.

3.2. Applying Textures to Materials

To apply a texture to a material:

  1. Select the material, then drag and drop the desired texture into MainTex in the inspector.
  2. Adjust the property values of the material to create the desired visual effect.

4. Applying Materials through Code

Materials can also be applied to game objects through scripts. The following code example shows how to apply a material to a specific sprite renderer.

using UnityEngine;

public class ApplyMaterial : MonoBehaviour
{
    public Material customMaterial;

    void Start()
    {
        SpriteRenderer spriteRenderer = GetComponent();
        if (spriteRenderer != null && customMaterial != null)
        {
            spriteRenderer.material = customMaterial;
        }
    }
}

5. Example of Applying Simple Shader Effects

The following is an example of a custom shader that implements a simple effect. This shader applies a texture to an object and can adjust its color.

Shader "Custom/ColorShift"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _Color ("Color", Color) = (1,1,1,1)
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata_t
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            fixed4 _Color;

            v2f vert (appdata_t v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 texColor = tex2D(_MainTex, i.uv);
                return texColor * _Color;
            }
            ENDCG
        }
    }
    Fallback "Diffuse"
}

6. Conclusion

In this article, we explored the concepts of 2D shaders and materials in Unity, how to set them up, and how to apply visual effects through simple example shaders. Unity is a powerful graphics engine that supports many types of shaders and allows users to create custom shaders for unique visuals. The use of these shaders enhances the overall quality of the game and provides players with a distinctive experience. Experiment to implement even more diverse shader effects. Unleash your creativity!

Automated trading using deep learning and machine learning, integration of real-time trading system with the trained model. The trained model executes trades in real-time by linking with the actual exchange API.

With the rapid changes in cryptocurrency, investors are seeking more efficient and faster trading strategies. Deep learning and machine learning can automate this process and serve as useful tools to support investment decisions. In this article, we will take a closer look at how to build a Bitcoin automated trading system using deep learning and machine learning, and how to integrate the trained model with exchange APIs to execute trades in real-time.

1. Overview of Automated Trading Systems

An automated trading system is software that automatically executes trades according to a specific algorithm. This system generates buy and sell signals through the analysis of historical data and predictive models, helping investors to react to the market in real time.

2. Technology Stack to Use

  • Programming Language: Python
  • Deep Learning Libraries: TensorFlow, Keras
  • Data Collection: CCXT (Cryptocurrency Exchange API Library)
  • Deployment Platforms: AWS, Google Cloud, or Local Machine

3. Data Collection

First, we need to collect price data for Bitcoin. For this, we can use the CCXT library to access the exchange API and retrieve the data.

3.1. Installing CCXT

pip install ccxt

3.2. Example of Data Collection


import ccxt
import pandas as pd
import time

# Create exchange object for Binance
exchange = ccxt.binance()

def fetch_data(symbol, timeframe, limit):
    # Fetch latest exchange data
    candles = exchange.fetch_ohlcv(symbol, timeframe, limit=limit)
    df = pd.DataFrame(candles, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])
    df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')
    return df

# Example: fetch Bitcoin data
btc_data = fetch_data('BTC/USDT', '1h', 100)
print(btc_data.head())
    

4. Data Preprocessing

The collected data must be transformed into a format suitable for model training. Common preprocessing methods include normalization, dimensionality reduction, and constructing time series data.

4.1. Data Normalization


from sklearn.preprocessing import MinMaxScaler

def normalize_data(df):
    scaler = MinMaxScaler(feature_range=(0, 1))
    df['close'] = scaler.fit_transform(df['close'].values.reshape(-1, 1))
    return df, scaler

btc_data, scaler = normalize_data(btc_data)
    

5. Model Configuration

Now, we will configure the deep learning model to train. The LSTM (Long Short-Term Memory) network is suitable for time series data analysis and is used for predicting Bitcoin prices.

5.1. Building the LSTM Model


from keras.models import Sequential
from keras.layers import LSTM, Dense, Dropout

def create_model(input_shape):
    model = Sequential()
    model.add(LSTM(50, return_sequences=True, input_shape=input_shape))
    model.add(Dropout(0.2))
    model.add(LSTM(50, return_sequences=False))
    model.add(Dropout(0.2))
    model.add(Dense(1))  # Price prediction
    model.compile(optimizer='adam', loss='mean_squared_error')
    return model

# Input data shape
X_train, y_train = # (Preparing selected data reset)
model = create_model((X_train.shape[1], 1))
    

6. Model Training

Train the configured model using the training data. To evaluate the model’s performance, monitor the loss function during the training process.

6.1. Example of Model Training Code


model.fit(X_train, y_train, epochs=100, batch_size=32)
    

7. Model Prediction

Use the trained model to predict Bitcoin prices. The predicted values will later be used for trading decisions.

7.1. Example Prediction Code


predicted_prices = model.predict(X_test)
predicted_prices = scaler.inverse_transform(predicted_prices)  # Convert back to original price
    

8. Implementing Trading Strategies

Implement a simple trading strategy that makes buy and sell decisions based on predicted prices. For example, you can set a rule to buy when the price rises and sell when it falls.

8.1. Example of Trading Strategy Code


def trading_strategy(predicted_prices, threshold=0.01):
    buy_signal = []
    sell_signal = []
    
    for i in range(1, len(predicted_prices)):
        if predicted_prices[i] > predicted_prices[i - 1] * (1 + threshold):
            buy_signal.append(i)
        elif predicted_prices[i] < predicted_prices[i - 1] * (1 - threshold):
            sell_signal.append(i)
    
    return buy_signal, sell_signal

buy_signal, sell_signal = trading_strategy(predicted_prices)
    

9. Integrating with the Exchange

Finally, integrate the trained model with the exchange API to execute real trades. Consider recording transaction histories and managing the portfolio for automated trading.

9.1. Integrating with Exchange API


import time

def execute_trade(symbol, amount, action):
    if action == 'buy':
        exchange.create_market_buy_order(symbol, amount)
    elif action == 'sell':
        exchange.create_market_sell_order(symbol, amount)

amount = 0.001  # Amount of Bitcoin
for i in buy_signal:
    execute_trade('BTC/USDT', amount, 'buy')
    time.sleep(1)  # Provide interval between API calls

for i in sell_signal:
    execute_trade('BTC/USDT', amount, 'sell')
    time.sleep(1)  # Provide interval between API calls
    

10. Conclusion

An automated Bitcoin trading system using deep learning and machine learning enhances investment efficiency by automating complex data analysis and decision-making. However, such systems do not guarantee 100% profits, and it is essential to establish appropriate risk management strategies considering market volatility.

Automated trading and portfolio optimization algorithm using deep learning and machine learning. Optimal portfolio composition targeting multiple cryptocurrency assets through deep learning.

In recent years, data analysis in the financial markets and the resulting automated trading systems have gained significant attention. In particular, the cryptocurrency market has become an interesting market for many investors due to its volatility. This course covers how to implement automated trading systems for cryptocurrencies and portfolio optimization algorithms using deep learning and machine learning techniques.

1. Concept of Automated Trading Systems

An automated trading system refers to a system that generates trading signals through computer programs and executes trades based on them. Such systems are appealing to many investors because they make trading decisions based on data-driven analysis rather than relying on human emotions or intuition.

2. Overview of Deep Learning and Machine Learning

Deep learning is a type of machine learning based on artificial neural networks, which automatically learns features from data to perform predictions or classifications. It shows outstanding performance, especially when combined with large amounts of data and high-performance computing power. Machine learning techniques can be used for price predictions of financial assets such as stocks, options, and futures.

2.1 Machine Learning Algorithms

There are various machine learning algorithms, among which several are introduced:

  • Linear Regression: Models the linear relationship between a dependent variable and one or more independent variables.
  • Decision Tree: A tree-structured model that creates decision rules to classify data.
  • Random Forest: Combines multiple decision trees to make more accurate predictions.
  • Support Vector Machine: A method that finds a hyperplane that maximally separates data distributions.
  • Artificial Neural Network: Mimics the human brain to learn complex patterns from data.

2.2 Deep Learning Algorithms

Deep learning uses algorithms such as:

  • Multi-layer Perceptron: A grid-structured model consisting of input, hidden, and output layers.
  • Convolutional Neural Network (CNN): A structure mainly used for image analysis, recognizing local patterns in hidden layers.
  • Recurrent Neural Network (RNN): A structure suitable for time series data that stores previous information in memory for future predictions.

3. Portfolio Optimization

Portfolio optimization is the process of determining the investment proportions across multiple assets to maximize returns and minimize risk. Deep learning and machine learning techniques greatly assist in solving these optimization problems.

3.1 Modern Portfolio Theory

Modern Portfolio Theory (MPT), developed by Harry Markowitz, aims to optimize asset allocation based on expected returns, volatility, and correlations. The goal of MPT is to construct a portfolio that provides the optimal return at a given level of risk.

3.2 Portfolio Optimization Using Deep Learning

The process of portfolio optimization using deep learning proceeds in the order of data collection, data preprocessing, model selection and training, and result evaluation.

4. Example Code

Below is a simple code example that performs portfolio optimization using Python.


# Import necessary libraries
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import yfinance as yf
from scipy.optimize import minimize

# List of cryptocurrency assets
cryptos = ['BTC-USD', 'ETH-USD', 'XRP-USD', 'LTC-USD', 'BCH-USD']

# Download data
data = yf.download(cryptos, start='2020-01-01', end='2023-01-01')['Adj Close']

# Calculate log returns
returns = np.log(data / data.shift(1))

# Define portfolio performance function
def portfolio_performance(weights):
    mean_return = np.sum(returns.mean() * weights) * 252
    portfolio_volatility = np.sqrt(np.dot(weights.T, np.dot(returns.cov() * 252, weights)))
    return portfolio_volatility, mean_return

# Define objective function
def min_fun(weights):
    return portfolio_performance(weights)[0]  # Minimize volatility

# Set constraints and boundaries
constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})
bounds = tuple((0, 1) for asset in range(len(cryptos)))

# Initial weights
initial_weights = [1. / len(cryptos)] * len(cryptos)

# Execute minimization
optimal_weights = minimize(min_fun, initial_weights, method='SLSQP', bounds=bounds, constraints=constraints)

# Output optimal weights
print("Optimal Weights: ", optimal_weights.x)
print("Maximum Expected Return: ", portfolio_performance(optimal_weights.x)[1])
print("Minimum Volatility: ", portfolio_performance(optimal_weights.x)[0])
    

Automated trading using deep learning and machine learning, time series forecasting using transformer models. Trading strategy utilizing transformer-based time series forecasting models.

In recent years, the cryptocurrency market has grown rapidly, attracting attention to various investment methods for cryptocurrencies, including Bitcoin. Among these, automated trading systems utilizing deep learning and machine learning technologies have gained significant popularity. This article will specifically discuss how to use the transformer model to predict Bitcoin time series data and develop trading strategies based on it.

1. Basic Concepts of Deep Learning and Machine Learning

Deep learning and machine learning are fields of artificial intelligence that involve algorithms that learn patterns from data to perform predictions or classifications. Machine learning primarily includes techniques that train models based on given data to predict outcomes, while deep learning has the ability to solve more complex and nonlinear problems using artificial neural networks.

2. Importance of Time Series Prediction

The prices of cryptocurrencies like Bitcoin include complex data that changes over time. This data is time series data, which plays a crucial role in predicting the future from past data. To make trading decisions in an unstable market, an efficient prediction model is necessary.

3. Overview of the Transformer Model

The transformer model was first introduced in the field of natural language processing (NLP) and has the advantage of being able to process the entire input sequence simultaneously. This makes it suitable for predicting future values using past time series data. The main components of a transformer are the attention mechanism and the multi-layer encoder-decoder structure.

3.1 Attention Mechanism

The attention mechanism allows each part of the input data to calculate how it relates to one another. By using this technique, one can dynamically assess how much each input value influences other input values.

3.2 Encoder-Decoder Structure

The encoder receives the input data and compresses its inherent meaning to pass it to the next stage. The decoder generates prediction values based on this inherent meaning. This structure is useful even in complex time series predictions.

4. Preparing Bitcoin Time Series Data

To train the model, it is necessary to collect Bitcoin’s time series data. Here, we will introduce the data preprocessing process using the pandas library in Python.

import pandas as pd
import numpy as np

# Load data
data = pd.read_csv('bitcoin_price.csv')  # Path to the CSV file containing Bitcoin price data

# Convert date to datetime format
data['Date'] = pd.to_datetime(data['Date'])

# Select necessary columns
data = data[['Date', 'Close']]

# Set index to date
data.set_index('Date', inplace=True)

# Handle missing values
data = data.fillna(method='ffill')

# Check data
print(data.head())

5. Building a Transformer Time Series Prediction Model

Now we will build a transformer model using the prepared Bitcoin price data. We will use the TensorFlow and Keras libraries for this purpose.

5.1 Defining the Transformer Model

import tensorflow as tf
from tensorflow import keras

def create_transformer_model(input_shape, num_heads, ff_dim):
    inputs = keras.Input(shape=input_shape)
    attention = keras.layers.MultiHeadAttention(num_heads=num_heads, key_dim=input_shape[-1])(inputs, inputs)
    x = keras.layers.Add()([inputs, attention])  # Skip connection
    x = keras.layers.LayerNormalization()(x)
    x = keras.layers.Dense(ff_dim, activation='relu')(x)  # Feed Forward Network
    x = keras.layers.Dense(input_shape[-1])(x)
    x = keras.layers.Add()([inputs, x])  # Skip connection
    x = keras.layers.LayerNormalization()(x)
    
    # Output layer
    outputs = keras.layers.Dense(1)(x)
    
    model = keras.Model(inputs=inputs, outputs=outputs)
    return model

# Create model
model = create_transformer_model(input_shape=(30, 1), num_heads=4, ff_dim=32)
model.compile(optimizer='adam', loss='mean_squared_error')

# Model summary
model.summary()

5.2 Data Preprocessing and Model Training

To train the transformer model, the data needs to be split into sequences of a fixed length.

def create_sequences(data, seq_length):
    sequences = []
    labels = []
    for i in range(len(data) - seq_length):
        sequences.append(data[i:i+seq_length])
        labels.append(data[i+seq_length])
    return np.array(sequences), np.array(labels)

# Set time series length
SEQ_LENGTH = 30

# Generate sequences
sequences, labels = create_sequences(data['Close'].values, SEQ_LENGTH)

# Split into training and validation sets
split_idx = int(len(sequences) * 0.8)
X_train, X_val = sequences[:split_idx], sequences[split_idx:]
y_train, y_val = labels[:split_idx], labels[split_idx:]

# Train model
model.fit(X_train, y_train, validation_data=(X_val, y_val), epochs=50, batch_size=32)

6. Building a Trading Strategy

Once the model is trained, a realistic trading strategy needs to be established. A basic trading strategy can be based on the following fundamental rules.

6.1 Generating Buy/Sell Signals

def generate_signals(predictions, threshold=0.01):
    signals = []
    for i in range(1, len(predictions)):
        if predictions[i] > predictions[i - 1] * (1 + threshold):
            signals.append(1)  # Buy
        elif predictions[i] < predictions[i - 1] * (1 - threshold):
            signals.append(-1)  # Sell
        else:
            signals.append(0)  # Hold
    return signals

# Generate predictions
predictions = model.predict(X_val)
signals = generate_signals(predictions.flatten())

# Check signals
print(signals[-10:])

7. Evaluating Results

Various methods can be used to evaluate the model's performance. For example, accuracy, precision, and recall can be calculated to measure the predictive power of the model. Additionally, the effectiveness of the strategy can be verified by evaluating the returns through actual trading.

7.1 Calculating Performance Metrics

def calculate_performance(signals, actual_prices):
    portfolio = 10000  # Initial investment amount
    for i in range(len(signals)):
        if signals[i] == 1:  # Buy
            portfolio *= (actual_prices[i+1] / actual_prices[i])
        elif signals[i] == -1:  # Sell
            portfolio *= (actual_prices[i] / actual_prices[i+1])
    return portfolio

# Calculate performance
final_portfolio_value = calculate_performance(signals, data['Close'].values[-len(signals):])
print(f'Final portfolio value: {final_portfolio_value}') //

8. Conclusion

An automated trading system for Bitcoin utilizing deep learning and machine learning can process complex time series data to perform predictions. In particular, the transformer model is a very effective tool for predicting future prices based on past data. However, due to the nature of the market, no model can guarantee perfect predictions, and risks must always be taken into account. Therefore, when using such models, it is crucial to formulate a comprehensive strategy alongside various risk management techniques.

The automated trading system using the transformer model described in this article is expected to continue to evolve. It is important to explore various strategies through data collection and processing, model training, and evaluation in order to build your own investment style.