Hi all,

I would like to combine custom and quantconnect data in a custom data source. My use case: the KMLM ETF was issued End of 2020. I have more historical data from the underlying index. Therefore, I would like to combine both in a custom datasource that uses historical index data before 2021, and quantconnect data for the ETF after 2021-1-1. Since the algo trades a lot of different tickers, i would like to combine both data source into a single custom data source. 

Yet, I cannot figure out, how to access quantconnect data inside the custom data function. Here is my current approach. Any suggestions are highly appreciated:  

  1. import pandas as pd
  2. from datetime import datetime
  3. from AlgorithmImports import *
  4. class HybridKMLMXData(PythonData):
  5. def __init__(self):
  6. super().__init__()
  7. self.equity_symbol = Symbol.Create("KMLM", SecurityType.Equity, Market.USA)
  8. def GetSource(self, config, date, isLiveMode):
  9. source = "https://gist.githubusercontent.com/chrswrmr/3a7522de7c9429e6dc2c8d29627e6e33/raw/510aeeaa5dc64dbd2e59ee5138ac66edff9018ca/KMLMX_rev.csv"
  10. return SubscriptionDataSource(source, SubscriptionTransportMedium.RemoteFile)
  11. def Reader(self, config, line, date, isLiveMode):
  12. try:
  13. if not line.strip() or line.startswith("date"):
  14. return None
  15. parts = line.split(",")
  16. parsed_date = pd.Timestamp(parts[0])
  17. if parsed_date < datetime(2021, 1, 1):
  18. data = HybridKMLMXData()
  19. data.Symbol = config.Symbol
  20. data.Time = parsed_date
  21. value = round(float(parts[1]), 4)
  22. data.Value = value
  23. data.Close = value
  24. return data
  25. else:
  26. data = HybridKMLMXData()
  27. data.Symbol = config.Symbol
  28. data.Time = parsed_date
  29. try:
  30. equity_data = SubscriptionManager.GetDataPoint(self.equity_symbol, date, Resolution.Daily)
  31. if equity_data is not None:
  32. data.Value = equity_data
  33. data.Close = equity_data
  34. else:
  35. data.Value = float(parts[1]) # Fallback to CSV data
  36. data.Close = float(parts[1])
  37. except:
  38. data.Value = float(parts[1]) # Fallback to CSV data
  39. data.Close = float(parts[1])
  40. return data
  41. except Exception as e:
  42. print(f"Error processing data: {e}")
  43. return None
  44. class CustomDataAlgorithm(QCAlgorithm):
  45. def Initialize(self):
  46. self.SetStartDate(2020, 12, 1)
  47. self.SetEndDate(2021, 1, 31)
  48. self.SetCash(100000)
  49. # Only add the hybrid data source
  50. self.symbol = self.AddData(HybridKMLMXData, "KMLMX", Resolution.Daily).Symbol
  51. def OnData(self, slice):
  52. # Access KMLMX data
  53. data = slice.Get(HybridKMLMXData).get(self.symbol)
  54. if data:
  55. self.Log(f"KMLMX - Date: {data.Time}, Close: {data.Close}")
+ Expand

Author

Kryz

February 2025