Category: Axys


I have been approached many times over the years regarding portfolio accounting system conversions and projects brought about by startups, breakaway advisors, mergers of firms that use Advent Software products, and impending migrations away from Advent products. Each of these types of projects share similar requirements and know-how to extract, transform and load data from the source system into the destination system, but the requisite integration of portfolio accounting records from two different firms and datasets into a single dataset post-merger or acquisition is, by definition, at another level of complexity.

In initial conversations, it is not uncommon for firms to ask me if they can just do it themselves and the answer is … maybe.  If they have the necessary knowledge and skillset, they could, but the experience of doing it multiple times breeds competence, confidence, tools, and valuable insights, making future projects more turnkey.  At most of the firms I work with, the person asking me this question already has a job, and this isn’t it.

Unifying Portfolio Accounting Systems and Records

In portfolio accounting terms, merging companies together is about putting like with like, identifying both common and unique asset classes, security types and securities.   Reviewing this data carefully and making decisions about how you want things to appear in the merged environment creates the foundation for the work that needs to be done.  This process is much easier if one party can clearly be identified as the primary firm that the secondary party’s data is being merged into.

The most fundamental data to the project are the asset class and security type settings.  The differences in data here determine the overall complexity of the work required.  Assuming these data were identical, there would be little to do.  You could simply review the security master, find any ticker naming inconsistencies, and rename those securities.  You would still need to merge the prices, splits, groups, portfolios, performance, indexes, and composites, but the process would be relatively easy.

Unfortunately, it is usually not that simple.  You basically need to get the two systems to speak the same language through the process of reorganizing and renaming securities while maintaining the integrity of the portfolio accounting systems.  You may add, remove, or modify asset classes and security types in the merged environment, but you need to do it with the knowledge of what can be done and what you may be giving up in the new environment.  Most obviously, removing an asset class means that you won’t be able to update performance for that asset class any longer in the merged environment.  That may be okay if asset class performance isn’t in use.

Specific care must be taken not to invalidate performance records or transactions based on security type parameters.  Reclassing a security type as another asset class impacts historic performance.  Renaming a security and its security type can also invalidate performance history for the asset classes involved, unless performance history is regenerated with the new configuration afterwards.

Most of this article is written in reference to work that I have performed merging Axys datasets, but the work required for APX is very similar.  I skirt over certain areas of the process during my description in an effort to keep this blog under 2,500 words, since the purpose of this blog to shed light on the process involved and not necessarily to give readers an A-to-Z guide on how to do their own Portfolio Accounting merge project – though I suspect some may use it as such.

How to Merge Portfolio Accounting Records With Another Firm
I categorize the work required into the following phases:

  • Preparation: Backup, Profiles and Initial Assessment
  • Reorganization and Renaming
  • Merge
  • Validation

Preparation
There is no better way to get started on a project like this than making a backup of the systems involved prior to any work that you perform.  There are typically other backups being run on these systems, but I want to make sure I can restore systems to their original state prior to any work I do, and you should, too.  In an Axys environment, you should be able to simply zip the entire folder (e.g. f:\axys3) from Windows Explorer or run a PowerShell script command like this:

PowerShell
compress-archive -LiteralPath f:\axys3\ -DestinationPath f:\axys3\backup.zip -Force

As part of the preparation process, I typically create multiple partitioned workspaces.  In a recent job where there were already two Axys profiles for separate business lines, I created two additional profiles for my client during the merge project: one as the environment that I would transform to be like or compatible with the firm it would be merged into, and the other environment as the destination for the final merged portfolio accounting system.

As a result of this approach, the pre-merge profiles are all accessible after the merge is completed, and the client can easily test the results of the merge and verify that everything has been correctly merged before cutting over to the new environment.

I also export the INF files for each of the Axys profiles to be merged and do some automated comparisons between the files to help me determine how much work is involved in merging the environments.

Reorganization and Renaming
Reorganization is the crux of any merger project.  It is the reorganization of asset classes and security types itself that leads to much of the renaming, but some of the renaming takes place because it is required to eliminate security duplicates.  The phases are intended to be separate and distinct where you would finish one and not repeat it, but in practice the process within and between phases tends to be more iterative.

Asset Classes
There are no shortcuts here.  Ideally, my preference would be to leave it alone if possible. However, I realize that isn’t possible in all situations.  You may be able to avoid changing the asset class definitions of the firm you are merging data into, and you probably should, but you will likely need to change some of the asset class definitions in either the source or destination to accommodate the merge.

Security Types
As far as I know, you cannot import security types through IMEX, and that is probably a good thing.  I suspect I could figure out a way to force this, but it would be a bad idea.  Along with asset classes, the security type table is the heart of how your portfolio accounting system is organized. The definition of security types determines how each security type is treated in your portfolio accounting system.  Edits must be made manually, and some edits are not allowed.  If you are creating a security type that is a lot like another, you can speed the process by inserting a row and adding a copy of a previously defined security type.

Industry Groups and Industry Sectors
In order to merge security masters, you need to have already merged the industry group and industry sector files, because Advent won’t let you import a security with an invalid industry group or industry sector.  Merging isn’t quite the word for it, because you are unlikely to merge these tables like you would splits.  A more apt description of this merge process would be standardizing and/or reclassifying one set of securities to match the industry groups and industry sectors definitions defined by another profile.

Any changes made to the industry sectors in the target environment could impact the integrity of performance history by industry sector (if that data was generated in either of the source environments), and necessitate regenerating that performance history with the new industry sector definitions.

Renaming Securities
You will find that the reclassification of security types (e.g. efus fmagx versus mfus fmagx) forces you to rename the impacted securities.  Differences in the way firms may name symbols (e.g. swvxx versus swvx.x, ibm versus IBM, 34393t401 versus 34393T401) are also likely to create a slew of necessary renames.

Once again, there is no reason to create something to do this, because it already exists.  Renaming securities can be accomplished by running the process manually. That process works and is fine for a handful of securities, but when you want to rename dozens or hundreds of securities – never mind thousands, it just won’t do.  The real job here is to utilize the existing renaming capabilities through the use of a script, leveraging Advent’s chgsym command to do multiple security renames on each line of the script.

Merge

This is where it all comes together.  Once more, you can utilize basic script functions built into Axys and APX to efficiently merge certain files with minimal effort. Much of what is required can be automated. However, in some cases, it may be simpler to just do the work manually.


Prices
The exported price file formats for Axys and APX are simple enough that you could easily write something to merge price files, but you shouldn’t because that functionality already exists in Advent’s mergepri script command.  Instead, you create code to make a script to merge the necessary price files.  The mergepri command allows you to specify a destination and multiple sources.  The first source is the primary.  Prices in the first source file will not be overwritten by prices found in the secondary source files.

Splits
You could do this manually, but I have included some sample code to do it so you don’t have to.  The program works with exported CSV copies of firms split.inf files and creates a CSV file that must be imported into the merged Advent environment.

VB
' The MergeSplits subroutine and the functions it calls (IsRecordInFile
' & TruncateZeros) are used to merge two exported Advent Axys split.inf
' files into a single split file ready for import into a merged Axys
' environment.

' written in VBA by Kevin Shea (aka AdventGuru) & updated 02/24/2024

' Disclaimer: This routine works fine for the specific instance it was
' created for, but could need additional modifications for different
' circumstances.

Sub MergeSplits(SourceFile1 As String, SourceFile2 As String, DestinationFile As String)

Dim sf1 As Integer
Dim sf2 As Integer
Dim df As Integer
Dim Record As String

df = FreeFile
Open DestinationFile For Output As #df

sf1 = FreeFile
Open SourceFile1 For Input As #sf1

Do While Not EOF(sf1)

  Line Input #sf1, Record
  Print #df, TruncateZeros(Record, ",")

Loop

Close #sf1

sf2 = FreeFile
Open SourceFile2 For Input As #sf2

Do While Not EOF(sf2)

  Line Input #sf2, Record
  Record = TruncateZeros(Record, ",")
  If Not IsRecordInFile(SourceFile1, Record) Then Print #df, Record

Loop

Close #sf2
Close #df

Debug.Print "done."

End Sub

Function IsRecordInFile(SourceFile As String, RecordPassed As String) As Boolean

Dim ff As Integer
Dim RecordToCompare As String
Dim tempIsRecordInFile As Boolean
tempIsRecordInFile = False

ff = FreeFile

Open SourceFile For Input As #ff

Do While Not EOF(ff)

  Line Input #ff, RecordToCompare
  If TruncateZeros(RecordToCompare, ",") = RecordPassed Then
    tempIsRecordInFile = True
    Exit Do
  End If
  
Loop

Close #ff

IsRecordInFile = tempIsRecordInFile

End Function

Function TruncateZeros(SplitRecord As String, FieldSeparator As String)

Dim tempTruncateZeros As String
Dim ZeroEnd As Integer
Dim Cursor As Integer
Dim DecimalFound As Boolean
Dim SplitFields() As String

tempTruncateZeros = SplitRecord
DecimalFound = False
ZeroEnd = 0

SplitFields() = Split(SplitRecord, FieldSeparator)
'to standardize split records for comparison this routine gets rid of extra zeros that can exist in split records

If InStr(SplitFields(2), ".") > 0 Then DecimalFound = True
If DecimalFound Then

  For Cursor = Len(SplitFields(2)) To 1 Step -1
    If Mid$(SplitFields(2), Cursor, 1) <> "0" Then
      ZeroEnd = Cursor
      Exit For
    End If
  Next Cursor
  tempTruncateZeros = SplitFields(0) + FieldSeparator + SplitFields(1) + FieldSeparator + Left(SplitFields(2), ZeroEnd)
End If

If Right$(tempTruncateZeros, 1) = "." Then tempTruncateZeros = Left(tempTruncateZeros, Len(tempTruncateZeros) - 1)
TruncateZeros = tempTruncateZeros

End Function
Expand

The code above does a little more than just combine two files and remove the duplicates; it also truncates any trailing zeros in the split quantity to reduce the likelihood of duplicate split records. The same end goal could be achieved using one the most basic SQL queries – if the data for the split files was already loaded into tables as illustrated below.

SQL
SELECT SplitDate, SplitSymbol, SplitFactor from SplitSource1
UNION SELECT SplitDate, SplitSymbol, SplitFactor from SplitSource2
ORDER BY SplitDate;

This approach certainly looks more direct, but you would need to define the database tables properly. You would also need extract the data to bring it into the database, and store the results of the query file in one of the accepted file formats (TSV or CSV) to import it back into the system.

Dataport

Any redundant symbol (??sym.inf) and account (??act.inf) translation tables need to be merged (e.g. vsact.inf and vssym.inf); a similar approach to the merging of the splits can be used here, but these files are already in fixed text format, so they don’t need to be exported.

After merging the translation tables you may find that you need to update selected interface account number labels. For example, if you needed to create Schwab $vsact labels for newly merged portfolios using the values from existing $csact portfolio labels, and retain the $csact label, you could accomplish that in a few minutes by using the following REPLANG code to produce a script to perform the label updates.

REPLANG
outfile f:\axys3\auto\addvslab.scr n
load cli
.addlabel -files $:file.cli -labelrec \$\vsact,$csact\n
$csact ?
next cli
fclose

Please note, this is something that works in Axys that would not work in APX since the addlabel script command is not a valid APX script command. In APX, you would post the new label through the trade blotter.

Security Masters

You need to update the security master by merging the unique records from the secondary firm into the primary firm, and then import the new security master into the merged profile.  If the security master imports without errors, you are ready to move on to the simpler aspects of the merge. I do this through code I have written for this specific to merging security records, and do an import with a full replace, but it could potentially be done manually or through the use of IMEX’s optional import of unique records.

 

Portfolios, Groups, Performance, Indexes and Composites

It is worth mentioning that Advent has a script command mergecli that merges portfolios, but that’s not applicable here.  That command only merges portfolios from the same database, but it can be a useful tool to aggregate portfolios for other purposes.

If you have performed the previous steps, the now-standardized data for portfolios, groups, performance, indexes, and composites can be copied to the container with the other merged records, but you may need to rename some of these objects and any objects with dependencies if any of the names are redundant with the environment you are merging them into.  For example, if a portfolio (code) was already in use, you would need to rename the portfolio itself, its performance records, and the occurrence of that portfolio in any groups.

 

Validation

When the previous phases are complete, you are finally ready to verify and eventually validate the results.  Initially, this can be done quickly by spot-checking various reports and portfolios.  If you find issues, you may need to revisit the previous phases, make fixes, and rerun processes that you have already created to merge the files again.  When you reach a higher level of confidence about the merged set of data, you should reconcile consolidated appraisals from each of the systems.  If you have made significant changes to asset classes and/or their underlying securities, you may need to regenerate performance history and validate that, too.

 

How long does it take?

Surprisingly, these projects can go very quickly if key personnel make themselves available to do their part.  Those folks need to be able to tell you how they want things organized and be ready to participate in the validation process.  So long as key personnel motivated, the process can go as fast as they want it to go.

In the past few months, I have done a couple of these projects.  The jobs themselves were very similar; one was done over three months – not by any means a rush job.  I did the other one in less than two weeks, but I probably could have completed the work in less than a week if we needed to.

In my opinion, the relative size of the databases doesn’t significantly add to or subtract from the amount of time or work required.  Either way, you are performing the same processes.  In other words, it isn’t about how much data there is; it is about the processes you run to make one set of data ready to be merged into the other.

 

How much does it cost?

Prices for this service are all over the map.  When firms merge, they tend to be somewhat price-insensitive regarding the cost of certain things they deem critical to the merger.  One firm I talked with a few years back told me they paid 100k to merge their portfolio records after a recent merger, and they didn’t bat an eye at it. Another firm I am familiar with was given a quote for 40k by a competitor.  To me, these quotes sound like someone throwing spaghetti at the wall to see if it sticks.  In the latter case, I charged a justifiable premium for my expertise and was still able to do the work easily for less than half of what they were originally quoted.

In closing, there are many other data types that may need to be merged depending on how your firm uses Advent, such as extended data, FXs, FFXs, and factors, but the purpose of the blog is to explain what is involved in a typical portfolio accounting system merger. While some may be tempted to do this on their own, I don’t think anyone that has asked me to assist them with the process of merging portfolio accounting records has ever regretted it.


Kevin Shea Impact 2010

About the Author: Kevin Shea is the Founder and Principal Consultant of Quartare; Quartare provides a wide variety of technology solutions to investment advisors nationwide.

For details, please visit Quartare.com, contact Kevin Shea via phone at 617-720-3400 x202 or e-mail at kshea@quartare.com.

I have said it before, and I’ll say it again: if Advent does well, it follows that someone like me should do well, too.  I profit directly from Advent customers when they hire me, and indirectly when companies that provide services to Advent customers hire me.  That said, there is a certain amount of Advent’s dysfunction that helps my business.  In short, I offer what Advent cannot and/or does not want to provide to their customers, and many of my customers hire me specifically because I do not work for Advent.

 

Steeplechase race in 1912, Celtic Park, N.Y., through water

On the other hand, there is a limit to what is reasonable.  If Advent proverbially lights their hair on fire and jumps off a tall building, that is not good for me or my business. With thirty-five years of experience dealing with Advent, acting as an advocate to clients, I have seen some absurd things and have a high tolerance for some of it, but even I will occasionally find myself flummoxed.  It pains me to say so, since I really want Advent to succeed… at least enough that they aren’t losing business to competitors without good reason.  That is bad for their business and mine.

Advent Options

If you are to believe the natural progression of things as they are presented to the masses, it follows that some Axys customers who are frustrated by its limitations can be better served by Black Diamond or APX.  From what I have seen personally, Advent hasn’t had great success moving Axys customers to Black Diamond.  I have seen a few good Axys clients go Orion and Tamarac, but I have yet to see one of my clients go to Black Diamond successfully. This is not meant as a criticism of Black Diamond – it’s just an observation that my typical clients haven’t found the complete solution they are looking for in Black Diamond.

For those firms where Axys is no longer the answer and Black Diamond cannot meet their expectations, APX may offer a viable upgrade path.  Aside from its cost, APX has always been a relatively easy upgrade choice for Axys users to make because it is an Advent option that supports the legacy of Axys, which includes knowledge of portfolio management and performance fundamentals, transactions, processes, reporting, and scripts.  That means that when those customers move to APX, much of the reporting, infrastructure and established workflows can remain the same.

In short, APX offers everything that Axys does, plus the benefits of an Enterprise/SQL server platform.  The incremental learning required for operations staff to go from Axys to APX is very manageable, and things pretty much work like they did in Axys.

Among APX offerings, I know of at least five possible permutations:

  1. APX Self-Hosted on Premise
  2. APX Self-Hosted in the Cloud by a Third Party
  3. APX Dedicated with AOS
  4. APX Dedicated without AOS
  5. APX Multi-Tenant (hosted by Advent)

I have listed these APX environment options in order of my personal preference, based on specific experience with all of the options and the ease with which one can effectively manage, integrate, automate, and enhance systems. From my perspective, the first two options clearly give you the greatest degree of control and autonomy over your own systems. Choosing one of the other three options puts you in a place where Advent is enforcing various controls over your system – good and bad. Firms that have always had complete control over their systems and want to continue to do so should bristle at the very idea of this.

Advent’s Dedicated Hosting Service for APX Users

One that is used to hosting their own APX system on premise might think that hosting via Advent’s dedicated environment would be nothing but a boon, but reality quickly shatters that dream for savvy, hands-on APX users. Advent’s value add here is clearly AOS, but if that is the case, why would they ever sell someone dedicated hosting without the AOS service?  When they do that, the Dedicated Hosting service provided is arguably no better than what a third-party vendor can deliver.  Oh, wait, that’s not true.  It is potentially worse, because the system will be locked down in such a way that you won’t be able to do the things you would be able to do if your APX hosted environment was provided by a third-party resource that needed to make sure you were satisfied with their service.

This is because, without an AOS resource, some things that a firm would want to do to automate and enhance their systems simply cannot be done because they fall under the responsibility of the AOS silo.  You can call Advent support all you want, but they cannot resolve your problem, because only AOS can do these things.

Want to schedule a process to run at a certain time?  You can’t do that.  Do you want to install a third-party product?  You can’t do that.  Do you want to log into the server directly?  You can’t do that either. All of these things are only possible with the cooperation of an assigned AOS resource.   And even if you have an AOS resource, you still cannot do those things, but instead must ask your AOS resource. 

A fitting analogy for comparing the work required in their locked-down environment to what one might otherwise do in a self-hosted environment could be comparing the 100-yard dash to steeplechase.  As a result, the automation that you may create is more likely to resemble a Rube Goldberg machine than a typical streamlined process due to Advent’s forced assistance and rules regarding what can and cannot be done. 

 

Unfortunately, as you invite a higher degree of involvement from Advent vis-à-vis Advent’s dedicated (a.k.a. “managed”) hosting model, you lose control of the systems you are entrusted to manage and improve unless you had the foresight to have Advent agree upfront to the access rights required or are willing to spend countless hours dickering with Advent about the rights, which may ultimately end in frustration anyway.  This comment is not based on my direct experience with these systems alone, but also what I have heard amongst my peers.

Advent basically has the keys to the kingdom in this scenario, and the users are at the mercy of Advent. It’s almost plausible that they cannot allow you access to certain areas of the system that you usually have, but at the end of the day, when you cannot easily perform work that you were able to do in the past when you self-hosted APX, it feels much more like a ruse intended to ensure that Advent gets not just what clients have agreed to pay them, but any other work you might want to perform in the environment related to automation.

However, the problem is that they cannot necessarily perform the same work of a contractor with specific experience Advent may lack.  From my perspective, Advent’s focus in their Dedicated Hosting seems to be maintaining the status quo, not constantly striving to build a better mousetrap to service your business processes.  That is the directive I am looking for from my clients.

Anyone that can’t envision how Advent could consume their money, time, and resources while providing this service to them may lack experience working with Advent, or the imagination necessary to take their own client experiences with Advent and extrapolate the possibilities once Advent has a greater degree of control over their systems.  The frustration this arrangement creates can be amplified if the firms facing this entanglement are committed to long-term, bajillion-dollar contracts.  These large, multi-year contracts could be part of the reason Advent feels comfortable repeatedly saying the one word my clients never want to hearno.

Over the years, Tamarac, Orion, Addepar and Ridgeline have all made inroads to capture market share from what was once predominantly Advent’s business to keep or lose, and they will continue to do so until Advent makes improving its rapport with clients a priority.  You may have already guessed, but Advent’s worst enemy and biggest threat to the future of their business may be Advent’s hubris, and winning the WatersTechnology Buy-Side technology award for the Best Portfolio Accounting Provider two years in a row is unlikely to change that.  Even so, if you have deep pockets and are truly ready to hand the reins over to Advent, you may be happy with the results.

 


Kevin Shea Impact 2010

About the Author: Kevin Shea is the Founder and Principal Consultant of Quartare; Quartare provides a wide variety of technology solutions to investment advisors nationwide.

For details, please visit Quartare.com, contact Kevin Shea via phone at 617-720-3400 x202 or e-mail at kshea@quartare.com.

After Labor Day, summer is effectively over for investment professionals. Most executives and senior staff of financial services firms return to the office from vacations recharged and ready to go. Next week, they may need to tap that extra energy if they have to cope with the conversion of TD Ameritrade accounts to Schwab accounts. Schwab Advisor Center will be temporarily unavailable from September 2nd at 2am ET through September 5th at 5am ET while they complete the integration between Schwab and TD Ameritrade.

Earlier this summer, Schwab stopped generating transactions and positions, as well as other files that were scheduled to be sunset. Schwab gave customers over a year of warning that this change was coming. However, I cannot help wondering how difficult it would have been to keep generating those files, or better yet, refer those customers to me directly for assistance. Schwab wasn’t interested in doing either. As a result, customers that were impacted may still need to update or change systems that were dependent on those data feeds for daily workflows in order to process the transactions and positions data received after 07/11/23.

 

 

Creating Price Files Compatible with Advent Products

When I blogged about Schwab ending support for legacy price and transaction files around this same time last year, I didn’t know if I would be willing to create a translation utility to take Schwab CRS transaction files and convert them to Advent’s CS transaction files.  Writing the utility for prices was relatively simple by comparison.  I collected a one-time service fee from customers, and in turn facilitated their ability to keep their pricing workflow intact through the use of that utility. The utility processes CRS security files (CRSyyyymmdd.SEC) to create CS price files (CSmmddyy.PRI). Once the CS files have been created, they show up in Dataport as they always have in the past.

I felt good about the fact that I was able to help those customers in very tangible way with little effort on my part.  If you haven’t read the blog, you can find it here.  In short, the blog details the issue at the time, some possible solutions, and warns users that the conversion of transactions will be a larger and more costly issue to address.  At that time, I was not committed to writing a transaction conversion utility.

I have included a rudimentary VB code sample below to translate Schwab’s newer CRS SEC file to the legacy CS PRI Advent format required by some users:

 

VB
Sub CreatePriceFile(Folder As String, FileDate As Date)

'This subroutine converts Schwab CRS files to Advent's
'naming convention (CSmmddyy.PRI) and file format to be
'compatible with Axys and Dataport.  This is the same format
'that was provided via the Schwab Point-to-Point interface.

'Once this routine has been run on a CRSyyyymmdd.SEC file, 
'Dataport will recognize and be able to convert these files
'as it did prior to Schwab turning off the feed. 

' written in VBA by Kevin Shea (aka AdventGuru) & updated 08/30/2023

' Disclaimer: This routine works fine for the specific instance it was
' created for, but could need additional modifications for different
' circumstances.

On Error GoTo CPErrorHandler

dim Fields() as string
Dim Spaces, OutfileFH, IngestFH As Integer
Dim Record, Price, RawPrice, CUSIP, SType, Ticker, AssetIs As String
Dim SourceFilename, DestinationFilename As String

SourceFilename = "CRS" + Format(FileDate, "YYYYMMDD") + ".SEC"
DestinationFilename = "CS" + Format(FileDate, "MMDDYY") + ".PRI"

OutfileFH = FreeFile
Open Folder + DestinationFilename For Output As #OutfileFH

IngestFH = FreeFile
Open Folder + SourceFilename For Input As #IngestFH

Do While Not EOF(IngestFH)

  Line Input #IngestFH, Record

  If Left$(Record, 2) = "D1" Then
  'Only process the detail records.
  'Ignore header "H1" and summary "T1" records.
 
    Fields = Split(Record, "|")
    'This is a great VB command that splits the contents of the record and puts
    'it into an array.  For example, fields(0) contains the value of first field
    'in the record, fields(1) contains the value of the second field and so on.
     
    'Assign the fields to named variables we need to build the price file, which
    'makes the code easier to read later.

    Ticker = Trim$(Fields(9))
    AssetIs = Trim$(Fields(6))
    CUSIP = Trim$(Fields(11))
    SType = Trim(Fields(8))
    Spaces = 9 - (Len(SType) + Len(Ticker))

    'Remove the leading zeros from the price field value.
    'May not be absolutely necessary, but we do it anyway.
    'You might be tempted to use the replace statement here
    'instead, but that would have unattended consequences.
    'We are only removing the leading zeros.

    For x = 2 To Len(Fields(34))
      If Mid$(Fields(34), x, 1) <> "0" Then
        Price = Right$(Fields(34), Len(Fields(34)) - (x - 1))
        Exit For
      End If
    Next x
  
    'Ignore securities if they are derivatives.
    'If a ticker exists use that.
    'Otherwise, assume we need to use the CUSIP.

    If AssetIs <> "DERV" Then
      If Trim$(Ticker) = "" Then
        Spaces = 12 - (Len(SType) + Len(CUSIP))
        Print #OutfileFH, SType + Left$(CUSIP, 8) + Space(Spaces) + Price
      Else
        Spaces = 11 - (Len(SType) + Len(Ticker))
        Print #OutfileFH, SType + Trim$(Ticker) + Space(Spaces) + Price
      End If
    End If
  
  End If
Loop

Close #IngestFH
Close #OutfileFH

Debug.Print "Price file " + DestinationFilename + " built from " + SourceFilename + "."
Log ("Price file " + DestinationFilename + " built from " + SourceFilename + ".")

Exit Sub

CPErrorHandler:

'Nothing happens here, but some logging.
Log "An error occurred in the sub (CreatePriceFile)"

End Sub

Sub Log(LogMessage As String)

Dim LF As Integer
LF = FreeFile
Open Application.ActiveWorkbook.Path + "\SPTP_Price_File_Translator_Log_" + Format(Date$, "MMDDYYYY") + ".txt" For Append As #LF
Print #LF, Format(Date$, "MM/DD/YYYY") + " " + Format(Time$, "HH:MM:SS") + " " + LogMessage

Close #LF

End Sub

 

CRS Transaction File Translation

As the July 2023 deadline imposed by Schwab approached, some of the users I assisted with the CRS Price File Translator reached out to me to see if I was going to create a tool to address it. Eventually, I agreed to do it in July.  Working from samples of the first customer’s historic CS transaction files (CSmmddyy.TRN) and the newer Schwab CRS transaction files (CRSyyyyddmm.TRN), I was able to map over fifty different types of transactions and build a tool to convert the CRS files provided by Schwab into the format compatible with Advent and Dataport. 

There is some redundancy in Schwab’s transaction mappings.  Schwab seems to create a distinct transaction code and mapping for more transactions than necessary. For example, there are at least six different types of dividend mappings and similarly at least three different ways that they categorize a check that was written.  My goal in writing the translator was to preserve the information and create a file nearly identical to what Schwab has been generating for several years.

 

The CRS Position File

When I agreed to create the conversion utility for transaction files, I failed to realize that I would also have convert the position files so that users can continue to utilize the Schwab Reconciliation Report in Advent. So I created the position translator gratis.  While analyzing the file I found that Schwab has two different record types encoded in their CRS RPS files. The first block of records appears to be non-cash assets.  The second block of records are cash-only. Those records start with “D1” and “D2” respectively.

Those familiar with Schwab’s cash types may already know that they have nearly twenty different types of “cash” that get baked into the position files.  The CRS RPS file has the asset value for these various cash types for each account stored in a single record, which means that we needed to read the cash records from the CRS file and create multiple records in the CS file.  Conversely, the non-cash records are translated into a single record in the CS file we created.

The tool has been used to convert the transactions and positions from 07/12/23 forward.  It is now being used in day-to-day operations at that firm.  There have been a small number of mapping issues we needed to fix, but overall, the CRS Translator – which now creates CS PRI, TRN and RPS files – is working well.  In the past week, I signed up a few additional customers for the service and expect to hear from more potential customers due to the upcoming Schwab/TD Ameritrade (TDA) work scheduled for Labor Day weekend.

 

What is going to happen to AD files currently generated by TD Ameritrade?

Apparently, Schwab will stop providing similarly constructed legacy files to the TDA advisors.  My understanding is that those Schwab customers will receive CRS files populated with their data for the first time on 09/05/23.  They have been receiving empty files with headers alone to date. If their workflows have any dependencies on the old file formats, they will need to convert those files ASAP or make other changes to their systems to implement new workflows, such as ACD, so they can continue to download prices and transactions and reconcile positions in a timely manner.

 


About the Author: Kevin Shea is the Founder and Principal Consultant of Quartare; Quartare provides a wide variety of technology solutions to investment advisors nationwide.

For details, please visit Quartare.com, contact Kevin Shea via phone at 617-720-3400 x202 or e-mail at kshea@quartare.com.

 

With my long-standing history as a seasoned and impartial technology consultant catering to the wide-ranging needs of Advent users, it should come as no surprise that companies that have moved away from Advent call me to assist them if they have Advent specific needs after their agreements with Advent have lapsed.  In those specific cases, I suspect my independence from Advent is one of the most appealing features of my service, but many Advent users that have ongoing agreements with Advent also retain me to provide a level of service that Advent seems unwilling or unable to provide.

One of the things I get regular calls about is getting Axys running again.  These calls occur either when firms upgrade their servers or when firms that have moved on to competing Portfolio Management Systems dust off their old Axys files with hopes of tapping into Axys again.  My experience consulting to financial services firms using Advent Software for thirty-plus years facilitates my ability to resolve issues like these easily. 

Many of those calls I get start with the caller telling me, “We reinstalled Axys on the server and it isn’t working.”  And inevitably, this tells me more about the underlying issue than the caller ever could.  You certainly can reinstall Axys, but you probably don’t need to because Axys on the server is just a bunch of files that you access from another PC.  The most important thing to keep Axys working properly aside from the proper installation being done (at some point in the past) is making sure that users have all necessary rights to the shared folders.

This article is focused on explaining what the requirements are to empower you or your firm to resurrect Axys.  As usual, I’ll be providing a level of information in this piece that may be more than you need to solve any immediate problem with the hope that info is useful to you in the future.

Axys Versions

There are two fundamental versions of Axys: the multi-user version and single-user version.  To add a little confusion, the multi-user version is frequently referred to as the network version, but both fundamental versions are regularly installed on networks.  So, the network version is a bit of a misnomer.  Among these two fundamental versions, there is also the version of the software, which is at this point typically version 3.8, 3.8.5, 3.8.6 or 3.8.7.  In addition to these, there are also Monocurrency, Multicurrency and Variable Rate versions, to name a few.  Suffice to say, there are a lot of different versions.

Axys Licensing Model

The concurrent licensing model that Axys implements applies to both single-user and multi-user versions.  In both instances, the number of real Axys users typically exceeds the total licensed users, but having a multi-user version allows more than one user to use Axys simultaneously and adds certain multi-user features, such as user-specific settings and separate blotters, et cetera.

Understanding How Axys is Installed

Initially, the single-user version is simpler to install because the primary program (Axys) and supporting programs (Dataport, Data Exchange, Report Writer, et al.) hypothetically only need to be installed once.  That would be true if there literally was only one user using the software on one PC.  In actuality, the single-user version of Axys and supporting programs get installed multiple times in a network environment. They need to be installed once for every user, albeit to the same destination for each user (e.g., F:\Axys3).

During the Axys install process, certain required files are copied to the user’s PC and/or profile and Axys creates registry keys in HKEY_CURRENT_USER\SOFTWARE\Advent.  The most critical Axys registry keys are stored in HKEY_CURRENT_USER\SOFTWARE\Advent\Axys\3.  Although there are several important Axys files, the firmwide.inf is perhaps the most crucial file.  In a single-user installation, this text file, which can be found in the root folder of Axys (e.g., F:\Axys3), details certain settings in use and where all of the other Axys files can be found.

The multi-user version must also be installed multiple times for users, but the initial Axys install varies.  You install it once to the network/primary destination folder (e.g., F:\Axys3) and then install it again for the rest of the users (e.g., F:\Axys3\users\kevin where a firmwide.inf file will be created).  Similar to the single-user version, the supporting programs such as Dataport, Data Exchange and Report Writer would also need to be installed if the user needs those, or if you are trying to make sure all of the users have access to all of the supporting apps. The same registry keys are used for the multi-user install as the single-user version, but the multi-user (a.k.a. network) version adds an additional critical file: the netwide.inf file.

Netwide.inf versus Firmwide.inf

These two files are closely related.  The netwide.inf file should only be found in the root Axys folder of a network install, but firmwide.inf files exist in both single-user and multi-user environments.  The multi-user version is designed to use the settings in the netwide.inf as the system default and have any settings in the firmwide.inf supersede the settings in the netwide.inf.  As a rule, you should never see a firmwide.inf in the root Axys folder of a network install.  You should also almost never see a netwide.inf file in the root of a single-user Axys installation.


A Recurring Axys Installation Bug

With regard to installing Axys, there is a rather annoying issue that has been going on for several years.  It seems that the Axys install will not recognize certain network locations and/or mapped drives.  The fix requires the following registry settings:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System]

“EnableLUA”=dword:00000001

“EnableLinkedConnections”=dword:00000001

Once those settings have been applied, the Axys install program will be able to find the mapped drives.  It seems to me that this is an issue Advent should have addressed a long, long time ago.

Understanding Those Axys Shortcuts and Corresponding Registry Entries

The working folder of the Axys shortcut needs to point to the appropriate folder for the firmwide.inf file.  That means that an Axys shortcut for a single-user version of Axys should have a “Start in” folder like F:\Axys3, whereas the multi-user version would have “Start in” folder like F:\Axys3\users\kevin.  Assuming the same install folder was used, the target for these shortcuts would be the same: F:\Axys3\Axys32.exe.  Likewise, the registry entries associated with Axys should match these settings.  When I am looking at a system, I can usually determine if Axys has been installed properly by looking for consistency between the shortcuts and the following registry entries: ExePath, NetPath and UserPath.

In summary, your Axys install is dependent on a few things: the files themselves, access to the location where they are stored and proper mapping to the location of those files in the registry, firmwide.inf and netwide.inf if applicable.  Hopefully, you can get things back online on your own, but if you need assistance with your Advent installation, reach out to me and I’ll do my best to assist you.


Kevin Shea Impact 2010

About the Author: Kevin Shea is the Founder and Principal Consultant of Quartare; Quartare provides a wide variety of technology solutions to investment advisors nationwide.

For details, please visit Quartare.com, contact Kevin Shea via phone at 617-720-3400 x202 or e-mail at kshea@quartare.com.