Contributing
============

We welcome contributions to qfinbox! This document provides guidelines for contributing to the project.

Getting Started
---------------

1. **Fork the Repository**

   Fork the qfinbox repository on GitHub and clone your fork locally:

   .. code-block:: bash

       git clone https://github.com/yourusername/qfinbox.git
       cd qfinbox

2. **Set Up Development Environment**

   Install the development dependencies:

   .. code-block:: bash

       pip install -e .[dev]

3. **Create a Feature Branch**

   .. code-block:: bash

       git checkout -b feature/your-feature-name

Development Guidelines
----------------------

Code Style
~~~~~~~~~~

We use several tools to maintain code quality:

* **Black** for code formatting
* **isort** for import sorting
* **flake8** for linting
* **mypy** for type checking

Run these tools before submitting:

.. code-block:: bash

    # Format code
    black src/ tests/
    isort src/ tests/

    # Check linting
    flake8 src/ tests/

    # Type checking
    mypy src/

Or use pre-commit hooks:

.. code-block:: bash

    pre-commit install
    pre-commit run --all-files

Testing
~~~~~~~

Write tests for all new functionality:

.. code-block:: bash

    # Run tests
    pytest tests/

    # With coverage
    pytest tests/ --cov=qfinbox --cov-report=html

Documentation
~~~~~~~~~~~~~

Update documentation for new features:

* Add docstrings to all public functions and classes
* Follow NumPy/Google docstring style
* Update relevant .rst files in docs/
* Add examples for complex functionality

Commit Guidelines
-----------------

Use clear, descriptive commit messages:

.. code-block::

    feat: add portfolio optimization module
    fix: resolve numerical instability in VaR calculation
    docs: update risk management examples
    test: add tests for Monte Carlo simulation

Types of Contributions
----------------------

Bug Reports
~~~~~~~~~~~

When reporting bugs, please include:

* Clear description of the issue
* Minimal code example to reproduce
* Expected vs actual behavior
* Python version and dependencies
* Error messages and stack traces

Feature Requests
~~~~~~~~~~~~~~~~

For new features, please:

* Describe the use case and motivation
* Provide examples of the proposed API
* Consider performance implications
* Check if similar functionality exists

Code Contributions
~~~~~~~~~~~~~~~~~~

We welcome contributions in these areas:

**Risk Management**
* New risk metrics and models
* Stress testing frameworks
* Regulatory capital calculations

**Portfolio Optimization**
* Alternative optimization algorithms
* Multi-objective optimization
* Transaction cost modeling

**Financial Models**
* Options pricing models
* Fixed income analytics
* Credit risk models

**Data Integration**
* New data source connectors
* Data cleaning utilities
* Market data normalization

**Performance**
* Algorithmic improvements
* Caching mechanisms
* Parallel processing

Code Review Process
-------------------

1. **Submit Pull Request**

   Create a pull request with:

   * Clear title and description
   * Link to related issues
   * Summary of changes made
   * Testing performed

2. **Code Review**

   Maintainers will review for:

   * Code quality and style
   * Test coverage
   * Documentation completeness
   * Performance considerations
   * API design consistency

3. **Continuous Integration**

   All PRs must pass:

   * Unit tests
   * Code quality checks
   * Documentation builds
   * Example notebook execution

Documentation Standards
-----------------------

Docstring Format
~~~~~~~~~~~~~~~~

Use NumPy-style docstrings:

.. code-block:: python

    def calculate_var(returns: np.ndarray, confidence: float = 0.95) -> float:
        """Calculate Value at Risk using historical method.

        Parameters
        ----------
        returns : np.ndarray
            Array of historical returns
        confidence : float, default 0.95
            Confidence level for VaR calculation

        Returns
        -------
        float
            Value at Risk at specified confidence level

        Examples
        --------
        >>> returns = np.random.normal(0, 0.01, 1000)
        >>> var_95 = calculate_var(returns, 0.95)
        >>> print(f"95% VaR: {var_95:.4f}")
        95% VaR: -0.0163

        Notes
        -----
        This implementation uses the historical simulation method,
        which makes no assumptions about return distribution.

        References
        ----------
        .. [1] Jorion, P. (2007). Value at Risk: The New Benchmark
               for Managing Financial Risk. McGraw-Hill.
        """

Example Guidelines
~~~~~~~~~~~~~~~~~~

When adding examples:

* Use realistic but synthetic data
* Include full working code
* Add explanatory comments
* Show visualization when appropriate
* Provide interpretation of results

Release Process
---------------

qfinbox follows semantic versioning (SemVer):

* **Major** (x.0.0): Breaking API changes
* **Minor** (x.y.0): New features, backward compatible
* **Patch** (x.y.z): Bug fixes, backward compatible

Community Guidelines
--------------------

* Be respectful and inclusive
* Help newcomers get started
* Share knowledge and expertise
* Provide constructive feedback
* Follow the code of conduct

Getting Help
------------

If you need help:

* Check existing documentation and examples
* Search GitHub issues for similar problems
* Ask questions in GitHub Discussions
* Contact maintainers directly for urgent issues

Recognition
-----------

Contributors are recognized through:

* GitHub contributor list
* Release notes acknowledgments
* Documentation credits
* Conference presentations (with permission)

Thank You!
----------

Thank you for contributing to qfinbox! Your efforts help make quantitative
finance more accessible to the Python community.
