Overall Statistics Total Trades 164 Average Win 1.38% Average Loss -1.22% Compounding Annual Return 1.173% Drawdown 9.700% Expectancy 0.189 Net Profit 19.946% Sharpe Ratio 0.301 Loss Rate 44% Win Rate 56% Profit-Loss Ratio 1.14 Alpha 0.013 Beta -0.041 Annual Standard Deviation 0.033 Annual Variance 0.001 Information Ratio -0.411 Tracking Error 0.169 Treynor Ratio -0.242 Total Fees \$0.00
```#Create an investment universe consisting of several currencies (10-20). Use the latest OECD Purchasing Power Parity figure to assess the fair value of each currency
#versus USD in the month of publishing and then use monthly CPI changes and exchange rate changes to create fair PPP value for the month prior to the current month.
#Go long 3 currencies that are the most undervalued (lowest PPP fair value figure) and go short 3 currencies that are the most overvalued (highest PPP fair value figure).
#Invest cash not used as margin on overnight rates. Rebalance quarterly or monthly.

from datetime import datetime
import pandas as pd

class Currency_Value_Factor(QCAlgorithm):

def Initialize(self):
self.SetStartDate(2004, 1, 1)
self.SetEndDate(2019, 8, 1)
self.SetCash(100000)

self.currencies = [x for x in self.ppp_table.keys()]

for fx_pair in self.qc_available_pairs:

self.Schedule.On(self.DateRules.MonthStart('EURUSD'), self.TimeRules.AfterMarketOpen('EURUSD'), self.Rebalance)

def Rebalance(self):
if self.Time.month != 1: return

self.Liquidate()

currencies_data = {}
last_year_row = self.ppp_table.loc[self.Time.year - 1]

for currency in self.currencies:
currencies_data[currency] = last_year_row[currency]

sorted_currencies = sorted(currencies_data.items(), key = lambda x: x[1], reverse = True)
sorted_currencies = [x[0] for x in sorted_currencies]
top = sorted_currencies[:3]
low = sorted_currencies[-3:]

weight = 1/len(top + low)

for curr in low:
if curr == 'USD': continue  # USD currency excluded
fx_pair = curr + 'USD'

if fx_pair in self.qc_available_pairs:
self.SetHoldings(fx_pair, weight)
else:
fx_pair = 'USD' + curr
if fx_pair in self.qc_available_pairs:
self.SetHoldings(fx_pair, -weight)

for curr in top:
if curr == 'USD': continue  # USD currency excluded
fx_pair = curr + 'USD'

if fx_pair in self.qc_available_pairs:
self.SetHoldings(fx_pair, -weight)
else:
fx_pair = 'USD' + curr
if fx_pair in self.qc_available_pairs:
self.SetHoldings(fx_pair, weight)                        ```